3. rootfs核心概念
在 RK3588 的启动链路中,BootROM 加载 TPL/SPL,U-Boot 加载内核,内核完成初始化后,最后一步就是挂载根文件系统并启动第一个用户态进程。这个被挂载为 / 的文件系统,就是 rootfs(根文件系统)。它决定了系统启动后“能看到什么、能运行什么、能改什么”。理解 rootfs 的定义、目录规范、形态差异以及读写策略,是后续构建与部署工作的基础。
一、rootfs 的定义与在启动链路中的位置
rootfs 是内核挂载的第一个文件系统,它必须包含让系统“自举到可用状态”的最小集合:/sbin/init(或内核指定的 init 程序)、基础设备节点、必要的动态库、配置文件和 shell 环境。内核启动参数 root= 与 init= 决定了从哪里挂载、启动谁。
# 典型内核命令行(RK3588 常见形式)
console=ttyFIQ0,1500000n8 root=/dev/mmcblk0p6 rootwait rw
# 或使用分区 UUID
root=UUID=614e0000-0000-4b53-8000-1d28000054a9 rootwait rw
# 指定 init(busybox 场景常见)
init=/sbin/init
如果 rootfs 缺失、损坏或 init 不存在,内核会打印 Kernel panic - not syncing: No working init found 或 VFS: Cannot open root device,系统停在启动阶段。因此 rootfs 不是“可有可无的附加内容”,而是启动链路的终点与用户空间的起点。
二、FHS 目录结构标准
Linux 社区通过 FHS(Filesystem Hierarchy Standard)约定根目录下各目录的职责,使不同发行版、不同架构的软件包能够以一致的方式定位文件。RK3588 的 rootfs 无论用 Buildroot、Yocto 还是 Ubuntu,都应遵循这一结构。
| 目录 | 用途 | 是否可写 |
|---|---|---|
/bin | 所有用户可用的基础命令(ls、cp、sh) | 通常只读 |
/sbin | 系统管理命令(init、ifconfig、reboot) | 通常只读 |
/etc | 系统配置文件(fstab、passwd、网络配置) | 需可写或 overlay |
/lib、/lib64 | 共享库与内核模块依赖 | 只读 |
/usr | 用户程序、头文件、文档,二级层级 | 只读 |
/var | 运行期可变数据(日志、缓存、锁) | 必须可写 |
/dev | 设备节点,由 devtmpfs/udev 动态生成 | 虚拟文件系统 |
/proc、/sys | 内核与设备信息接口 | 虚拟文件系统 |
/tmp | 临时文件,常挂 tmpfs | 可写(内存) |
/root、/home | root 与普通用户主目录 | 可写 |
在嵌入式场景中,/dev、/proc、/sys、/tmp 通常由内核或 init 脚本挂载为虚拟文件系统,不占用实际存储空间。真正需要写入镜像的是 /bin、/sbin、/lib、/etc、/usr 等目录。
三、busybox 与完整发行版的区别
构建 rootfs 时最常见的两条路线是 BusyBox 精简方案与完整发行版方案。BusyBox 把上百个常用命令集成到单个可执行文件中,通过符号链接复用同一份代码,体积可控制在几 MB;而 Ubuntu、Debian 等发行版提供完整的包管理、systemd、glibc 与大量预编译软件,体积通常在数百 MB 到数 GB。
选择依据通常是产品定位:工业控制、网关、快速启动类设备倾向 BusyBox;需要 Python、ROS、图形桌面或频繁安装第三方软件的场景倾向完整发行版。两者并非互斥,也可以在 BusyBox 基础上叠加部分 Debian 包。
四、只读与可写根文件系统
嵌入式设备常面临意外断电,若 rootfs 可写,文件系统损坏风险显著上升。因此常见做法是把 rootfs 做成只读镜像(squashfs、erofs、只读 ext4),再通过 overlayfs 或 tmpfs 提供可写层。
# 只读 rootfs + overlay 可写层(/etc/init.d 或 systemd 中挂载)
mount -t squashfs /dev/mmcblk0p6 /ro
mount -t tmpfs tmpfs /rw
mkdir -p /rw/upper /rw/work
mount -t overlay overlay -o lowerdir=/ro,upperdir=/rw/upper,workdir=/rw/work /
只读方案的优势是抗断电、可校验、易回滚;代价是修改配置需要重新打包或依赖 overlay 持久化。可写方案(rw 挂载 ext4)调试方便,但需要配合 fsck、日志型文件系统或双分区 A/B 升级来保证可靠性。
/data)。五、常见误区与复盘
- 误区一:把 rootfs 等同于“文件系统镜像”。rootfs 是内核挂载的根,镜像只是它的载体;同一份 rootfs 可以打包成 ext4、squashfs 或 cpio。
- 误区二:忽略 FHS 导致路径混乱。把库放到
/usr/lib却未设置ld.so.conf,或把服务脚本散落在/opt,会让后续维护和升级困难。 - 误区三:只读 rootfs 却把日志写进
/var/log。只读挂载下写日志会失败,应把/var/log指向 tmpfs 或独立可写分区。 - 误区四:BusyBox 的
init与 systemd 混用。两者对/etc/inittab、服务管理方式不同,混用会导致启动脚本不执行。
/sbin/init 存在且可执行,并检查 /etc/fstab 中挂载点与内核命令行一致;否则容易出现“内核启动成功但用户态起不来”的问题。掌握 rootfs 的定义、FHS 目录职责、BusyBox 与发行版的取舍,以及只读/可写策略,才能在 RK3588 上构建出既稳定又易维护的根文件系统,并为后续的镜像打包与系统部署打下基础。