Skip to main content

分区说明

这里说明 Neardi Pi 3 Linux 固件里的分区布局。下面这份不是随手举例,是 RK3576 Linux 6.1 R6 SDK 实际编译出来的结果。

Rockchip Linux 固件通常由多个分区镜像打包而成。parameter.txt 负责定义分区名字、起始位置和大小;rockdev/ 目录负责把要打包或烧录的镜像集中放到一起。

rockdev 目录里的文件

Linux 固件编译完成后,rockdev/ 目录大致如下:

rockdev/
├── boot.img -> ../../kernel-6.1/boot.img
├── MiniLoaderAll.bin -> ../../u-boot/rk3576_spl_loader_v1.09.108.bin
├── misc.img -> ../misc.img
├── oem.img -> ../extra-parts/oem.img
├── parameter.txt -> ../../device/rockchip/.chips/rk3576/parameter.txt
├── recovery.img -> ../recovery/ramboot.img
├── rootfs.img -> ../../ubuntu/ubuntu-base-jammy.img
├── uboot.img -> ../../u-boot/uboot.img
├── update.img -> ../update/Image/update.img
└── userdata.img -> ../extra-parts/userdata.img

可以这样理解这些文件:

文件说明
MiniLoaderAll.binLoader 文件,烧录工具和芯片启动早期会用到。
parameter.txt分区表,告诉烧录工具每个分区从哪里开始、占多大空间。
uboot.imgU-Boot 镜像。
boot.imgLinux kernel 启动镜像。
recovery.imgRecovery ramboot 镜像,用于 recovery / update 流程。
misc.img控制类小分区,常用于传递启动模式、升级命令等信息。
oem.imgOEM 分区,可放板级或厂商资源。
userdata.img用户数据分区镜像。
rootfs.imgLinux 根文件系统镜像。
update.img最终打包出来的完整固件。

开发调试时,可以只烧某个分区,速度会快很多;正式发布或首次烧录时,通常使用完整的 update.img

parameter.txt 怎么看

这份 Linux 分区表里,最关键的是 CMDLINE 里的分区定义:

CMDLINE: mtdparts=:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00020000@0x00008000(boot),0x00040000@0x00028000(recovery),0x00010000@0x00068000(backup),0x00040000@0x00078000(oem),0x00040000@0x000b8000(userdata),-@0x000f8000(rootfs:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9

Rockchip 的写法是:

0x大小@0x起始位置(分区名)

这里的“大小”和“起始位置”单位都是 sector,不是 byte。1 个 sector 是 512 Bytes。

比如:

0x00020000@0x00008000(boot)

意思是:

  • boot 分区从 0x00008000 sector 开始。
  • boot 分区大小是 0x00020000 sector。
  • 0x00020000 * 512 = 64 MiB

最后的 -@0x000f8000(rootfs:grow) 表示 rootfs0x000f8000 开始,后面剩余空间都分给 rootfs。这对不同容量的 eMMC 比较友好。

当前 Linux 分区表

分区起始位置大小约等于对应镜像
uboot0x000040000x000020004 MiBuboot.img
misc0x000060000x000020004 MiBmisc.img
boot0x000080000x0002000064 MiBboot.img
recovery0x000280000x00040000128 MiBrecovery.img
backup0x000680000x0001000032 MiB通常预留
oem0x000780000x00040000128 MiBoem.img
userdata0x000b80000x00040000128 MiBuserdata.img
rootfs0x000f8000剩余空间自动扩展rootfs.img

这份分区表适合 Ubuntu/Debian 这类 Linux 系统。Android、A/B 系统会使用不同的分区表,不要混用。

如何自定义分区

大多数项目不需要改分区表。只有在 bootrecoveryoemuserdata 等分区空间不够时,再考虑调整。

如果确实要改 parameter.txt,建议注意这几点:

  • 分区大小和起始位置的单位是 sector,不是 byte。
  • 1 sector = 512 Bytes。
  • 分区起始位置和大小要做对齐。Rockchip 文档建议至少 32 KB 对齐;为了烧录镜像兼容性,按 4 MiB 对齐会更稳。
  • parameter.txt 要和打包用的 package file 保持一致。package file 里写了某个分区,parameter.txt 里也要有这个分区。
  • 最后一个分区可以使用 :grow,把剩余容量自动分配给它。
  • 不建议随意移动 ubootmiscbootrecovery 这类启动和升级相关分区。

分区表改完后,建议重新编译并打包完整固件,再使用完整 update.img 烧录。分区表变了,就不要只烧某一个分区了。

板端查看

系统启动后,可以在板端查看当前分区和挂载情况:

ls -l /dev/block/by-name/
ls -al /dev/disk/by-partlabel/
cat /proc/cmdline
df -h

/dev/disk/by-partlabel/ 里能直接看到分区名和实际 eMMC 分区的对应关系,例如:

neardi@RK3576:~$ ls -al /dev/disk/by-partlabel/
total 0
drwxr-xr-x 2 root root 200 Jul 2 14:34 .
drwxr-xr-x 9 root root 180 Jul 2 14:34 ..
lrwxrwxrwx 1 root root 15 Jul 2 14:34 backup -> ../../mmcblk0p5
lrwxrwxrwx 1 root root 15 Jul 2 14:34 boot -> ../../mmcblk0p3
lrwxrwxrwx 1 root root 15 Jul 2 14:34 misc -> ../../mmcblk0p2
lrwxrwxrwx 1 root root 15 Jul 2 14:34 oem -> ../../mmcblk0p6
lrwxrwxrwx 1 root root 15 Jul 2 14:34 recovery -> ../../mmcblk0p4
lrwxrwxrwx 1 root root 15 Jul 2 14:34 rootfs -> ../../mmcblk0p8
lrwxrwxrwx 1 root root 15 Jul 2 14:34 uboot -> ../../mmcblk0p1
lrwxrwxrwx 1 root root 15 Jul 2 14:34 userdata -> ../../mmcblk0p7

比如 boot -> ../../mmcblk0p3,说明 boot 分区实际对应 /dev/mmcblk0p3。如果只是调试内核启动镜像,也可以在板端直接写 boot 分区:

sudo dd if=./boot.img of=/dev/block/by-name/boot
sync

这类命令会直接覆盖分区内容,执行前确认镜像和分区名都没写错。正式烧录或分区表有变化时,还是建议用 Type-C 烧录工具烧完整 update.img

如果 parameter.txt、package file 和实际镜像不一致,常见现象是烧录失败、启动失败、分区大小不对,或者 rootfs 没有按预期占用剩余空间。

参考文档: