简介:
本文主要介绍一种nfs挂载失败的情况,即在根文件系统中dev文件下没有设置console和null节点。如果你的文件系统中没有这种情况,这篇文章可能对你帮助不大。不过我也会将我在查找这个问题时碰到的一些其他情况进行说明。
Linux内核:linux-3.4.2
所用开发板:JZ2440 V3(S3C2440A)
BusyBox : v1.20.0
声明:
本文是看完韦东山老师的视频后所写的课程总结,同时文中也会加入一些我自己对这方面知识的理解。希望可以帮到你们。
制作好根文件系统:
首先提醒大家的还是制作好根文件系统,我是直接使用韦东山老师提供的内核映像文件和根文件系统,而该内核映像uImage为Linux-3.4.2的内核,而根文件系统是使用busybox自己搭建的。这里我要先说明我的情况,我使用韦东山老师提供的内核和yaffs的根文件系统下载到我的开发板上可以启动内核并可以成功的启动根文件系统。但是当我使用nfs网络文件系统时却出现了错误。错误代码为:
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
1f00 256 mtdblock0 (driver?)
1f01 128 mtdblock1 (driver?)
1f02 2048 mtdblock2 (driver?)
1f03 259712 mtdblock3 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
Backtrace:
[<c000c434>] (dump_backtrace+0x0/0x10c) from [<c02f2c70>] (dump_stack+0x18/0x1c)
r7:00008000 r6:c3a21000 r5:fffffffa r4:c381df18
[<c02f2c58>] (dump_stack+0x0/0x1c) from [<c02f2cf0>] (panic+0x7c/0x1d0)
[<c02f2c74>] (panic+0x0/0x1d0) from [<c03c6d98>] (mount_block_root+0x180/0x23c)
r3:00000000 r2:c3844628 r1:c381df18 r0:c0366fd4
[<c03c6c18>] (mount_block_root+0x0/0x23c) from [<c03c6edc>] (mount_root+0x88/0x108)
[<c03c6e54>] (mount_root+0x0/0x108) from [<c03c7058>] (prepare_namespace+0xfc/0x194)
r7:c040fa40 r6:c040faa0 r5:c03df138 r4:c03df144
[<c03c6f5c>] (prepare_namespace+0x0/0x194) from [<c03c63f4>] (kernel_init+0x170/0x1c4)
r6:00000008 r5:c03de90c r4:c03e3558
[<c03c6284>] (kernel_init+0x0/0x1c4) from [<c001a034>] (do_exit+0x0/0x76c)
看到上面的错误信息后,我就去网上搜这类型的错误,结果发现各种原因引起的错误都有,我试了各种方法还是没有找到错误的原因,因此我的系统还是没有启动。这时我想老师提供的内核和根文件系统应该不会有错啊,所以我就认真的过了一遍自己的操作步骤,结果还真发现了问题。当我使用老师提供的根文件系统解压的时候出现了下面的错误信息:
上面提示的信息显示:文件系统中dev目录下的console节点和null节点不能创建,所以我去dev目录下检查了一下,发现居然没有这两个节点,因此我自己手动加入这两个节点:
当我加上这两个节点后就可以成功的挂载nfs网络文件系统了。所以这里提醒各位要注意你操作中的每个步骤,一个很小的错误将在后面影响到整个系统。
同时建议大家先在试试是否可以手动挂载,如果可以手动挂载,那么对于排查自动挂载将容易很多。
挂载nfs根文件系统时应该注意的部分:
这里我列举一些在挂载nfs中可能出现的错误,希望可以对大家有所帮助。
1. 首先还是要确认内核的信息与busybox的版本信息,同时确定内核与根文件系统使用的是统一gcc编译。或者更详细一些,编译内核所使用的gcc要与编译busybox的gcc相同。同时根文件系统中lib库中包含的就是交叉编译的中的lib文件。我想可能有些人会使用其他人的内核去加载自己编写的根文件系统,这时可能就会有这样的问题。
2. 确定u-boot,Linux服务器和window三者可以ping通,我想这个是一定要检查的部分,如果网络不可以用,那么nfs网络文件系统自然就不可以用了。
3. 确认在Linux服务器端已经启动了nfs服务,因为nfs为c/s模式(客户/服务器)的。所以如果服务器没有设置好,你将不可以从服务器端获得根文件系统。你可以在Linux服务器中使用nfsstat命令来查看nfs的状态。
4. 确认在服务器端的etc/exports中添加了根文件启动的路径。并设置相应的权限,并重启nfs服务:
5. 确保根文件的完整,如果你要确保有韦东山老师最小根文件系统中所有的各个文件以及节点设置。而构建最小根文件系统的步骤可以参考:Linux根文件之系统制作流程
6. 正确的设置bootargs:bootargs参数是十分灵活的,同时也可以对各种形式的根文件系统进行加载设置,所以设置好bootargs参数是成功挂载nfs的关键。而很多同学出现错误就是出在没有设置好bootargs参数,或者设置bootargs参数是因为粗心出错。这里我例举了其中设置nfsroot的模式:
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>
而我以自己的bootargs参数为例:
set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=192.168.1.112:/work/nfs_root/fs_mini_mdev_new_digitpic ip=192.168.1.110:192.168.1.112:192.168.1.1:255.255.255.0::eth0:off
其中对于串口的设置时要添加波特率:115200 。不然输出的内容容易乱码。
最后还是建议大家要细心一些,其实好多时候我们的错误不是因为不会而是因为粗心。
参考文献:
NFS挂载那些事
U-boot的环境变量: bootcmd 和bootargs
Linux根文件之系统制作流程