在linux内核加载NFS文件系统时, 有时候会遇到一个错误:
VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 52K
Warning: unable to open an initial console.
文件系统无法加载。在网上搜索下会发现,遇到此问题的人比比皆是,但是能真正去解决的很少。普遍的解决办法,就是手动在文件系统创建console节点:
cd /dev
mknod -m 660 console c 5 1
mknod -m 660 null c 1 3
再次运行系统,大部分时候是可以正常加载的。
若在编译kernel的时候,选择了Devfs,那么,内核在加载文件系统的时候,会去创建console节点。
看看内核的源代码,在init模块的main.c的函数static noinline int init_post(void)中,会去检查这个console节点,没有的话,则可能会去创建
sys_mknod("/dev/console",0660 | S_IFCHR,mknoddev(5,1));
那么,为什么会创建失败呢?找了许久,终于发现和NFS的设置有关。我的原来的NFS配置/etc/exports如下:
/nfsroot *(rw,sync,no_subtree_check)
这样的配置,若/nfsroot里面,/dev/console节点存在,就没有任何问题,文件系统可以正常加载,也可以正常读写。
不过注意下,会发现,kernel mount的文件系统,用户名为nobody。后来更改了NFS的设置,取消了对root用户的管制,如下
/nfsroot/ *(rw,sync,no_root_squash)
这样,再次尝试,会发现此时kernel能正常的mount文件系统了,也在/dev/console下正常创建console节点了。
不过还发现一个小问题,就是似乎rootfs文件系统,首次创建的时候,kernel去mount,还是不能成功的创建console节点,而在失败后,再次运行,就可以了。这是为什么呢?查找了下,终于发现,原来和我的文件系统有关系。首次创建的文件系统里面,没有/dev这个文件夹,这样首次创建console的时候就失败了。但内核在mount文件系统的时候,除了创建console,还在创建一些其他的设备节点及文件夹在/dev下,这个过程中,会生成/dev这个文件下。所以首次加载文件系统虽然失败了,但是生成了/dev这个目录,这样,下次再次加载文件系统,就可以成功的创建console节点,并加载文件系统了。
阅读(3363) | 评论(0) | 转发(0) |