Linux常见问题之YAFFS2文件系统

在移植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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值