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、/homeroot 与普通用户主目录可写

在嵌入式场景中,/dev、/proc、/sys、/tmp 通常由内核或 init 脚本挂载为虚拟文件系统,不占用实际存储空间。真正需要写入镜像的是 /bin、/sbin、/lib、/etc、/usr 等目录。

三、busybox 与完整发行版的区别

构建 rootfs 时最常见的两条路线是 BusyBox 精简方案与完整发行版方案。BusyBox 把上百个常用命令集成到单个可执行文件中,通过符号链接复用同一份代码,体积可控制在几 MB;而 Ubuntu、Debian 等发行版提供完整的包管理、systemd、glibc 与大量预编译软件,体积通常在数百 MB 到数 GB。

两种 rootfs 形态对比 BusyBox 精简 rootfs /bin/busybox(单文件多命令) /bin/sh → busybox /sbin/init → busybox /lib 仅保留必要 .so(可选 uClibc/musl) /etc 少量脚本 + inittab 体积约 2~10 MB,启动快,无包管理 完整发行版 rootfs /usr/bin 大量独立可执行文件 systemd / init apt / dpkg /lib 完整 glibc + 依赖库 /etc 完整配置体系 + 服务单元 体积数百 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 升级来保证可靠性。

在 RK3588 上调试阶段可先用可写 ext4 方便改配置;量产阶段建议切换为只读 rootfs + overlay,并把需要持久化的数据放到独立可写分区(如 /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 上构建出既稳定又易维护的根文件系统,并为后续的镜像打包与系统部署打下基础。