mount ubifs on other rootfs

本文详细介绍了两种创建UBIFS文件系统并直接写入闪存的方法:一种是通过命令行直接操作,另一种是在PC端创建文件系统后,在相机端手动创建卷并写入。同时提供了关键步骤的命令示例,并指导如何进行测试和验证。
WAY1: Ceate UBI Image, write to flash directly

./mkfs.ubifs -r dir -m 2048 -e 126976 -c2047 -F -o ubifs.img
./ubinize -o ubifs -p 131072 -m 2048 -s 2048 ubicfg.ini
#flash_eraseall /dev/mtd10
#nandwrite /dev/mtd10 ubifs
#ubiattach /dev/ubi_ctrl -m 10
#mount -t ubifs ubi0_0 /mnt

WAY2: Ceate UBIFS Image, create volume manually, use ubi write volume tool to write flash

==>Create ubifs image(PC side)
./mkfs.ubifs -r dir -m 2048 -e 126976 -c 2048 -o ubifs.img  

==> Mount UBIFS(Camera side)
1) Erase MTD
#flash_eraseall /dev/mtd10

2) manual attach/detach ubi to mtd
#ubiattach /dev/ubi_ctrl -m 10

3)manual create ubi volume
#ubimkvol /dev/ubi0 -N volume_name -s 13107200

4) write img to ubi volume
#ubiupdatevol /dev/ubi0_0 ubi.img

4) Mount ubifs
#mount -t ubifs ubi0_0 /mnt或mount -t ubifs ubi0:rootfs /mnt

==> Reboot and test
1) ubiattach /dev/ubi_ctrl -m 10
2) mount -t ubifs ubi0_0 /mnt

Reference:

1) http://blog.youkuaiyun.com/chongzi865458/article/details/6665978

