备份原始Flash分区转UBI卷遇容量与挂载错误求助
解决UBIFS挂载错误:
bad node type (0 but expected 6)的方法 问题根源
直接用dd备份整个MTD分区会包含UBI的PEB头部信息(错误日志中显示的UBI#就是UBI的魔数签名),而UBIFS挂载时期望读取的是自身的超级块节点,而非UBI头,因此触发bad node type错误。同时MTD分区的原始大小(120MiB)包含UBI管理开销,导致无法直接写入到仅115MiB的UBI卷中。
正确备份与恢复步骤
1. 提取纯UBIFS数据(二选一)
方法A:挂载后用tar备份文件系统内容
# 挂载原UBIFS卷 mount -t ubifs ubi0:rootfs /mnt # 打包所有文件(保留权限和属性) tar -czpvf /tmp/rootfs_backup.tar.gz /mnt # 卸载分区 umount /mnt
方法B:用ubidump直接提取UBIFS镜像
如果可以直接访问UBI卷设备,无需挂载即可提取:
ubidump /dev/ubi0_0 -o /tmp/rootfs.ubifs
2. 制作匹配目标分区的UBIFS/UBI镜像
首先确认目标MTD分区的关键参数(必须完全匹配,否则会出现兼容性问题):
cat /proc/mtd # 记录对应分区的 erasesize(PEB大小)、writesize(页大小)、subpagesize(子页大小)
从tar备份制作UBIFS镜像
# 解压备份到临时目录 mkdir -p /tmp/rootfs_dir tar -xzvpf /tmp/rootfs_backup.tar.gz -C /tmp/rootfs_dir # 制作UBIFS镜像,参数说明: # -m:页大小(对应writesize) # -e:LEB大小 = PEB大小(erasesize) - UBI头部开销(通常1KiB,例如256KiB PEB对应255KiB LEB) # -c:最大LEB数量(可根据分区大小计算:115MiB / 255KiB ≈ 460) mkfs.ubifs -m 4096 -e 255KiB -c 460 -o /tmp/rootfs.ubifs /tmp/rootfs_dir
用ubinize打包成UBI镜像
修改ubinize.cfg,指定UBIFS镜像作为数据源:
[rootfs] mode=ubi image=/tmp/rootfs.ubifs vol_id=0 vol_type=dynamic vol_name=rootfs vol_flags=autoresize
执行打包命令,参数匹配MTD分区:
ubinize -o /tmp/rootfs.ubi -m 4096 -p 256KiB -s 4096 /tmp/ubinize.cfg
3. 写入UBI卷并验证
# 格式化目标MTD分区(擦除原有内容) ubiformat /dev/mtdX -y # 替换X为你的目标分区编号 # 关联UBI设备 ubiattach /dev/ubi_ctrl -m X # 创建UBI卷(如果未预先创建) ubimkvol /dev/ubi0 -N rootfs -s 115MiB # 写入UBIFS镜像到UBI卷 ubiupdatevol /dev/ubi0_0 /tmp/rootfs.ubifs # 挂载验证 mount -t ubifs ubi0:rootfs /mnt
关键注意事项
- 参数必须严格匹配:
mkfs.ubifs和ubinize的页大小、PEB大小必须与目标MTD分区完全一致,否则会出现挂载失败或数据损坏。 - 避免直接备份MTD分区:
dd备份的是整个MTD原始数据,包含UBI管理块、坏块标记等非UBIFS数据,无法直接用于UBI卷恢复。 - 使用
ubiupdatevol而非直接写MTD:直接写入MTD分区会破坏UBI的管理结构,必须通过UBI工具链写入卷设备。
内容的提问来源于stack exchange,提问作者Dillip Murali
相关产品推荐
相关产品推荐

