linux开发 | nfs挂载根文件系统失败、处理过程

NFS挂载根文件系统失败

[    5.552903] s5p-tvout s5p-tvout: hpd status is cable removed
[    5.563919] DBUG_PORT must not use AFC!
[    5.566436] VFS: Cannot open root device "nfs" or unknown-block(0,0)
[    5.572622] Please append a correct "root=" boot option; here are the available partitions:
[    5.580959] b300         3817472 mmcblk0 driver: mmcblk
[    5.586118]   b301          264759 mmcblk0p1
[    5.590363]   b302          264759 mmcblk0p2
[    5.594609]   b303          104412 mmcblk0p3
[    5.598855]   b304         3158463 mmcblk0p4
[    5.603103] b308         7761920 mmcblk1 driver: mmcblk
[    5.608314]   b309         7726620 mmcblk1p1
[    5.612547] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[    5.620924] Backtrace:
[    5.623235] [<c0034fb8>] (dump_backtrace+0x0/0x110) from [<c0501498>] (dump_stack+0x18/0x1c)
[    5.631629]  r6:00008000 r5:dfecc000 r4:c06f5b6c r3:00000002
[    5.637247] [<c0501480>] (dump_stack+0x0/0x1c) from [<c0501514>] (panic+0x78/0xf8)
[    5.644808] [<c050149c>] (panic+0x0/0xf8) from [<c0008f6c>] (mount_block_root+0x25c/0x2ac)
[    5.653034]  r3:00000002 r2:00000001 r1:dfc37f60 r0:c06464fa
[    5.658651] [<c0008d10>] (mount_block_root+0x0/0x2ac) from [<c0009010>] (mount_root+0x54/0x68)
[    5.667248] [<c0008fbc>] (mount_root+0x0/0x68) from [<c0009188>] (prepare_namespace+0x164/0x1bc)
[    5.675999]  r5:c00290c8 r4:c0731740
[    5.679535] [<c0009024>] (prepare_namespace+0x0/0x1bc) from [<c00084fc>] (kernel_init+0x128/0x170)
[    5.688474]  r5:c00083d4 r4:c0731500
[    5.692018] [<c00083d4>] (kernel_init+0x0/0x170) from [<c0058894>] (do_exit+0x0/0x5f0)
[    5.699915]  r4:00000000 r3:00000000
[    5.703452] Rebooting in 5 seconds..
[   10.743116] Restarting Linux version 2.6.35.7+ (fly@fly-vm) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #1 PREEMPT Mon Aug 9 08:31:45 CST 2021
[   10.743127]
[   10.758279] arch_reset: attempting watchdog reOK

启动失败log

uboot的启动参数及环境变量

uboot环境变量

处理思路:

uboot和系统移植课程中讲了制作文件夹格式的rootfs,然后通过设置bootargs让内核启动后直接通过nfs去挂载ubuntu中文件夹形式的rootfs。做这个实验出错,可能的原因有以下几个,大家要仔细检查分析,看你的问题出在哪里。
(1)首先要确保你的开发板和ubuntu是通的。办法是在开发板中先进入uboot命令行,设置合理的IP地址后,从uboot端能ping通虚拟机ubuntu。其次还要确保ubuntu的nfs服务器搭建是ok的,并且有本地测试过可以成功挂载,测试方法在搭建nfs服务器的文档中有讲的。最后,如果还是害怕这里远端挂载有问题,可以先给开发板完整刷机,在开发板端启动linux挂载烧录的rootfs,启动进入linux命令行,再用mount -t nfs去挂载虚拟机ubuntu中的文件夹形式rootfs,确保能挂载。这时候肯定就排除了虚拟机不通或者nfs server不对的情况了。
(2)开发板端运行的kernel zImage必须使能了nfs格式的rootfs选项,这个是在make menuconfig中去配置使能的,我们在课程中专门讲过这个,而且课件里还提供了使能配置的路径。仔细看课程,跟着课程配置使能即可。
(3)我们讲课时用的ubuntu14.04,现在很多同学是用更新版本的ubuntu。这里可能会有一个问题,就是ubuntu16.04(也可能是17.04)后默认支持的nfs版本号更新了,和我们开发板使用的内核中的nfs版本号对不上,会导致挂载失败。如果你用的是新版本ubuntu,参考这篇文章来解决即可:https://blog.csdn.net/sean_8180/article/details/81112520
(4)bootargs中ip=xxx这一段里的网卡名称应该设置为eth0,而不是ubuntu里的ens33这类名称。网上有些解读说这里是主机的网卡名,但是实际测试发现还是写成开发板端侧的网卡名eth0才可以成功dhcp分配到IP,才能nfs挂载成功,设置成ens33反而不行。

最终解决办法:

nfs挂载根文件系统,最终定位到是编译的内核没有支持nfs方面的支持。
出现这个问题的原因是,使用make menuconfig配置了内核支持nfs功能,但最终编译配置文件没有支持。
在实际编译中,我使用./mk脚本运行帮助编译。
脚本主要的内容:1.配置内核;2.编译内核;3.将编译好的内核拷贝到指定目录。
配置内核时,脚本调用命令如下:

QT_KERNEL_CONFIG=x210ii_qt_defconfig
make ${QT_KERNEL_CONFIG} || return 1

也就是x210ii_qt_defconfig这个配置覆盖掉我自己配置的.config文件,导致我自己配置的内核是不成功的。
所以,这个操作的每一个流程、细节,需要熟悉,知其所以然,才能避免此类问题。

拓展:

嵌入式Linux启动过程中的问题积累
Linux通过nfs挂载根文件系统失败

编译busybox

如何使用busybox编译和生成最简linux根文件系统(rootfs)

如何使用BUSYBOX编译和生成最简LINUX根文件系统(ROOTFS)

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值