在 OpenWrt 这样的嵌入式 Linux 系统中,rootfs(根文件系统)通常是只读的。这给我们带来一个问题:如何修改系统配置、安装软件包?答案就是 OpenWrt 的 Overlay 文件系统。它允许我们在只读的 rootfs 之上叠加一个可写的文件系统,所有修改都保存在这个 overlay 中,重启后依然有效。这类似于 Docker 的镜像分层,但实现方式有所不同。
为什么需要 Overlay 文件系统?
嵌入式设备,尤其是路由器,通常使用闪存芯片存储系统。闪存的写入次数有限,频繁写入会缩短设备寿命。直接修改 rootfs 显然不可取。Overlay 文件系统很好地解决了这个问题,将所有写入操作重定向到 overlay 分区,保护了 rootfs 的完整性。
例如,我们想修改 OpenWrt 的防火墙配置,使用 uci 命令修改 /etc/config/firewall 文件,实际上修改的是 overlay 分区中的副本。如果系统崩溃,rootfs 不受影响,依然可以正常启动。
Overlay 文件系统的原理
OpenWrt 使用 OverlayFS 作为 overlay 文件系统的实现。OverlayFS 是一种联合文件系统,它将多个文件系统合并成一个单一的目录结构。在 OpenWrt 中,通常是将只读的 rootfs ( /rom ) 和可写的 overlay 分区 ( /overlay ) 合并成一个可用的根目录 ( / )。
/rom:只读的 rootfs 分区,包含了 OpenWrt 的核心系统文件。/overlay:可写的 overlay 分区,通常挂载在 flash 芯片的另一个分区上,用于存储用户修改和安装的软件包。/overlay/upper存储修改的文件和目录,/overlay/work是 OverlayFS 工作目录,用于临时存储中间状态。/:最终呈现给用户的根目录,是/rom和/overlay的合并视图。当访问某个文件时,系统会首先在/overlay中查找,如果存在,则使用/overlay中的版本;否则,使用/rom中的版本。
举个例子,如果你通过 LuCI 界面修改了网络配置,实际上修改的是 /overlay/upper/etc/config/network 文件。当你重启系统后,OpenWrt 会先加载 /rom 中的原始 network 文件,然后再应用 /overlay/upper/etc/config/network 中的修改,最终生成新的网络配置。
配置和代码分析
OverlayFS 的挂载通常在 OpenWrt 的启动脚本中完成。以下是一个简化的启动脚本示例:
mount -t jffs2 /dev/mtdblock3 /overlay # 挂载 overlay 分区
mount -t overlay overlay -o lowerdir=/rom,upperdir=/overlay/upper,workdir=/overlay/work / # 挂载 OverlayFS
mount -t jffs2 /dev/mtdblock3 /overlay:将 JFFS2 格式的/dev/mtdblock3分区挂载到/overlay目录。/dev/mtdblock3通常是 flash 芯片上用于存储 overlay 分区的块设备。mount -t overlay overlay -o lowerdir=/rom,upperdir=/overlay/upper,workdir=/overlay/work /:使用 overlay 驱动将/rom(lowerdir) 和/overlay/upper(upperdir) 合并成根目录/。workdir是 OverlayFS 的工作目录,用于临时存储中间状态。
查看已挂载的文件系统可以使用 mount 命令:
mount
rootfs on / type rootfs (ro)
/dev/root on /rom type squashfs (ro,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
overlay on / type overlay (rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work)
...省略...
实战避坑经验
- overlay 分区空间不足:这是常见的问题。安装过多软件包或者存储大量数据到
/overlay分区,可能导致空间不足。可以使用df -h命令查看磁盘空间使用情况,清理不必要的文件或增大 overlay 分区。 - 配置错误导致无法启动:如果修改了关键的系统配置文件(例如
/etc/config/network)导致网络无法启动,可以通过 failsafe 模式进入系统进行修复。在启动过程中按住 reset 键,直到指示灯快速闪烁,然后通过 SSH 连接到 192.168.1.1,修复配置文件。 - 使用
firstboot命令恢复出厂设置:如果系统出现严重问题,无法通过 failsafe 模式修复,可以使用firstboot命令恢复出厂设置。注意,这会清空 overlay 分区的所有数据,包括已安装的软件包和用户配置。 - 注意 SquashFS 的限制: RootFS 通常使用 SquashFS 格式,这是一种只读的压缩文件系统,所以不能直接修改 RootFS 里的文件。所有修改都必须通过 OverlayFS 来实现,这限制了我们直接修改底层系统的能力。一些高级玩家可能会选择重新编译 OpenWrt 固件,定制化自己的 RootFS,但通常这不是必要的。
Overlay 文件系统与 Web 后端开发的反向代理的关联性
虽然 OpenWrt 的 Overlay 文件系统主要应用于嵌入式设备,但其思想也与 Web 后端开发中的一些概念有相似之处。例如,在使用 Nginx 作为反向代理时,我们通常不会直接修改原始的配置文件,而是通过创建新的配置文件或修改 overlay 文件来实现配置的更新。这与 OverlayFS 的原理类似,都是通过叠加的方式来实现配置的修改,避免直接修改原始文件,保证系统的稳定性和可维护性。同时,反向代理中的负载均衡策略的选择也需要考虑到服务器资源的限制,防止因为并发连接数过高而导致服务器崩溃。就像 OpenWrt 的 Overlay 文件系统需要考虑 Flash 芯片的写入次数限制一样。
总而言之,深入理解 OpenWrt 的 Overlay 文件系统的原理对于 OpenWrt 开发者和用户来说至关重要。它不仅能够帮助我们更好地管理 OpenWrt 系统,还能够让我们更好地理解嵌入式系统的设计理念。
冠军资讯
键盘上的咸鱼