2. rootfs基础

要理解版本升级与回滚机制,必须先弄清楚“升级的到底是什么”。在嵌入式 Linux 与服务器 Linux 中,绝大多数升级操作最终都落在 rootfs(根文件系统) 上。rootfs 是内核启动后挂载的第一个文件系统,它承载了系统运行所需的目录结构、库、配置、脚本和应用程序。可以说,rootfs 就是系统的“身体”,而内核只是“大脑”。

一、rootfs 的定义与本质

rootfs 并不是某一种具体的文件系统格式,而是一个挂载位置概念:它被挂载到根目录 /,是内核启动后访问所有其他路径的起点。内核通过启动参数 root= 指定根文件系统所在设备或镜像,例如 root=/dev/mmcblk0p2 或 root=/dev/nfs。挂载成功后,/bin、/etc、/lib、/usr 等目录才真正可用。

从存储形态看,rootfs 可以是 ext4、squashfs、ubifs、jffs2、erofs、overlayfs 等多种格式;从部署形态看,它可以位于 eMMC、NAND、SD 卡、U 盘、网络(NFS)或内存(initramfs)中。理解这一点,对后续设计升级与回滚方案至关重要。

二、rootfs 的组成结构

一个典型的 rootfs 目录结构遵循 FHS(文件系统层次标准),主要目录及其职责如下:

  • /bin、/sbin:基础命令与系统管理命令,如 ls、mount、init。
  • /lib、/usr/lib:动态链接库与内核模块,升级时需与应用程序 ABI 匹配。
  • /etc:配置文件,如网络、用户、服务配置,通常是升级中最敏感的部分。
  • /dev、/proc、/sys:运行时虚拟文件系统,由内核动态生成,不占用实际存储。
  • /var:可变数据,如日志、缓存、数据库,通常需要可写。
  • /opt、/app:第三方或业务应用,常作为独立升级单元。

在升级回滚设计中,关键是把 rootfs 划分为“系统只读部分”和“用户可写部分”,前者可整体替换,后者需保留或迁移。

三、挂载方式与只读/可写分区

rootfs 的挂载方式直接决定了升级策略。常见方式包括:

  • 直接挂载:内核直接挂载某个块设备为 /,如 ext4 分区。
  • initramfs + 切换根:先用内存文件系统启动,再由脚本挂载真正的 rootfs 并 switch_root。
  • overlayfs 联合挂载:只读底层 + 可写上层,实现“只读系统 + 可写数据”的分离。
  • NFS 网络挂载:开发调试常用,量产设备较少使用。

只读与可写分区的划分是回滚机制的基础。典型做法是:系统分区(rootfs A/B)只读,数据分区(/data、/var)可写。升级时只替换只读系统分区,用户数据不受影响;回滚时切回旧系统分区即可。

核心原则:系统分区只读、数据分区可写、升级单元原子化。只有把“变”与“不变”分离,回滚才能快速、可靠。

四、常见嵌入式与服务器场景对比

不同场景对 rootfs 的要求差异很大,下表给出典型对比:

场景 典型存储 rootfs 格式 只读/可写策略 升级与回滚特点
嵌入式设备 eMMC / NAND squashfs + overlay 系统只读,数据可写 A/B 双分区,切换启动槽回滚
工业网关 eMMC ext4 / ubifs 系统只读,配置可写 镜像校验 + 备份分区
服务器 SSD / 云盘 ext4 / xfs 系统盘可写,数据盘独立 快照、容器镜像、包管理回滚
容器环境 宿主机磁盘 overlayfs 镜像只读,容器层可写 镜像版本切换,秒级回滚

可以看到,嵌入式场景更强调断电安全与原子切换,服务器场景更依赖快照与包管理,而容器场景天然具备分层只读特性。理解这些差异,才能为后续章节的升级方案选型打下基础。

五、实操:查看 rootfs 挂载与分区

在目标设备上,可用以下命令快速确认 rootfs 的挂载方式与读写属性:

# 查看根文件系统挂载信息
mount | grep ' / '

# 查看块设备与分区
lsblk -f

# 查看挂载参数(ro 表示只读,rw 表示可写)
cat /proc/mounts | grep ' / '

# 查看 overlay 挂载详情
mount | grep overlay

典型输出中若出现 ro 与 overlay,说明系统采用了只读底层加可写上层的方案,这正是实现可靠回滚的理想结构。

建议在项目初期就确定 rootfs 的分区布局与挂载参数,并写入启动脚本或 fstab。后期再改分区结构,成本会成倍增加。

六、误区与复盘

在实际工程中,常见的误区包括:

  • 把整个 rootfs 当作可写:导致升级时无法保证一致性,回滚困难。
  • 忽略 /etc 与 /var 的迁移:升级后配置丢失或数据被覆盖。
  • 只做单分区升级:升级失败后设备变砖,没有退路。
  • 未校验镜像完整性:损坏的 rootfs 被写入后无法启动。

复盘来看,rootfs 的设计目标不是“能跑起来”,而是“可升级、可回滚、可恢复”。只有把只读系统分区、可写数据分区、启动槽切换和完整性校验结合起来,才能构建真正可靠的升级回滚体系。

rootfs 组成结构与只读/可写分区关系 Linux 内核 启动参数 root= 指定根文件系统设备 只读系统分区(rootfs A/B) squashfs / erofs / ext4 (ro) /bin /sbin /lib /usr /opt /app /etc(默认配置) 内核模块 / 固件 升级时整体替换,支持 A/B 槽切换回滚 可写数据分区(/data) ext4 / ubifs / f2fs (rw) /var 日志缓存 /etc 用户配置 数据库 / 业务数据 升级状态标记 升级时保留,回滚后数据不丢失 overlayfs 联合挂载 lowerdir = 只读系统分区 | upperdir = 可写数据分区 merged = 统一根目录 / → 系统只读、数据可写、升级可回滚 核心思想:系统分区只读、数据分区可写、升级单元原子化