在移植linux文件系统时,常常出现yaffs2文件挂载错误,为了方便后续调试和问题定位,将此前调试过程中遇到的问题进行描述并说明解决方式;
问题1:VFS: Cannot open root device "mtdblock1" or unknown-block(0,0)
前情提要:启动配置参数为 g console=ttyS0,115200 maxcpus=1 init=/linuxrcrw root=/dev/mtdblock1 rootfstype=yaffs2
原因分析:在启动参数中,指明从mtdblock1中读取文件系统,而错误打印中unknown-block(0,0)表示没有找到此分区,所以是OS在启动时,没有创建对应分区造成的错误
解决方式:创建对应分区(有三种方式进行创建)
手动配置创建,即在nandc的初始化中,自主规定分区信息并创建
1、手动设置分区信息,并在nandc的probe中进行初始化
基于pmon的set变量中 mtdparts 的信息进行创建
1)需要确认OS的启动log中Kernel command line的信息,是否有mtdparts的配置
2)需要确认OS中有没有设置CONFIG_MTD_CMDLINE_PARTS
3)需要确认OS的nandc驱动中,mtd的name是否与mtdparts中的一致,如都是nand-flash
2、基于dts中nandc的子节点信息进行创建
1)需要确认OS中有没有设置CONFIG_MTD_OF_PARTS
2)需要确认dts中有没有设置分区
以上方式可能是组合使用,需要确认分区地址信息是否有重叠
问题2:VFS: Cannot open root device "mtdblock1" or unknown-block(31,1)
前情提要:启动配置参数为 g console=ttyS0,115200 maxcpus=1 init=/linuxrcrw root=/dev/mtdblock1 rootfstype=yaffs2
原因分析:从这里的打印信息来看,unknown-block(31,1)表明分区是没有问题的,已经识别了,主设备号是31,分区号为1,只是识别不了文件系统,
可能原因1:文件设备类型和指定的类型对不上
可能原因2:内核不支持指定的文件系统
我这里烧入的就是yaffs2的文件系统,所以原因是内核没有支持yaffs2文件系统
解决方式:在内核里进行配置:File System->Miscellaneous filesystems->yaffs2
问题3:not syncing: Requested init /rootfs/linuxrcrw failed (error -2).
前情提要:启动配置参数为 g console=ttyS0,115200 maxcpus=1 init=/linuxrcrw root=/dev/mtdblock1 rootfstype=yaffs2
原因分析:可能原因1:编译文件系统时,lib库下面的动态库不完整
可能原因2:指定的启动文件路径不对
可能原因3:分区的驱动有问题,导致读到的信息不对
我这里大概率是原因3,需要走读下代码,重新编译
解决方式:确认是驱动代码问题,将驱动问题解决后,此问题解决
问题4:Starting init: /sbin/init exists but couldn't execute it (error -8)
前情提要:1、启动配置参数为 g console=ttyS0,115200 maxcpus=1 root=/dev/mtdblock1 rootfstype=yaffs2 mtdparts=nand-flash:64M@0(kernel),448M@64M(rootfs),-(nandebug)
2、[ 110.737974] Creating 3 MTD partitions on "nand-flash":
[ 110.751654] 0x000000000000-0x000004000000 : "kernel"
[ 110.832379] 0x000004000000-0x000020000000 : "rootfs"
[ 110.969298] 0x000020000000-0x000040000000 : "nandebug"
[ 111.114016] nand : probe success
...
[ 132.461542] yaffs: dev is 32505857 name is "mtdblock1" ro
[ 132.474473] yaffs: passed flags ""
[ 298.206455] VFS: Mounted root (yaffs2 filesystem) readonly on device 31:1.
[ 298.227396] devtmpfs: mounted
[ 300.057382] Freeing unused kernel memory: 832K
[ 300.068207] This architecture does not have kernel memory protection.
[ 300.083129] Run /sbin/init as init process
[ 306.100003] Starting init: /sbin/init exists but couldn't execute it (error -8)
[ 306.142157] Run /etc/init as init process
[ 306.216007] Run /bin/init as init process
[ 306.231481] Run /bin/sh as init process
[ 311.989968] Starting init: /bin/sh exists but couldn't execute it (error -8)
[ 312.031559] Kernel panic - not syncing: No working init found.
原因分析:可能原因1:OS不支持执行此类型的文件
可能原因2:yaffs2文件的编译架构与OS的不相符(如OS是arm,文件系统是基于x86编译)
----------------
1、对比OS的.config文件,发现文件执行的宏都有打开;
2、思考到当前yaffs2文件是基于mips编译的,而OS是LA的,大概率是此问题
解决方式:重新编译基于LA架构的rootfs为yaffs2文件格式,重新测试,可以正常进去OS命令,此问题解决
问题5:VFS: Mounted root (yaffs2 filesystem) readonly on device 31:1.
devtmpfs: error mounting -2
Freeing unused kernel memory: 448K (ffffffff81870000 - ffffffff818e0000)
Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found.
前情提要:启动配置参数为 g console=ttyS0,115200 maxcpus=1 init=/linuxrcrw root=/dev/mtdblock1 rootfstype=yaffs2
原因分析:分析log,看到存在相应的mtd分区,无法执行相应的初始文件
可能原因1:分区的驱动有问题,导致读到的信息不对
可能原因2:驱动没问题,分区的信息有问题
我这里原因是2,因为在OS中添加了nor-flash对应的2个mtd分区,而通过os的启动log可以看到nor-flash的分区创建在前,
nand-flash在后,即此时启动参数中mtdblock1指向的nor-flash,所以有此问题;
解决方式:根据当前的OS创建分区的编号,找到指定的文件系统分区,重新指定启动参数:root=/dev/mtdblock3 rootfstype=yaffs2