LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3058|回复: 2

根文件系统如何去掉只读

[复制链接]
发表于 2008-3-12 20:15:42 | 显示全部楼层 |阅读模式
mount貌似mount了两次根,一次是ro,而另一次是rw
我试过remount rw,但是都是无法写入。请看操作及结果。

Linux (none) 2.6.14-3wen #83 Tue Mar 11 23:47:11 CST 2008 armv4tl unknown

root@(none) $ mount
rootfs on / type rootfs (rw)
/dev/root on / type yaffs (ro)
none on /proc type proc (rw,nodiratime)

root@(none) $ mount -o remount,rw /

root@(none) $ mount
rootfs on / type rootfs (rw)
/dev/root on / type yaffs (ro)
none on /proc type proc (rw,nodiratime)


root@(none) $ mount -o remount,rw /dev/root
root@(none) $ mount
rootfs on / type rootfs (rw)
/dev/root on / type yaffs (ro)
none on /proc type proc (rw,nodiratime)

root@(none) $ pwd
/

root@(none) $ touch a
touch: a: Read-only file system


启动信息

yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
block 3336 is bad
VFS: Mounted root (yaffs filesystem) readonly.
Freeing init memory: 96K
init started: BusyBox v1.8.2 (2008-03-09 18:16:24 CST)
starting pid 679, tty '': '/etc/init.d/rcS'
Cannot run '/etc/init.d/rcS': No such file or directory

Please press Enter to activate this console.


VFS: Mounted root (yaffs filesystem) readonly.
这里有没有办法去掉readonly?
我已经修改了内核的代码,去掉了根分区的 mask_flags: MTD_WRITEABLE
但是还是这样。
 楼主| 发表于 2008-3-12 23:15:00 | 显示全部楼层

备注一下

跟入内核,发现第一次mount返回了 -EACCES, 然后加上了 MS_RDONLY 标记重试才能mount上
为何用可写方式sys_mount会出现-EACCES的错误?


269 static int __init do_mount_root(char *name, char *fs, int flags, void *data)
270 {
271     int err;
272     /* add for debug */
273     printk("mounting root, root_device_name: %s\n", root_device_name);
274     printk("s_flags = %ld, flags = %d, MS_RDONLY = %d.\n",
275             current->fs->pwdmnt->mnt_sb->s_flags,
276             flags,
277             MS_RDONLY);
278
279     err = sys_mount(name, "/root", fs, flags, data);
280     if (err)
281         return err;           (第一次mount失败,返回给mount_block_root,然后那边加上RDONLY重试)
282
283     sys_chdir("/root");
284     ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
285     printk("VFS: Mounted root (%s filesystem)%s.\n",
286            current->fs->pwdmnt->mnt_sb->s_type->name,
287            current->fs->pwdmnt->mnt_sb->s_flags & MS_RDONLY ?
288            " readonly" : "");
289     return 0;
290 }
291
292 void __init mount_block_root(char *name, int flags)
293 {
294     char *fs_names = __getname();
295     char *p;
296     char b[BDEVNAME_SIZE];
297
298     get_fs_names(fs_names);
299 retry:
300     for (p = fs_names; *p; p += strlen(p)+1) {
301         int err = do_mount_root(name, p, flags, root_mount_data);
302         switch (err) {
303             case 0:
304                 goto out;
305             case -EACCES:      (第一次mount走这个流程)
306                 printk("mount_block_root name:%s fs:%s flags:%d failed, retry do_mount_root read-only.\n", name, p, flags);
307                 flags |= MS_RDONLY;
308                 goto retry;
309             case -EINVAL:
310                 continue;
311         }
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-3-13 00:47:59 | 显示全部楼层

继续跟

发现好像是yaffs驱动的问题
do_mount path_lookup: dir=/sys, retval = 0
s_sb_mount dev=sysfs, retval = 0
do_new_mount dev_name = sysfs, retval = 0
mount_root, root_device_name = mtdblock3.
mounting root, root_device_name: mtdblock3
s_flags = -1073741824, flags = 32768, MS_RDONLY = 1.
do_mount path_lookup: dir=/root, retval = 0
s_sb_mount dev=/dev/root, retval = 0
do_new_mount dev_name = /dev/root, retval = -13
mount_block_root name:/dev/root fs:yaffs flags:32768 failed, retry do_mount_root read-only.
mounting root, root_device_name: mtdblock3
s_flags = -1073741824, flags = 32769, MS_RDONLY = 1.
do_mount path_lookup: dir=/root, retval = 0
s_sb_mount dev=/dev/root, retval = 0
yaffs: dev is 32505859 name is "mtdblock3"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.3, "mtdblock3"
block 3336 is bad
do_new_mount dev_name = /dev/root, retval = 0
VFS: Mounted root (yaffs filesystem) readonly.
do_mount path_lookup: dir=/, retval = 0
s_sb_mount dev=., retval = 0
do_move_mount dev_name = ., retval = 0
Freeing init memory: 100K
init started: BusyBox v1.8.2 (2008-03-12 20:38:15 CST)
starting pid 689, tty '': '/etc/init.d/rcS'
3wen s3c2410 ARM9 board started !!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表