具体要解决的问题:
RK3588 debian11的SDK代码新增一个分区,涉及哪些文件的修改以及怎么修改,比如新增加一个share数据分区,文件系统格式为ext4, 具体怎么修改?
我这里以在RK3588 Debian 11 SDK中新增一个名为 share 的ext4数据分区为例,详细步骤如下。
整个过程的核心逻辑是:在 parameter.txt 中定义分区,在 package-file 中声明其镜像,然后生成一个空的ext4镜像供打包,最后(可选)在文件系统中设置自动挂载。
修改步骤详解
1. 修改分区表:parameter.txt
这是最关键的一步,直接定义了分区的起始地址和大小。文件路径通常在 device/rockchip/rk3588/parameter-xxx.txt。
-
核心语法 :分区在
CMDLINE字段的mtdparts=参数中定义,格式为size@offset(partition_name)。size和offset的单位都是扇区(1扇区 = 512字节)。- 所有数值均为十六进制。
-
示例 :假设我们要在
rootfs分区后、userdata分区前,新增一个大小为 256MB 的share分区。- 计算大小 :256MB =
256 * 1024 * 1024 = 268,435,456字节。转换为扇区:268,435,456 / 512 = 524,288个扇区,十六进制为0x80000。 - 计算起始地址 :假设
rootfs分区的起始地址是0x00078000,大小是0x01c00000。那么share分区的起始地址offset就是0x00078000 + 0x01c00000 = 0x01c78000。 - 修改文件 :打开
parameter.txt,在CMDLINE中找到合适位置插入新分区。修改后,其后的userdata分区起始地址也需要相应更新。
修改前:
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),0x01c00000@0x00078000(rootfs),0x00040000@0x01c78000(oem),-@0x01cb8000(userdata:grow)修改后:
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),0x01c00000@0x00078000(rootfs),0x00040000@0x01c78000(oem),0x00080000@0x01cb8000(share),-@0x01d38000(userdata:grow)注意 :这里将
userdata的起始地址更新为了0x01d38000(0x01cb8000 + 0x80000)。 - 计算大小 :256MB =
2. 修改打包清单:package-file
这个文件告诉打包工具哪些镜像需要被打包进最终的固件。文件路径通常在 tools/linux/Linux_Pack_Firmware/rockdev/package-file。
-
示例 :在文件中添加一行,指定分区名和对应的镜像文件路径。
share Image/share.img
3. 创建并打包分区镜像
你需要为这个新分区创建一个空的、已格式化的镜像文件,供打包脚本使用。
-
创建空镜像 :在SDK的
Image/目录下(如果不存在则创建),执行以下命令生成一个空的ext4格式镜像。bash# 进入SDK根目录 cd your_rk3588_sdk_root # 创建Image目录(如果不存在) mkdir -p Image # 生成一个256MB的空ext4镜像 dd if=/dev/zero of=Image/share.img bs=1M count=256 mkfs.ext4 Image/share.img
4. (可选)配置开机自动挂载:修改根文件系统的 /etc/fstab
如果你希望系统启动后,这个 share 分区能自动挂载到某个目录(如 /mnt/share),则需要修改根文件系统内的 etc/fstab 文件。
-
解包根文件系统 :SDK中的根文件系统通常是一个镜像文件(如
rootfs.img)。你需要先将其挂载或解包到一个临时目录。bash# 创建一个临时目录 mkdir rootfs_mount # 挂载rootfs镜像(假设镜像文件为 ubuntu_rootfs/rootfs.img) sudo mount -o loop ubuntu_rootfs/rootfs.img rootfs_mount -
修改
fstab:编辑rootfs_mount/etc/fstab文件,在末尾添加一行。/dev/block/by-name/share /mnt/share ext4 defaults,noatime 0 2这里使用
by-name/share这种更稳定的方式引用分区。 -
创建挂载点:在根文件系统中创建对应的挂载目录。
bashsudo mkdir -p rootfs_mount/mnt/share -
重新打包:修改完成后,卸载镜像。
bashsudo umount rootfs_mount如果SDK的打包流程需要特定的
rootfs.img,确保这个修改后的镜像会被使用。
关键注意事项
- 地址计算 :新增或调整分区时,必须精确计算每个分区的起始地址,确保它们首尾相连、互不重叠。任何计算错误都可能导致系统无法启动。
- 备份:在修改任何配置文件前,强烈建议先进行备份。
- 编译与打包 :完成上述修改后,通常需要重新执行SDK的编译和打包脚本(如
./build.sh和./mkfirmware.sh),以生成包含新分区的最终固件update.img。 userdata:grow分区 :注意parameter.txt中最后一个分区通常带有:grow标志,它会自动占用所有剩余空间。如果你在其前插入新分区,记得要调整它的起始地址。
总结
整个流程可以概括为:定义分区 (parameter.txt) -> 声明打包 (package-file) -> 准备镜像 (share.img) -> (可选) 配置挂载 (fstab)。
其中,修改 parameter.txt 并精确计算分区地址是最核心也最容易出错的环节,务必仔细核对。