RK Android 10/11/12 新增分区实战从 parameter 到 fstab 的完整流程在嵌入式系统开发中RockchipRK平台的Android系统定制是一个常见需求。当我们需要为设备添加新的存储分区时需要修改多个系统级别的配置文件。本文将详细介绍在RK Android 10/11/12系统中新增一个物理分区的完整流程涵盖从分区表定义到文件系统挂载的全过程。1. 理解RK Android分区体系RK平台Android系统采用独特的分区管理机制主要涉及以下几个关键文件parameter.txt定义闪存设备的分区布局BoardConfig.mk配置分区大小和编译参数fstab定义文件系统挂载点SELinux策略控制分区访问权限在开始修改前建议先备份以下关键目录cp -r device/rockchip/ common/ device/rockchip/common.bak2. 修改parameter分区表parameter文件是RK平台特有的分区定义文件位于device/rockchip/common/scripts/parameter目录。添加新分区的步骤如下定位到目标设备的parameter文件例如rk3566_r的parametercd device/rockchip/rk356x/rk3566_r/修改parameter文件添加新分区定义。例如添加一个16MB的test分区mtdpartsrk29xxnand: 0x000020000x00002000(uboot), 0x000020000x00004000(misc), ... 0x001000000x00414000(test:16M), -0x00514000(user)关键参数说明0x00100000分区大小16MB0x00414000分区起始偏移test:16M分区名及大小声明3. 配置BoardConfig.mk在设备的BoardConfig.mk中添加新分区的编译定义# 添加特殊分区定义 BOARD_WITH_SPECIAL_PARTITIONS : test:16M # 多个分区用逗号分隔 # BOARD_WITH_SPECIAL_PARTITIONS : test:16M,log:8M同时需要修改RebuildParameter.mk文件确保分区信息能被正确重建# device/rockchip/common/build/rockchip/RebuildParameter.mk ifneq ($(strip $(BOARD_WITH_SPECIAL_PARTITIONS)),) partition_list : $(partition_list),$(BOARD_WITH_SPECIAL_PARTITIONS) endif4. 创建文件系统镜像新分区需要预先格式化为特定文件系统。以下是创建ext4文件系统镜像的步骤# 创建16MB的空文件 dd if/dev/zero oftest.img bs1M count16 # 格式化为ext4 mkfs.ext4 test.img # 在开发机上挂载并设置权限 mkdir -p /mnt/test sudo mount -o loop test.img /mnt/test sudo chown -R root:root /mnt/test sudo umount /mnt/test将生成的test.img放入设备镜像打包目录mv test.img out/target/product/rk3566_r/5. 修改fstab挂载配置RK平台的fstab通常由模板生成位置在device/rockchip/common/scripts/fstab_tools/fstab.in添加新分区的挂载点配置/dev/block/by-name/test /test_dir ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check参数说明/dev/block/by-name/test分区设备节点/test_dir挂载目标目录ext4文件系统类型noatime,nodiratime性能优化选项wait,check启动时检查顺序6. 创建挂载目录在rootfs中创建挂载点目录修改system/core/rootdir/Android.mkLOCAL_POST_INSTALL_CMD ; mkdir -p $(TARGET_ROOT_OUT)/test_dir7. 配置SELinux策略为新分区添加文件上下文定义修改device/rockchip/common/sepolicy/private/file_contexts/test_dir(/.*)? u:object_r:cache_file:s0如果需要自定义类型需在sepolicy中定义新类型# file.te type test_file, file_type; # file_contexts /test_dir(/.*)? u:object_r:test_file:s08. 验证与调试完成修改后按以下步骤验证重新编译系统make -j8烧写新固件后检查分区是否创建adb shell ls -l /dev/block/by-name/验证挂载是否成功adb shell mount | grep test_dir检查文件权限adb shell ls -lZ / | grep test_dir9. 常见问题解决问题1分区未正确创建检查parameter文件格式是否正确确认BoardConfig.mk中的分区大小与parameter一致查看编译日志中是否包含新分区问题2挂载失败检查fstab语法是否正确确认文件系统类型与镜像格式匹配查看内核日志获取错误详情adb shell dmesg | grep test问题3权限不足确认SELinux策略已正确定义检查挂载点的目录权限临时禁用SELinux调试adb shell setenforce 010. 高级技巧动态分区支持 在Android 10上可考虑使用动态分区BOARD_DYNAMIC_PARTITIONS_ENABLE : true BOARD_SUPER_PARTITION_GROUPS : rockchip_dynamic_partitions分区大小自动计算 在BoardConfig.mk中使用变量定义大小TEST_PARTITION_SIZE : 16777216 BOARD_WITH_SPECIAL_PARTITIONS : test:$(TEST_PARTITION_SIZE)多设备兼容 使用条件判断支持不同设备ifeq ($(TARGET_PRODUCT),rk3566_r) BOARD_WITH_SPECIAL_PARTITIONS : test:16M endif通过以上步骤我们完成了在RK Android系统中新增物理分区的全流程。实际项目中建议先在模拟环境测试再应用到实际设备。不同RK芯片型号可能有细微差异需参考具体平台的开发文档进行调整。