unable to open initial console 问题的分析与解决

    在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节点,并加载文件系统了。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(778) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值