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 当作可写:导致升级时无法保证一致性,回滚困难。
- 忽略 /etc 与 /var 的迁移:升级后配置丢失或数据被覆盖。
- 只做单分区升级:升级失败后设备变砖,没有退路。
- 未校验镜像完整性:损坏的 rootfs 被写入后无法启动。
复盘来看,rootfs 的设计目标不是“能跑起来”,而是“可升级、可回滚、可恢复”。只有把只读系统分区、可写数据分区、启动槽切换和完整性校验结合起来,才能构建真正可靠的升级回滚体系。