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)

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

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

相关推荐
棒棒的唐2 个月前
winscp 连openwrt 返回127错误码
openwrt·winscp
江西省遂川县常驻深圳大使3 个月前
小米路由器3C刷OpenWrt,更换系统/变砖恢复 指南
智能路由器·openwrt·小米路由器
低温热源3 个月前
Openwrt基本初始化(安装中文包,磁盘扩容)
openwrt
草上爬4 个月前
OpenWrt:使用ALSA实现边录边播
ubuntu·openwrt·record·alsa·play
JASON丶LI4 个月前
家庭路由器改装,搭建openwrt旁路由以及手机存储服务器,实现外网节点转发、内网穿透、远程存储、接入满血DeepSeek方案
服务器·物联网·容器·智能路由器·openwrt
lepton_yang4 个月前
Openwrt下使用ffmpeg配合自建RTSP服务器实现推流
ffmpeg·openwrt·视频服务器
内网渗透5 个月前
OpenWrt 与 Docker:打造轻量级容器化应用平台技术分享
linux·docker·容器·openwrt·软路由
十月ooOO7 个月前
小米AX3000T 路由器如何开启 SSH 安装 OpenWRT 系统,不需要降级 v1.0.91 (2025)
网络·ssh·路由器·openwrt
郁大锤8 个月前
OpenWRT中常说的LuCI是什么——LuCI介绍(一)
openwrt