本文假设参照
一文对SD卡进行分区,然后试图从SD加载EXT3文件系统。但是,在加载过程中会有如下报错:
.......
VFS: Cannot open root device "179:2" or unknown-block(179,2)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
首先,先确保你的SD卡没有写保护。如果写保护了,也有可能造成上面的输出。
其次,修改Uboot的bootargs。修改内容如下:
U-Boot> setenv bootargs noinitrd root=179:2 rw
rootdelay=3 rootfstype=ext3 console=ttySAC0
其实就是增加rootdelay这个参数,该参数的目的是让根文件系统的加载时间推迟3秒。
推迟3秒是为了让sd卡能够先初始化完毕,让后再从sd卡加载文件系统。
So之所以内核会panic就是因为sd卡都没有初始化,还要让内核去sd卡加载文件系统,怎么可能加载成功。
那么怎么可以推断出是因为根文件系统的加载早于sd卡的初始化,所以造成内核panic的呢?
来看下正常情况下,根文件系统位于nandflash中,内核从nandflash加载yaffs2根文件系统,同时,SD卡已插入卡槽中。
给开发板上电,我们看下输出信息:
....
yaffs: dev is 32505856 name is "mtdblock0"
yaffs: passed flags ""
yaffs: Attempting MTD mount on 31.0, "mtdblock0"
block 419 is bad
block 420 is bad
block 421 is bad
block 423 is bad
block 424 is bad
block 425 is bad
block 426 is bad
VFS: Mounted root (yaffs filesystem).
Freeing init memory: 104K
mmc0: card is read-write
mmcblk0: mmc0:5996 SD02G 1921024KiB
mmcblk0: p1 p2
starting udev...kjournald starting. Commit interval 5 seconds
EXT3 FS on mmcblk0p2, internal journal
EXT3-fs: recovery complete.
EXT3-fs: mounted filesystem with ordered data mode.
done
....
我们可以看到,内核首先加载了根文件系统yaffs,然后才加载了sd卡。
因此,如果不推迟根文件系统加载的时间,sd卡根本得不到初始化的机会。
最后,我们看下加入rootdelay参数后的输出情况。
...
Waiting 3sec before mounting root device...
mmc0: card is read-write
mmcblk0: mmc0:5996 SD02G 1921024KiB
mmcblk0: p1 p2
kjournald starting. Commit interval 5 seconds
EXT3 FS on mmcblk0p2, internal journal
EXT3-fs: recovery complete.
EXT3-fs: mounted filesystem with ordered data mode.
VFS: Mounted root (ext3 filesystem).
Freeing init memory: 104K
starting udev...done
...
从上面的输出来看,内核推迟了3秒加载根文件系统,先加载了SD卡,然后挂载了ext3文件系统。
参考文档:
http://hi.baidu.com/xuxin_813/item/5fdab053022280c9d58bacff