目录
引言
今天在辅导学生实验时遇到一个奇怪的问题,x210实验箱在启动Linux时频繁报告“Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)”错误,并不断重新启动。刚开始以为是内核的问题,重新烧写了内核,还是存在问题。又重新烧写了文件系统,问题依旧。下面记录一下解决问题的方法。
错误分析
相同启动过程中出现如下错误:
[ 20.524222] FIMC0 registered successfully
[ 20.528064] FIMC1 registered successfully
[ 20.532028] FIMC2 registered successfully
[ 20.534801] <6>S5PC1XX TVOUT Driver, (c) 2009 Samsung Electronics
[ 20.541474] s5p-tvout s5p-tvout: hpd status is cable removed
[ 20.552511] DBUG_PORT must not use AFC!
[ 20.555022] VFS: Cannot open root device "(null)" or unknown-block(0,0)
[ 20.561471] Please append a correct "root=" boot option; here are the available partitions:
[ 20.569815] b300 3866624 mmcblk0 driver: mmcblk
[ 20.574968] b301 264495 mmcblk0p1
[ 20.579214] b302 264495 mmcblk0p2
[ 20.583460] b303 105798 mmcblk0p3
[ 20.587706] b304 3207946 mmcblk0p4
[ 20.591953] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[ 20.600200] Backtrace:
[ 20.602629] [<c0034fb8>] (dump_backtrace+0x0/0x110) from [<c050653c>] (dump_stack+0x18/0x1c)
[ 20.611038] r6:00008000 r5:dfecc000 r4:c06ffb6c r3:00000002
[ 20.616653] [<c0506524>] (dump_stack+0x0/0x1c) from [<c05065b8>] (panic+0x78/0xf8)
[ 20.624333] [<c0506540>] (panic+0x0/0xf8) from [<c0008f6c>] (mount_block_root+0x25c/0x2ac)
[ 20.632441] r3:00000002 r2:00000001 r1:dfc37f60 r0:c064efba
[ 20.638056] [<c0008d10>] (mount_block_root+0x0/0x2ac) from [<c0009010>] (mount_root+0x54/0x68)
[ 20.646658] [<c0008fbc>] (mount_root+0x0/0x68) from [<c0009188>] (prepare_namespace+0x164/0x1bc)
[ 20.655401] r5:c00083d4 r4:c073bb40
[ 20.658940] [<c0009024>] (prepare_namespace+0x0/0x1bc) from [<c00084fc>] (kernel_init+0x128/0x170)
[ 20.667882] r5:c00083d4 r4:c073b900
[ 20.671423] [<c00083d4>] (kernel_init+0x0/0x170) from [<c0058894>] (do_exit+0x0/0x5f0)
[ 20.679318] r4:00000000 r3:00000000
[ 20.682858] Rebooting in 5 seconds..
[ 25.722580] Restarting Linux version 2.6.35.7 (root@ubuntu) (gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) ) #2 PREEMPT Mon Jan 14 13:55:33 CST 2019
[ 25.722591]
[ 25.737831] arch_reset: attempting watchdog reOK
U-Boot 1.3.4-dirty (May 21 2016 - 18:17:00) for x210
根据日志分析,系统在启动时无法挂载根文件系统(rootfs),导致内核恐慌。但是重新烧写了文件系统之后仍然出现问题就让人怀疑U-Boot中关于根文件有关的参数有问题。
解决方法
此问题通常由错误的启动参数或内核驱动缺失导致,优先检查 root=
参数、文件系统驱动及存储设备初始化状态。
打印了该开发板的U-Boot环境参数。
x210 # printenv
bootcmd=movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000
mtdpart=80000 400000 3000000
bootdelay=3
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
ipaddr=192.168.1.88
serverip=192.168.1.102
gatewayip=192.168.0.1
netmask=255.255.0.0
对比了正常启动的开发板的U-Boot参数。
x210 # printenv
mtdpart=80000 400000 3000000
bootdelay=3
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
ipaddr=192.168.1.88
serverip=192.168.1.102
gatewayip=192.168.0.1
netmask=255.255.0.0
bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
bootcmd=movi read kernel 30008000; bootm 30008000
对比之后发现,出问题的开发板少了bootargs参数,导致在加载文件系统时不知道到哪里去寻找。
在U-Boot中执行以下命令:
setenv bootargs "console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3"
saveenv
然后重新启动开发板,一切正常了。
结语
这个问题比较少见,应该是保存环境变量的地方出现了错误,正确恢复环境变量就可以工作了。