在 Ubuntu(以及其它 Linux 发行版)里,overlay(overlayfs)本身不会“无故”丢数据,但使用方式不对或底层条件不满足时,确实会出现“看起来像丢数据”的情况。下面按常见原因系统说明。
一、最常见原因:overlay 是“联合挂载”,不是“同步复制”
overlayfs 的结构通常是:
lowerdir(只读)
upperdir(可读写)
workdir(内部用)
merged(你看到的总目录)
表现
- 在
lowerdir 里改了文件,但 merged 看不到
- 在
merged 里删了文件,结果 lowerdir 里“还在”,或反过来
- 重启后 upperdir 里的新文件没了
本质
- lowerdir 永远只读
- 写操作只会落在
upperdir
- 删除 lower 里的文件,实际上是创建一个
whiteout(特殊标记)
✅ 如果你直接改了 lowerdir 而没重新挂载 overlay,是“正常行为”,不是丢数据。
二、upperdir / workdir 放错地方(极常见)
错误示例
- upperdir 放在:
- tmpfs(/tmp、/run)
- 容器被销毁后的目录
- 重启后不保留的盘
结果
- 重启 or 容器重建
- upperdir 清空
- 所有“新增/修改”都没了
✅ upperdir 和 workdir 必须放在持久化存储上
三、Docker / Kubernetes 场景下的“丢数据”
1. 容器层本身是可丢弃的
Docker 默认用 overlay2:
- 容器可写层 = upperdir
- 容器删了 → upperdir 删了 → 数据没了
✅ 正确做法:
- 用 volume
- 或 bind mount 到宿主机目录
2. 多个容器/挂载共用同一个 upperdir
- overlay 不支持多个实例共用 upperdir
- 会出现:
✅ 一个 upperdir 只能被一个 overlay 实例使用
四、workdir 不合规导致数据异常
要求
- workdir 和 upperdir:
- 同文件系统
- 不能是被 overlay 挂载的目录
- 不能和 lower/upper 混用
错误示例:
mount -t overlay overlay \
-o lowerdir=/a,upperdir=/a/up,workdir=/a/work \
/mnt
✅ 这会导致不可预期行为,包括数据丢失
五、文件系统不支持 overlay
以下情况 不建议或根本不支持:
- NFS 作为 upperdir
- 某些 FUSE 文件系统
- 加密层嵌套不当(ecryptfs + overlay)
表现:
六、硬链接 / 特殊文件问题
overlayfs:
- 不支持跨层硬链接
- 对 device / socket / pipe 支持有限
某些程序(数据库、Redis、Docker 自身)会:
- 用硬链接
- 用 mmap
结果出现“写进去了但读不到”
七、你“以为丢了”,其实是被覆盖了
典型情况:
- 先 mount overlay
- 再往 lowerdir 写文件
- 再访问 merged
→ merged 不会更新(lower 变更不生效)
八、排查 checklist(实用)
mount | grep overlay
确认:
- upperdir 是否持久
- workdir 是否合法
- 是否多个挂载共用 upper
查看 whiteout:
ls -la upperdir
看到 c--------- 的文件就是删除标记
总结一句话
Ubuntu overlay 丢数据,99% 是因为:
- upperdir 没持久化
- 多个 overlay 共用 upper
- 把 lower 当可写用
- 容器层当存储用
如果你愿意,可以告诉我:
- 是 宿主机 overlay 还是 Docker/K8s
- 具体挂载命令 or docker-compose
- 什么操作后发现“丢了”
我可以直接帮你定位是哪一类问题。