UBIFS error调试总结

本文针对AM335x平台UBIFS文件系统出现的启动失败及读写错误等问题进行了分析,并提供了详细的解决方案,包括修改内核代码及调整配置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址: http://bbs.21ic.com/icview-464754-1-1.html

前几天写了一份AM335x的硬件问题分享,这几天把操作系统也搞定了,所以再写一篇操作系统的问题分享。其中修改内核的部分是网上的资料,并非我的原创,但是我都验证过,特此说明。


问题一:第一次加载有效,第二次就不行了,错误打印如下
UBIFS: recovery needed
UBIFS error (pid 1): replay_log_leb: log error detected while replaying the log at LEB 3:0

这个错误的原因是'fixup_free_space()中计算空空间开始地址为c->lhead_offs。正确的应该为一直是0

解决方案一:
只有在第一次启动过程中突然断电才会引起此问题,只要正常启动过一次UBIfs的文件系统(进入文件系统之后稍微等待几秒钟)即可解决此问题。

解决方案二(推荐):
修改 linux 内核代码
FILE_PATH: fs/ubifs/sb.c : fixup_free_space()
//修改前
err = fixup_leb(c, c->lhead_lnum, c->lhead_offs);
//修改后
err = fixup_leb(c,c->lhead_lnum,ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size));

问题二:随机出现无法加载的情况,错误打印如下      
UBIFS: read-only UBI device
UBIFS error (pid 1): mount_ubifs: cannot mount read-write - read-only media
而且随着使用时间的增加,nand flash的坏块会越来越多

解决方案一:
更换nand flash,把K9F2G08改为MT29F2G08即可,其实就是换一家,呵呵。

解决方案二:
修改 linux 内核代码
FILE_PATH: drivers/mtd/nand/omap2.c : omap_wait()
//修改前
if (state == FL_ERASING)
  timeo += (HZ * 400) / 1000; 
else
  timeo += (HZ * 20) / 1000;
//修改后
if (state == FL_ERASING)
  timeo += (HZ * 4000) / 1000; 
else
  timeo += (HZ * 1000) / 1000;
注:例子中把时间增加的比较多,可根据自己的实际情况减小到适当的值。

解决方案三(推荐):
修改 linux 内核代码
FILE_PATH: drivers/mtd/nand/omap2.c : omap_wait()
//修改前
while (time_before(jiffies, timeo)) {
    status = __raw_readb(this->IO_ADDR_R);
    if (status & NAND_STATUS_READY)
        break;
    cond_resched();
}
//修改后
while (time_before(jiffies, timeo)) {
    status = __raw_readb(this->IO_ADDR_R);
    if (status & NAND_STATUS_READY)
        break;
    cond_resched();
}

if (!(status & NAND_STATUS_READY)) {
   status = __raw_readb(this->IO_ADDR_R);
}

问题三:K9F2G08不支持sub page结构(在内核中使用硬件ECC没有此问题,使用软件ECC才有,因为我使用了硬件ECC,所以不用改内核)

解决方案一:在制作ubi.img时,把原指令
sudo ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg
改为
sudo ubinize -o ubi.img -m 2048 -p 128KiB -s 2048 -O 2048 ubinize.cfg
注:实际测试时发现使用原先的指令也没有问题,不过从ubinize的参数说明来看-s应该填写2048,所以还是建议使用下一句指令。

mount: mounting none on /sys failed: Device or [ 2.938915] random: fast init done [ 2.942098] UBIFS (ubi0:0): background thread "ubifs_bgt0_0" started, PID 580 resource busy mount: mounting none on /sys/kernel/debug/ failed: Device or resource busy [ 2.957823] UBIFS (ubi0:0): recovery needed [ 2.990725] UBIFS (ubi0:0): recovery completed [ 2.992406] UBIFS (ubi0:0): UBIFS: mounted UBI device 0, volume 0, name "miservice" [ 3.000014] UBIFS (ubi0:0): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes [ 3.009969] UBIFS (ubi0:0): FS size: 29458432 bytes (28 MiB, 232 LEBs), journal size 4190208 bytes (3 MiB, 33 LEBs) [ 3.020362] UBIFS (ubi0:0): reserved for root: 0 bytes (0 KiB) [ 3.026177] UBIFS (ubi0:0): media format: w4/r0 (latest is w4/r0), UUID 7E8F7038-ACBB-4C65-8139-3B8B55A66B05, small LPT model [ 3.042068] UBIFS error (ubi0:1 pid 581): ubifs_is_mapped: ubi_is_mapped failed for LEB 0, error -9 [ 3.048282] CPU: 1 PID: 581 Comm: mount Not tainted 4.9.84 #246 [ 3.054188] Hardware name: SStar Soc (Flattened Device Tree) [ 3.059867] [<c0012761>] (unwind_backtrace) from [<c00100d3>] (show_stack+0xb/0xc) [ 3.067429] [<c00100d3>] (show_stack) from [<c0133e1b>] (dump_stack+0x5b/0x70) [ 3.074651] [<c0133e1b>] (dump_stack) from [<c00ed06b>] (ubifs_is_mapped+0x23/0x2c) [ 3.082308] [<c00ed06b>] (ubifs_is_mapped) from [<c00eb74f>] (ubifs_mount+0x653/0xf64) [ 3.090228] [<c00eb74f>] (ubifs_mount) from [<c009c4f9>] (mount_fs+0x9/0x64) [ 3.097280] [<c009c4f9>] (mount_fs) from [<c00acc43>] (vfs_kern_mount+0x33/0xa4) [ 3.104678] [<c00acc43>] (vfs_kern_mount) from [<c00ae7e1>] (do_mount+0x57d/0x730) [ 3.112250] [<c00ae7e1>] (do_mount) from [<c00aeb31>] (SyS_mount+0x61/0x6a) [ 3.119214] [<c00aeb31>] (SyS_mount) from [<c000d5a1>] (ret_fast_syscall+0x1/0x54) mount: mounting ubi0:customer on /customer failed: Bad file descriptor [ 3.138718] UBIFS (ubi0:2): background thread "ubifs_bgt0_2" start
04-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值