You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

备份原始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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:34:56