ubifs根文件系统挂载失败可能原因

ubifs作为根文件系统挂载时,遇到了一些不同类型的错误,整理一下问题的排查思路

UBIFS (ubi0:0): Mounting in unauthenticated mode
UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 1054
ubi0 warning: ubi_io_read: error -74 (ECC error) while reading 126976 bytes from PEB 3:4096, read only 126976 bytes, retry
ubi0 warning: ubi_io_read: error -74 (ECC error) while reading 126976 bytes from PEB 3:4096, read only 126976 bytes, retry
ubi0 warning: ubi_io_read: error -74 (ECC error) while reading 126976 bytes from PEB 3:4096, read only 126976 bytes, retry
ubi0 error: ubi_io_read: error -74 (ECC error) while reading 126976 bytes from PEB 3:4096, read 126976 bytes

(1)首先检查linux内核读写nand是否正常
主要是检查linux内核的设备树、menuconfig里的nand设置是否正确。
要注意一点,能启动linux并不代表配置正确,因为uboot能正常读写nand就能启动linux内核。

有一个很好的验证方式,那就是换个文件系统(比如yaffs2、jffs)能正常读写nand,
那就说明linux内核的nand设置没有问题

(2)mkfs时,检查LEB设置是否正常,一般比PEB小两个页大小

(3)如果出现了第一次能挂载,但重启第二次挂载就失败,多半原因是mkfs时没有加-F参数,
具体原因google一搜便知,参考链接:
http://www.linux-mtd.infradead.org/faq/ubifs.html#L_free_space_fixup

(4)mkfs时,-c参数可以写大一点,不用纠结怎么计算,第一次ubi挂载后会自动计算

参考代码如下(页大小2KB,块大小128KB,总容量128MB):

> mkfs.ubifs -d rootfs -e 0x1f000 -c 2047 -m 0x800 -x none -F -o rootfs.ubifs

(5)ubinize时,若nand没有subpage,-s参数要写与页大小一样的值(或者干脆不填)
参考如下:

ubinize -o rootfs.img -m 0x800 -p 0x20000  ubinize.cfg

(6)uibinize时,其config文件不用填vol_size字段, vol_flags设为autoresize即可,
不用计算,非常方便。ubinize.cfg文件内容参考如下:

[ubifs]
mode=ubi
vol_id=0
vol_type=dynamic
vol_name=rootfs
vol_alignment=1
vol_flags=autoresize
image=rootfs.ubifs

(7)如果还是有问题,可以先用其它文件系统把linux启动起来,然后再使用mtd-utils
对nand进行ubiformat、ubiattach,mount进逐步排查,检查的参考步骤如下:
(一定要确保以下每一步骤均无错误)

> flash_erase /dev/mtd4 0 0
> ubiformat /dev/mtd4 -f rootfs.img
> ubiattach -p /dev/mtd4
> mount -t ubifs /dev/ubi0_0 /mnt
> cp /bin /mnt/ -r
> ls /mnt
> rm /mnt/* -r

如果这些步骤都没问題,且正常挂载、正常读写多个较大的文件(一定要检查能正常读写),说明生成的ubi镜像没有问题,
那原因就只有两个:

  • 烧写工具有问题,烧写坏块处理不当
  • mkfs时没有加-F参数。
posted @ 2024-05-03 02:35  坚持梦想的蜗牛  阅读(71)  评论(0编辑  收藏  举报