安装mtd-utils

mkfs.ubifs 的作用是将普通的文件夹转换成一个 UBIFS 格式的镜像文件。

apt-get update
apt-get install mtd-utils

生成可烧写的oem.img

  1. 创建oem文件夹

  2. 执行命令生成ubifs文件

    mkfs.ubifs -r oem -m 2048 -e 126976 -c 247 -o oem_ubifs.img
    
    • r <目录>:指定要打包的根目录(如 oem),该目录下的所有文件和权限都会被保留并打包。
    • -m <大小>:最小 I/O 单元大小(Minimum I/O unit size),单位字节。Page Size(页大小)
    • -e <大小>:逻辑擦除块大小(Logical Erase Block, LEB),单位字节。
      • 计算关系-e 的值通常等于物理擦除块大小(PEB)减去 UBI 头部开销。例如,如果物理擦除块是 128KB (131072字节),UBI 开销通常占去 2个页大小,即 131072 - 2048*2 = 126976
    • -c <数量>:文件系统可使用的最大逻辑擦除块数量(Max LEB count)。按 30 MiB = 30 × 1024 × 1024 字节。
      • c=(30×1024×1024)/126976≈247.8,向下取整得到 247 个 LEB
    • -o <文件名>:指定输出的 UBIFS 镜像文件名。
  3. 封装 UBI 镜像(ubinize)

    ubinize 的作用是将上一步生成的 UBIFS 镜像,加上 UBI 层的卷(Volume)管理信息,封装成最终可以烧录到 NAND Flash 上的 .ubi 文件。

    • 创建配置文件 oem-ubinize.cfg

      [oem_volume]
      mode=ubi
      image=oem_ubifs.img
      vol_id=0
      vol_size=30MiB
      vol_type=dynamic
      vol_name=oem
      #vol_flags=autoresize
      
      • mode=ubi:指定工作模式为 UBI。

      • image=:指向第一步生成的 UBIFS 镜像文件。

      • vol_id=:卷的 ID 编号,必须唯一。例如 oem 设为 0,userdata 可以设为 1。

      • vol_size=:卷的大小。

        强烈建议直接写具体的数值(如 64MiB)。

        • 避坑指南:这个值不能大于你在 parameter.txt 中为该分区预留的物理空间大小,且建议预留 8~10MB 的余量给 UBI 自身的元数据开销,否则 ubinize 会报错提示空间不足。
      • vol_type=dynamic:卷类型。日常使用的读写分区(如 oem, userdata)都设为 dynamic;如果是只读分区可设为 static

      • vol_name=:卷的名称。这个名字非常重要,后续在 /etc/fstab 中挂载时,就是通过 ubi0:oem 这样的名字来识别的。

      • vol_flags=autoresize:自动调整大小标志。如果设置该标志,文件系统会在第一次挂载时自动扩展到该卷允许的最大尺寸,非常适合 userdata 这种需要利用剩余空间的分区。

    • 执行封装命令

      ubinize -o oem.ubi -m 2048 -p 128KiB -s 512 oem-ubinize.cfg
      
      • -o <文件名>:指定最终生成的 UBI 镜像文件名(如 oem.ubi)。
      • -m <大小>:最小 I/O 单元大小,必须与 mkfs.ubifs 中的 -m 参数保持一致(即 NAND 的页大小)。
      • -p <大小>:物理擦除块大小(Physical Erase Block, PEB),单位支持 KiB/MiB。这个值必须严格匹配你的 NAND Flash 硬件手册中的 Block Size(擦除块大小),常见值为 128KiB 或 256KiB。
      • -s <大小>:子页大小(Sub-page size)。如果不确定,通常设为 512 或与 -m 相同即可。
  4. 生成oem.img

    直接修改oem.ubi名称就好了

    cp oem.ubi oem.img
    

生成可烧写的userdata.img

  1. 创建userdata文件夹

  2. 执行命令生成ubifs文件

    mkfs.ubifs -r userdata -m 2048 -e 126976 -c 247 -o userdata.img
    
  3. 封装 UBI 镜像(ubinize)

    • 创建配置文件 userdata-ubinize.cfg

      [userdata_volume]
      mode=ubi
      image=userdata_ubifs.img
      vol_id=0
      vol_size=30MiB
      vol_type=dynamic
      vol_name=userdata
      vol_flags=autoresize
      
    • 执行封装命令

      ubinize -o userdata.ubi -m 2048 -p 128KiB -s 512 userdata-ubinize.cfg
      
    1. 生成oem.img

      cp userdata.ubi userdata.img