目的是将自己编译出来的应用程序固化到生产镜像中,使用pack指令打包出来的.img文件直接包含应用程序,用PhoenixCard制作量产卡,直接插卡将镜像烧录到nandflash中;前期将应用程序固化到rootfs中,最后发现应用程序需要远程升级时,因为rootfs是quashfs文件系统是只读的,导致无法替换删除原来的应用程序,用新的程序替换。所以需要将自己的应用程序放到UDISK分区,这样可以随意删除替换。没研究overlay分区,所以这么用。
生成镜像的方法为:
mkdir ubifs_src 创建文件夹
将需要固化到镜像的用户数据复制到该文件夹下
1、执行
mkfs.ubifs -r ubifs_src -o udisk.fex -m 4096 -e 258048 -c 748 -x zlib -F 生成数据镜像
还没安装mtd-utils会报错,sudo apt-get install mtd-utils
解析其中参数
指令解析
bash
复制编辑
mkfs.ubifs \
-r ubifs_src \
-o udisk.fex \
-m 4096 \
-e 258048 \
-c 748 \
-x zlib \
-F
参数逐项解释:
参数 含义
-r ubifs_src 指定源目录,UBIFS 文件系统将打包该目录下的所有文件(如 /mnt/data/ubifs_src
)
-o udisk.fex 输出文件名,即生成的 UBIFS 镜像名为 udisk.fex
(你也可以用 .ubifs
结尾)
-m 4096 最小 I/O 单元大小,等于 NAND 页大小(通常为 4KiB)
-e 258048 逻辑擦除块大小(LEB size),等于物理擦除块减去 UBI 开销,来自 /proc/mtd
-c 748 最大擦除块数,也就是最多能使用多少个 LEB(决定最大镜像大小)
-x zlib 使用 zlib 压缩算法,提高存储效率
-F 表示填满所有指定的 LEB 块(即即使数据不满也会写空块),防止系统出错或校验失败
其中 -e参数 需要查看分区信息 通过cat /proc/mtd查看,例如
root@TinaLinux:/# cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00040000 "boot0"
mtd1: 00300000 00040000 "uboot"
mtd2: 00100000 00040000 "secure_storage"
mtd3: 0fb00000 00040000 "sys"
mtd4: 01000000 0003f000 "mbr"
mtd5: 004ec000 0003f000 "boot-resource"
mtd6: 0003f000 0003f000 "env"
mtd7: 0003f000 0003f000 "env-redund"
mtd8: 004ec000 0003f000 "boot"
mtd9: 0103e000 0003f000 "rootfs"
mtd10: 0052b000 0003f000 "private"
mtd11: 0052b000 0003f000 "rootfs_data"
mtd12: 0b718000 0003f000 "UDISK"
其中0003f000 就是相当于0x3f000 转换十进制为258048,所以-c参数填258048
-c参数为分区最大可擦除的LEB块数,可以用分区大小除以-c参数来计算即为
● UDISK 分区为 0x0B718000 ≈ 183.7MiB
● 使用的擦除块大小为 0x3F000 = 258048 字节
● 183.7MiB / 258048 ≈ 748 LEB
也可以0x0B718000/0x3f000 得出最大的可擦除的LEB块数,即为镜像大小
其中-m参数可以通过查看nandflash规格书参考 或通过
cat /sys/class/mtd/mtd8/writesize
查看
-m参数一定要设置正确,否则会无法挂载数据,最终导致分区数据为空。
2、将生成的udisk.fex 复制到tina-sdk/device/config/chips/t113/configs/100ask/linux-5.4目录下
3、更改tina-sdk/device/config/chips/t113/configs/100ask/sys_partition.fex文件,UDISK分区增加downloadfile = "udisk.fex"参数,如下
[partition]
name = UDISK
downloadfile = "udisk.fex"
size = 10240
user_type = 0x8000
这里解析下UDISK的size可以随意设,最终为是其他分区用剩的空间会自动分配给该分区,在全志的存储文档有说明。
4、执行make,pack打包
开始不懂mkfs.ubifs 的用法,搞了很久没弄懂,最终在gpt的辅助下,摸索出来这个方法,验证成功;
离线