1. 项目概述
在嵌入式Linux系统开发中,合理规划存储分区是确保系统稳定运行的关键环节。RK3568作为一款广泛应用于工业控制、边缘计算等场景的ARM架构处理器,其Linux5.10+Buildroot系统环境下的分区管理尤为重要。本文将详细介绍如何在RK3568平台上新增一个名为"ccc"的独立分区,用于存放特定应用或数据文件。
为什么需要新增分区?在实际项目中,我们经常遇到以下需求:
- 隔离系统文件和用户数据,防止根文件系统被填满导致系统崩溃
- 为特定应用分配专属存储空间,便于管理和维护
- 实现数据持久化存储,避免系统升级时数据丢失
- 满足特定文件系统的性能或安全要求
2. 准备工作与环境确认
2.1 开发环境要求
在开始操作前,请确保已具备以下环境:
- 已搭建完整的RK3568 Linux5.10开发环境
- 获取OK3568开发板对应的Linux SDK(版本5.10)
- 安装必要的工具链:dd, mkfs.ext4, mount等
- 准备至少16GB的存储设备(eMMC或SD卡)
2.2 源码目录结构说明
关键目录路径说明:
code复制OK3568-linux-sdk5.10/
├── buildroot/ # Buildroot构建系统
│ └── output/OK3568/ # 目标系统输出
│ └── target/ # 目标系统根文件系统
├── rockdev/ # 固件打包相关文件
│ ├── parameter.txt # 分区表配置文件
│ └── ccc.img # 新建的分区镜像
└── tools/linux/Linux_Pack_Firmware/
└── rockdev/
└── rk356x-package-file # 固件打包配置文件
3. 分区创建详细步骤
3.1 修改固件打包配置文件
首先需要修改打包配置文件,告知构建系统新增分区的存在:
- 打开配置文件:
bash复制vim /tools/linux/Linux_Pack_Firmware/rockdev/rk356x-package-file
- 在文件中添加ccc分区的打包规则,通常在文件末尾添加类似如下行:
code复制ccc.img:ccc:10M:2
这表示:
ccc.img:生成的镜像文件名ccc:分区名称10M:分区大小2:分区属性(可读写)
注意:不同版本的SDK中,package-file的格式可能略有差异,请以实际文件中的其他分区定义为参考。
3.2 创建分区镜像文件
使用dd命令创建空白镜像文件:
bash复制cd /rockdev
dd if=/dev/zero of=ccc.img bs=1M count=10
参数说明:
if=/dev/zero:使用零作为输入源of=ccc.img:输出到ccc.img文件bs=1M:每次读写1MB数据count=10:总共操作10次,即生成10MB文件
实操技巧:在大型文件创建时,可以添加
status=progress参数查看进度:bash复制dd if=/dev/zero of=ccc.img bs=1M count=10 status=progress
3.3 格式化分区镜像
将创建的镜像格式化为ext4文件系统:
bash复制mkfs.ext4 ccc.img
格式化完成后,可以使用以下命令检查:
bash复制file ccc.img
应显示类似:"ccc.img: Linux rev 1.0 ext4 filesystem data..."
注意事项:
- 根据需求可选择ext2/ext3/ext4等不同文件系统类型
- 对于小容量分区(<16MB),建议使用ext2以减少元数据开销
- 生产环境中应考虑添加
-L ccc参数为分区设置标签
4. 分区表配置详解
4.1 修改parameter.txt文件
分区表是系统识别存储布局的关键,需要谨慎修改:
- 打开parameter.txt文件:
bash复制vim /rockdev/parameter.txt
- 在分区表中添加ccc分区条目,例如:
code复制0x00002000@0x00004000(ccc),0x00005000@0x00006000(userdata)
参数解析:
0x00005000:分区大小(单位:512字节块)@0x00006000:分区起始地址(单位:512字节块)(ccc):分区名称
4.2 分区大小计算原理
嵌入式系统中分区大小通常以512字节为基本单位进行计算:
code复制0x00005000(十六进制) = 20480(十进制)
20480 * 512字节 = 10,485,760字节
10,485,760 ÷ 1024 = 10240KB
10240 ÷ 1024 = 10MB
因此,0x00005000对应10MB分区空间。
经验分享:
- 分区地址必须按顺序排列,不能重叠
- 建议保留至少10%的余量,防止文件系统元数据占满空间
- 可以使用
fdisk -l命令验证分区表是否正确识别
4.3 分区地址规划技巧
合理规划分区地址需要考虑以下因素:
- 前一个分区的结束地址:
code复制rootfs结束地址 = 起始地址(@后数值) + 分区大小(@前数值)
- 对齐要求:
- 通常按1MB对齐(0x800)
- 高性能存储设备可能需要4KB对齐
- 示例计算:
如果rootfs配置为:
code复制0x00002000@0x00004000(rootfs)
则:
- rootfs大小:0x00002000 = 4MB
- rootfs起始地址:0x00004000
- 下一个分区(userdata)应起始于:
0x00004000 + 0x00002000 = 0x00006000
5. 文件系统集成配置
5.1 创建挂载点目录
在Buildroot的文件系统覆盖层中创建挂载点:
bash复制mkdir -p /buildroot/board/forlinx/ok3568/fs-overlay/ccc
注意事项:
- 必须在fs-overlay中创建,否则系统构建时会覆盖
- 目录权限建议设置为755:
bash复制chmod 755 /buildroot/board/forlinx/ok3568/fs-overlay/ccc
5.2 配置自动挂载
修改fstab文件实现开机自动挂载:
- 编辑fstab文件:
bash复制vim /buildroot/output/OK3568/target/etc/fstab
- 添加如下行:
code复制/dev/block/by-name/ccc /ccc ext4 defaults 0 0
配置项说明:
/dev/block/by-name/ccc:通过分区名称识别设备/ccc:挂载点路径ext4:文件系统类型defaults:挂载选项0 0:dump和fsck相关设置
高级技巧:
- 对于关键数据分区,可添加
nodelalloc选项提高可靠性- 频繁写入的分区建议添加
data=writeback选项提升性能- 只读分区可使用
ro选项
6. 验证与调试
6.1 固件打包与烧写
完成上述修改后,执行固件打包:
bash复制./build.sh
生成的固件位于rockdev目录下,使用RK工具烧写到设备。
6.2 系统启动验证
设备启动后,执行以下命令验证:
- 检查分区是否存在:
bash复制ls -l /dev/block/by-name/
应能看到ccc分区条目。
- 检查挂载情况:
bash复制mount | grep ccc
输出应显示ccc分区已正确挂载。
- 测试读写:
bash复制echo "test" > /ccc/testfile
cat /ccc/testfile
应能正常写入和读取文件。
6.3 常见问题排查
问题1:分区未识别
- 检查parameter.txt格式是否正确
- 确认打包脚本中是否包含新分区
- 使用
hexdump -C /dev/mmcblk0 | head -100查看分区表头
问题2:挂载失败
- 检查fstab配置是否正确
- 确认挂载点目录存在
- 查看内核日志:
dmesg | grep ccc
问题3:文件系统错误
- 尝试手动修复:
fsck.ext4 -y /dev/block/by-name/ccc - 检查镜像是否完整:
tune2fs -l /dev/block/by-name/ccc
7. 高级应用与优化
7.1 动态调整分区大小
对于需要灵活调整的场景,可以考虑:
- 使用设备树覆盖技术动态修改分区表
- 实现运行时resize2fs调整文件系统大小
- 采用LVM逻辑卷管理实现动态扩展
7.2 分区加密方案
敏感数据分区可启用加密:
- 使用dm-crypt创建加密分区:
bash复制cryptsetup luksFormat /dev/block/by-name/ccc
cryptsetup open /dev/block/by-name/ccc ccc_encrypted
mkfs.ext4 /dev/mapper/ccc_encrypted
- 修改fstab配置:
code复制/dev/mapper/ccc_encrypted /ccc ext4 defaults 0 0
7.3 性能优化建议
- 对于频繁写入的分区,考虑使用f2fs文件系统
- 调整ext4挂载选项:
noatime,nodiratime,data=writeback - 针对小文件场景,适当减小inode大小:
mkfs.ext4 -I 128 ccc.img
8. 实际项目经验分享
在多个RK3568项目实践中,总结出以下宝贵经验:
-
分区规划原则:
- 系统分区(如rootfs)保持只读,确保稳定性
- 用户数据分区单独划分,便于备份和维护
- 日志分区独立,避免填满根文件系统
- 临时分区使用tmpfs,减少存储磨损
-
调试技巧:
- 修改分区表后,建议先
dd备份原始固件 - 使用
blkid命令查看分区UUID和类型 - 通过
resize2fs可以调整ext4分区大小而不丢失数据
- 修改分区表后,建议先
-
性能考量:
- 小容量分区(<100MB)建议使用ext2
- 频繁写入的分区考虑增加10-20%的预留空间
- 关键数据分区启用CRC校验:
mkfs.ext4 -O metadata_csum
-
异常处理:
- 分区挂载失败时,系统应能降级运行
- 实现自动修复机制:
fsck -p - 重要数据分区应考虑双备份方案