2) http://wenku.baidu.com/link?url=qSuC0MfxVjEvA--_t825kIZTLRXoJsIQCdfxkP8Mxbm4RIf8T6-quUmf6A1aIjyS48A3dnrcHVYH745A9Jh9CTLK0prMDns7QBM5PKqcNhO
<think> 我们正在讨论如何使用mkfs.ubifs工具创建rootfs.ubifs镜像。这是一个UBI文件系统镜像,用于在支持UBI的MTD设备上存储根文件系统。 步骤概述: 1. 准备根文件系统的目录(包含所有需要的文件和目录) 2. 确定目标设备的MTD分区参数:物理擦除块大小(PEB)、最小I/O单元大小、子页大小(如果存在)等。 3. 使用mkfs.ubifs命令创建一个UBIFS镜像(.ubifs文件) 4. (可选)使用ubinize工具将UBIFS镜像封装为UBI镜像(.ubi文件),这一步通常在需要将UBI卷头信息一起写入时使用。但用户要求创建rootfs.ubifs,所以可能只需要UBIFS镜像。 注意:直接使用mkfs.ubifs创建的是UBIFS文件系统镜像,而UBI镜像(包含多个卷)则需要使用ubinize。 但是,根据用户需求,他们要求的是rootfs.ubifs,因此我们只需创建UBIFS镜像。 详细步骤: 1. 获取目标设备的MTD参数: - 物理擦除块大小(PEB):通常是128KiB或256KiB(例如:128*1024=131072字节) - 最小I/O单元大小:通常是页大小,如2KiB、4KiB等(例如:2048字节) - 子页大小(如果最小I/O单元支持子页,如某些MLC NAND): 可选,默认为最小I/O单元大小 2. 确定UBIFS文件系统参数: - 最大逻辑擦除块(LEB)大小:通常为PEB大小减去2个页大小(因为每个物理擦除块的开头有UBI卷标和文件系统元数据) - 日志大小:通常为1个LEB,也可指定为整数个LEB - 压缩:默认使用zlib或LZO,也可以选择zstd(需要内核支持) 3. 运行mkfs.ubifs命令: 基本命令格式: $ mkfs.ubifs -r <rootdir> -m <min_io_size> -e <leb_size> -c <max_leb_cnt> -o rootfs.ubifs 参数说明: - -r:根文件系统的目录 - -m:最小I/O单元大小(字节) - -e:逻辑擦除块大小(LEB,字节),通常为物理擦除块大小减去2*min_io_size(因为每个物理块的开头有两个页用于UBI卷管理) - -c:最大逻辑擦除块数量(即文件系统最大可以占用的LEB数) - -o:输出文件 可选参数: - -F:使输出文件可被用于ubinize(填充到leb_size的整数倍) - -X:指定压缩算法,如lzo, zlib, zstd(例如:-X zstd) 4. 计算LEB大小和最大LEB数量: - LEB大小(-e)的计算:通常为PEB_size - 2 * min_io_size 例如:PEB=128KiB(131072字节),min_io_size=2048字节,则LEB=131072-2*2048=126976字节。 - 最大LEB数量(-c):这个值需要根据分区大小和LEB大小计算,同时预留一部分空间给UBI(坏块处理等)。最大LEB数量 = (分区大小 - 预留PEB数 * PEB_size) / LEB_size 但是,在创建UBIFS镜像时,我们只需要指定一个足够大的值(大于实际需要的LEB数)即可,因为实际写入时会根据内容确定大小。但是不能超过目标分区所支持的最大LEB数。 5. 注意:如果后续需要将多个UBIFS镜像组合成一个UBI镜像(包含多个卷),则需要使用ubinize。但这里用户要求的是rootfs.ubifs,所以直接使用mkfs.ubifs即可。 示例: 假设: 根文件系统目录:./rootfs PEB大小:131072字节 最小I/O单元:2048字节 目标分区大小:64MiB(64*1024*1024=67108864字节) 计算LEB大小: LEB = 131072 - 2*2048 = 126976 字节 计算最大LEB数量(-c): 总LEB数量(不考虑预留) = 67108864 / 131072 = 512(个物理块) 但是,UBI需要预留一部分PEB(例如20个用于坏块处理等),因此可用于文件系统的PEB数量为512-20=492。 然后,由于每个LEB对应一个PEB,所以最大LEB数量为492。 命令: $ mkfs.ubifs -r ./rootfs -m 2048 -e 126976 -c 492 -o rootfs.ubifs 6. 如果要使用压缩(例如zstd): $ mkfs.ubifs -r ./rootfs -m 2048 -e 126976 -c 492 -X zstd -o rootfs.ubifs 注意:如果后续要将这个ubifs镜像放入UBI卷中,我们通常使用ubinize来生成ubi镜像(.ubi文件),但用户要求的是.ubifs文件,所以这里我们只生成ubifs。 7. 验证:可以使用ubinize工具将生成的rootfs.ubifs打包成ubi镜像(如果只是为了验证,可以跳过),或者直接将其烧写到MTD分区并挂载测试。 8. 挂载UBIFS镜像:在支持UBI的系统上,可以使用以下步骤: # 将UBIFS镜像烧写到MTD分区 # 然后挂载mount -t ubifs ubi0:rootfs /mnt 常见问题: - 如果LEB大小计算错误,会导致挂载失败(提示无效参数)。 - 最大LEB数量设置过小,会导致创建镜像失败(提示空间不足)。 因此,在制作之前,务必确认目标板的参数。 相关问题: 1. 如何确定NAND闪存的最小I/O单元大小和擦除块大小? 2. 如何使用ubinize将多个UBIFS镜像打包成一个UBI镜像? 3. 如何配置Linux内核以支持UBI和UBIFS? 4. 在烧写UBIFS镜像到MTD设备时,需要注意什么? </think> ### 使用 `mkfs.ubifs` 创建 `rootfs.ubifs` 的完整指南 `mkfs.ubifs` 是专为 UBI 文件系统设计的工具,用于将根文件系统目录打包为 `.ubifs` 镜像。以下是详细步骤和关键参数解析: --- #### **1. 准备工作** - **根文件系统目录**: 准备好完整的根文件系统目录(如 `./rootfs/`) - **关键参数获取**: - **PEB 大小**: 物理擦除块大小(通常从设备树或 `mtdinfo` 获取) - **LEB 大小**: 逻辑擦除块大小(计算公式:$LEB = PEB - 2 \times \text{min\_io\_size}$) - **最小 I/O 单元**: NAND 闪存的页大小(如 2048/4096 字节) --- #### **2. 基础命令模板** ```bash mkfs.ubifs \ -r ./rootfs/ \ # 根文件系统源目录 -o rootfs.ubifs \ # 输出镜像文件名 -m 2048 \ # 最小I/O单元大小(示例值) -e 126976 \ # LEB大小(示例:128KiB PEB - 2x2048) -c 1024 \ # 最大LEB数量(分区容量/LEB大小) -x zstd \ # 压缩算法(zstd/lzo/zlib) -v # 显示详细过程 ``` --- #### **3. 关键参数详解** | 参数 | 说明 | 示例值 | |------|------|--------| | `-r <dir>` | 根文件系统源目录 | `./rootfs/` | | `-o <file>` | 输出镜像路径 | `rootfs.ubifs` | | `-m <bytes>` | 最小I/O单元大小(页大小) | `2048` | | `-e <bytes>` | LEB大小(计算得出) | `126976`(128KiB PEB) | | `-c <count>` | 最大LEB数量(分区容量/LEB) | `1024`(128MiB分区) | | `-x <algo>` | 压缩算法(提升空间利用率) | `zstd`(高效压缩) | | `-F` | 填充镜像至完整LEB边界 | 用于后续 `ubinize` | --- #### **4. 计算 LEB 大小** 若 PEB = 128 KiB (131072 Bytes),min_io_size = 2048 Bytes: $$ LEB = 131072 - (2 \times 2048) = 126976 \text{ Bytes} $$ --- #### **5. 压缩算法选择** | 算法 | 压缩率 | CPU开销 | 内核要求 | |------|--------|---------|----------| | `zstd` | ★★★★☆ | 中 | Linux 4.19+ | | `lzo` | ★★☆☆☆ | 低 | 广泛支持 | | `zlib` | ★★★☆☆ | 高 | 所有版本 | **推荐**: ```bash -x zstd # 高性能压缩(节省约40%空间) ``` --- #### **6. 验证与烧写** - **检查镜像完整性**: ```bash ubinfo -v rootfs.ubifs # 显示UBIFS镜像元数据 ``` - **烧写到MTD设备**: ```bash flash_erase /dev/mtd0 0 0 # 擦除分区 nandwrite -p /dev/mtd0 rootfs.ubifs # 写入镜像 ``` --- #### **7. 常见错误处理** - **`LEB size too small`** 确保 `-e` 值精确计算:$LEB = PEB - 2 \times min\_io\_size$ - **`Not enough space`** 增大 `-c` 值(最大LEB数量)或精简根文件系统: ```bash du -sh ./rootfs/ # 检查目录大小 ``` --- ### 相关问题 1. 如何为 UBI 分区精确计算最小 LEB 数量? 2. 使用 `ubinize` 打包多卷 UBI 镜像的步骤是什么? 3. UBIFS 文件系统在掉电场景下如何保证数据完整性? 4. 如何通过内核参数优化 UBIFS 的读写性能? > 提示:通过 `mtdinfo /dev/mtdX` 可获取设备的 PEB 和页大小[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值