OpenWrt 的 Overlay 文件系统到底是怎么回事?

虽然你折腾过openwrt,但是不一定搞清楚了'/overlay'是什么东西。


一、从"只读系统"说起

很多人第一次刷完 OpenWrt,登录终端一看:

复制代码
df -h

发现系统根目录 / 才几十兆空间,然后 /overlay 却显示 100 多兆。

安装个包、改个配置、重启后还能保存。

于是问题来了:

"这些数据到底存哪儿去了?"

答案就是:Overlay 文件系统(OverlayFS)

它是一种"分层文件系统",专门为这种嵌入式设备设计的。


二、为什么 OpenWrt 要搞一个 Overlay?

要理解 Overlay,得先知道早期路由器的"尴尬处境":

  • 存储空间很小,只有几兆 flash;

  • 固件是打包好的镜像(比如 SquashFS),是只读的;

  • 系统启动后不能改里面的文件。

那怎么办?

总不能每次改配置都得重新编译固件吧?

于是,聪明的 OpenWrt 开发者搞了个"分层文件系统"的主意:

  • 固件那一层保持只读(/rom);

  • 用户写入的内容(配置、软件包)放到另一层(/overlay);

  • 启动时两层叠加在一起,看起来像一个完整的可写系统。

一句话总结:
Overlay 就是给只读系统"贴了一层可写的皮"。


🔧 三、Overlay 的基本原理

Linux 内核早就支持这种"叠加式文件系统",叫 OverlayFS

它的核心机制很简单:

  • lowerdir:底层,只读(比如 /rom

  • upperdir:上层,可写(比如 /overlay/upper

  • workdir:工作区,用来记录文件状态

然后系统会把两层合并起来挂载到 / 根目录,比如这样:

复制代码
overlay / overlay rw,noatime,lowerdir=/rom,upperdir=/overlay/upper,workdir=/overlay/work

这样,系统看起来就像一个完整的可写根目录。

当你修改文件时,内核做的其实是:

  1. 从只读层复制出一个副本;

  2. 放进上层(upperdir);

  3. 之后所有修改都作用在上层;

  4. 删除文件时,会生成一个隐藏的"白名单"文件(whiteout),告诉系统:底层的文件被覆盖掉了。

所以,系统表现是"可写"的,但底层固件其实从没动过。


📦 四、Overlay 在 OpenWrt 里都干了啥

Overlay 在 OpenWrt 里主要负责三件事:

1. 保存配置

所有 /etc/config/* 的改动都写进 overlay 的可写层。

这就是为啥你重启后配置不会丢。

2. 安装软件

opkg install 安装的软件包都被写到 overlay 层。

你刷的固件其实不会被改动。

3. 恢复出厂设置

当你执行:

复制代码
firstboot
# 或者
jffs2reset && reboot

系统会把 overlay 整个清空,再次变成原始固件。

也就是说,"出厂设置"其实就是把 overlay 删除。


五、Overlay 文件系统的演变

老版本的 OpenWrt(比如 10 年前的 Backfire)用的是 mini_foaufs 这类第三方模块。

后来 Linux 内核官方把 OverlayFS 合并进主线(从 3.18 开始),

OpenWrt 也顺势切到了现在这种轻量级的内核原生实现。

优点是:

  • 性能更好

  • 稳定性高

  • 不需要额外内核模块

  • 更容易维护

可以说,现在的 OverlayFS 是整个 OpenWrt 文件系统架构中最核心的一环。


六、Overlay 的典型目录结构

看看这几个目录:

目录 含义
/rom 固件内容,只读
/overlay/upper 你的修改、安装的软件
/overlay/work 系统工作区
/overlay 只是个挂载点
/ 合并后的整体视图

可视化一下更直观:

复制代码
/ (用户看到的)
├── /etc/config/network     → 实际是 /overlay/upper/etc/config/network
├── /bin/busybox            → 实际是 /rom/bin/busybox
└── /usr/lib/opkg/info      → 实际是 /overlay/upper/usr/lib/opkg/info

七、Overlay 的空间与扩容

默认情况下,OpenWrt 把 overlay 放在闪存的一个分区(比如 /dev/mtdblockXX/dev/mmcblk0p9),

空间通常很小,几十兆或者几百兆。

要是你刷的是 eMMC 或 SD 卡的固件,那就更容易扩容。

1️⃣ 查看当前挂载情况

复制代码
mount | grep overlay

2️⃣ 看看空间

复制代码
df -h

如果 overlay 只有 100M,但你还有几十 G 的空闲空间,那说明你可以扩容。

3️⃣ 常见扩容思路

  • 把 overlay 移到更大的分区(比如 /dev/mmcblk0p10);

  • 或者用 extroot 功能,把 USB、SD 卡直接当新的 rootfs 用。

配置方法(/etc/config/fstab):

复制代码
config mount
    option target '/overlay'
    option device '/dev/sda1'
    option fstype 'ext4'
    option enabled '1'

重启后系统就会用新的 overlay。


🧩 八、Overlay 出问题的常见情况

问题 可能原因 解决办法
/overlay 是空的 overlay 挂载失败 检查 /proc/mounts 是否存在 overlay 条目
配置重启后丢失 系统没挂上 overlay,用了临时 RAM 确认 /overlay/upper 是否在可写分区
安装软件提示空间不足 overlay 分区太小 扩容 overlay 或使用 extroot
恢复出厂设置没反应 overlay 层损坏 手动删除 /overlay/upper 后重启

九、原理稍微深入一点

OverlayFS 的核心是 VFS 层的"分层合并"机制。

对内核来说,这是一棵树套另一棵树:

复制代码
读取文件:
  优先找 upperdir
  upperdir 没有,就去 lowerdir
  lowerdir 没有,就报错

写文件:
  如果只在 lowerdir,复制一份到 upperdir
  修改 upperdir 的文件

删除文件:
  在 upperdir 创建一个 .wh 文件(whiteout)

非常轻量,不需要守护进程,也不用缓存同步。

嵌入式环境里简直是神器。

相关推荐
一叶知秋yyds16 天前
openwrt 系统下通过命令行设置允许wan口进行Luci页面的访问
网络·openwrt·luci 开启wan 口访问
st78020617 天前
Debian 13.1 下编译Openwrt24
运维·debian·openwrt
WTCLLB1 个月前
netgear r6220 路由器,刷openwrt后,系统备份还原
linux·网络·智能路由器·openwrt
棒棒的唐3 个月前
winscp 连openwrt 返回127错误码
openwrt·winscp
江西省遂川县常驻深圳大使4 个月前
小米路由器3C刷OpenWrt,更换系统/变砖恢复 指南
智能路由器·openwrt·小米路由器
低温热源5 个月前
Openwrt基本初始化(安装中文包,磁盘扩容)
openwrt
草上爬5 个月前
OpenWrt:使用ALSA实现边录边播
ubuntu·openwrt·record·alsa·play
JASON丶LI6 个月前
家庭路由器改装,搭建openwrt旁路由以及手机存储服务器,实现外网节点转发、内网穿透、远程存储、接入满血DeepSeek方案
服务器·物联网·容器·智能路由器·openwrt
lepton_yang6 个月前
Openwrt下使用ffmpeg配合自建RTSP服务器实现推流
ffmpeg·openwrt·视频服务器