分区说明
这里说明 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.bin | Loader 文件,烧录工具和芯片启动早期会用到。 |
parameter.txt | 分区表,告诉烧录工具每个分区从哪里开始、占多大空间。 |
uboot.img | U-Boot 镜像。 |
boot.img | Linux kernel 启动镜像。 |
recovery.img | Recovery ramboot 镜像,用于 recovery / update 流程。 |
misc.img | 控制类小分区,常用于传递启动模式、升级命令等信息。 |
oem.img | OEM 分区,可放板级或厂商资源。 |
userdata.img | 用户数据分区镜像。 |
rootfs.img | Linux 根文件系统镜像。 |
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分区从0x00008000sector 开始。boot分区大小是0x00020000sector。0x00020000 * 512 = 64 MiB。
最后的 -@0x000f8000(rootfs:grow) 表示 rootfs 从 0x000f8000 开始,后面剩余空间都分给 rootfs。这对不同容量的 eMMC 比较友好。
当前 Linux 分区表
| 分区 | 起始位置 | 大小 | 约等于 | 对应镜像 |
|---|---|---|---|---|
uboot | 0x00004000 | 0x00002000 | 4 MiB | uboot.img |
misc | 0x00006000 | 0x00002000 | 4 MiB | misc.img |
boot | 0x00008000 | 0x00020000 | 64 MiB | boot.img |
recovery | 0x00028000 | 0x00040000 | 128 MiB | recovery.img |
backup | 0x00068000 | 0x00010000 | 32 MiB | 通常预留 |
oem | 0x00078000 | 0x00040000 | 128 MiB | oem.img |
userdata | 0x000b8000 | 0x00040000 | 128 MiB | userdata.img |
rootfs | 0x000f8000 | 剩余空间 | 自动扩展 | rootfs.img |
这份分区表适合 Ubuntu/Debian 这类 Linux 系统。Android、A/B 系统会使用不同的分区表,不要混用。
如何自定义分区
大多数项目不需要改分区表。只有在 boot、recovery、oem、userdata 等分区空间不够时,再考虑调整。
如果确实要改 parameter.txt,建议注意这几点:
- 分区大小和起始位置的单位是 sector,不是 byte。
- 1 sector = 512 Bytes。
- 分区起始位置和大小要做对齐。Rockchip 文档建议至少 32 KB 对齐;为了烧录镜像兼容性,按 4 MiB 对齐会更稳。
parameter.txt要和打包用的 package file 保持一致。package file 里写了某个分区,parameter.txt里也要有这个分区。- 最后一个分区可以使用
:grow,把剩余容量自动分配给它。 - 不建议随意移动
uboot、misc、boot、recovery这类启动和升级相关分区。
分区表改完后,建议重新编译并打包完整固件,再使用完整 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 没有按预期占用剩余空间。
参考文档: