相信不少折腾 OpenWrt 的朋友都遇到过这样的情况:修改了 /etc/config/network 文件,重启后配置生效了。但你有没有想过,OpenWrt 的根文件系统是只读的,那么这些修改又是如何保存下来的呢?答案就是 Overlay 文件系统,它是 OpenWrt 实现可写分区的关键技术。本文将深入剖析 Overlay 文件系统的原理,并通过实际操作和配置案例,带你全面了解它。
什么是 Overlay 文件系统?
Overlay 文件系统,顾名思义,是一种“覆盖”式的文件系统。它将两个(或多个)文件系统合并成一个单一的文件系统。其中,底层的称为 “lower filesystem”,通常是只读的,上层的称为 “upper filesystem”,是可读写的。当用户访问文件时,OverlayFS 会按照一定的规则,决定读取哪个文件系统中的文件。
在 OpenWrt 中,通常将 squashfs 镜像作为 lower filesystem,而 jffs2 分区作为 upper filesystem。squashfs 镜像包含 OpenWrt 的基本系统文件,而 jffs2 分区则用于存储用户的配置数据和安装的软件包。
Overlay 文件系统的工作原理
OverlayFS 的工作原理可以简单概括为:
文件查找: 当用户访问一个文件时,OverlayFS 首先在 upper filesystem 中查找,如果找到,则直接返回该文件。如果没有找到,则在 lower filesystem 中查找,如果找到,则返回该文件。如果两个文件系统都没有找到,则返回 “文件不存在” 错误。
文件修改: 当用户修改一个文件时,OverlayFS 会将该文件从 lower filesystem 复制到 upper filesystem 中,并在 upper filesystem 中进行修改。这个过程称为 “copy-on-write”(COW)。此后,所有对该文件的访问都将从 upper filesystem 中进行。
文件删除: 当用户删除一个文件时,OverlayFS 会在 upper filesystem 中创建一个 “whiteout” 文件,用于标记该文件已被删除。当用户访问该文件时,OverlayFS 会检查 upper filesystem 中是否存在 whiteout 文件,如果存在,则返回 “文件不存在” 错误。

OpenWrt 中的 Overlay 文件系统配置
OpenWrt 中,Overlay 文件系统的配置主要通过 /etc/config/fstab 文件进行管理。以下是一个典型的 /etc/config/fstab 文件的示例:
config mount
option target '/'
option device '/dev/mtdblock6'
option fstype 'squashfs'
option options 'ro,noatime'
option enabled '1'
config mount
option target '/overlay'
option device '/dev/mtdblock7'
option fstype 'jffs2'
option options 'noatime,nodiratime'
option enabled '1'
config mount
option target '/'
option device '/overlay/upper'
option fstype 'overlayfs'
option options 'rw,noatime,lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work'
option enabled '1'
option enabled_fsck '0'
这个配置定义了三个挂载点:
/: 根文件系统,挂载 squashfs 镜像(/dev/mtdblock6),只读。/overlay: overlay 分区,挂载 jffs2 分区(/dev/mtdblock7),用于存储可写数据。/: 使用 overlayfs 将 squashfs 和 jffs2 合并成一个可写的根文件系统。
其中 lowerdir 指定了 lower filesystem 的路径,upperdir 指定了 upper filesystem 的路径,workdir 指定了 overlayfs 的工作目录。workdir 用于存储 overlayfs 在进行 copy-on-write 操作时产生的临时文件。
实战避坑经验
jffs2 空间不足: 如果 jffs2 分区空间不足,会导致 OpenWrt 无法正常启动。解决方法是扩大 jffs2 分区的大小。可以使用
ubiformat和ubimkvol命令重新分区。ubiformat /dev/mtd6 -y -f /tmp/openwrt-ramips-mt7621-xiaomi_mi-router-4a-3g-v2-squashfs-sysupgrade.bin # 擦除分区
ubimkvol /dev/mtd6 -n data -s 100MiB # 创建新的 data 分区 ```
配置错误导致无法启动: 修改
/etc/config/fstab文件时,如果配置错误,可能会导致 OpenWrt 无法正常启动。解决方法是进入 failsafe 模式,然后修改配置文件。
Overlay 文件系统损坏: 如果 overlay 文件系统损坏,可能会导致数据丢失。建议定期备份 overlay 分区的数据。
Overlay 文件系统在其他场景的应用
除了 OpenWrt,OverlayFS 也被广泛应用于其他场景,例如:
- Docker: Docker 使用 OverlayFS 来实现镜像的分层存储,可以有效地节省存储空间。
- Live CD: Live CD 可以使用 OverlayFS 将只读的 CD-ROM 文件系统和可写的内存文件系统合并成一个可用的操作系统。
总而言之,OpenWrt 的 Overlay 文件系统是其灵活性的关键,理解其原理对于优化 OpenWrt 性能和解决问题至关重要。希望本文能够帮助你更深入地了解 Overlay 文件系统。
冠军资讯
加班到秃头