虽然你折腾过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
这样,系统看起来就像一个完整的可写根目录。

当你修改文件时,内核做的其实是:
-
从只读层复制出一个副本;
-
放进上层(upperdir);
-
之后所有修改都作用在上层;
-
删除文件时,会生成一个隐藏的"白名单"文件(whiteout),告诉系统:底层的文件被覆盖掉了。
所以,系统表现是"可写"的,但底层固件其实从没动过。
📦 四、Overlay 在 OpenWrt 里都干了啥
Overlay 在 OpenWrt 里主要负责三件事:
1. 保存配置
所有 /etc/config/*
的改动都写进 overlay 的可写层。
这就是为啥你重启后配置不会丢。
2. 安装软件
opkg install
安装的软件包都被写到 overlay 层。
你刷的固件其实不会被改动。
3. 恢复出厂设置
当你执行:
firstboot
# 或者
jffs2reset && reboot
系统会把 overlay 整个清空,再次变成原始固件。
也就是说,"出厂设置"其实就是把 overlay 删除。
五、Overlay 文件系统的演变
老版本的 OpenWrt(比如 10 年前的 Backfire)用的是 mini_fo 或 aufs 这类第三方模块。
后来 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)
非常轻量,不需要守护进程,也不用缓存同步。
嵌入式环境里简直是神器。