在 CentOS(以及一般的 Linux)里使用 overlay(overlayfs)出现“丢数据”,通常不是文件系统本身凭空删文件,而是使用方式或底层配置不当导致的看起来像丢数据。下面按常见原因逐个说明。
一、最常见原因:容器 / 镜像层机制(Docker / podman)
1. 容器层(upperdir)是临时的
overlay 典型结构:
lowerdir = 镜像层(只读)
upperdir = 容器层(可读写)
workdir = 工作目录
merged = 挂载点(你看到的就是这个)
现象:
- 容器里写文件,宿主机上看不到
- 容器删除后文件“没了”
原因:
- 文件只写在
upperdir
- 容器删除 →
upperdir 被清掉
✅ 正确做法:
- 用 volume / bind mount
- 不要依赖容器层持久化数据
二、直接操作 lowerdir / upperdir(非常危险)
2. 你直接改了底层目录
很多人会:
ls /var/lib/docker/overlay2/xxxx/diff
然后:
结果:
- overlay 元数据错乱
- 文件在 merged 看不到
- 看起来像“丢数据”
✅ 永远只操作 merged 挂载点
三、workdir 被清理或损坏
overlay 要求:
workdir 和 upperdir 必须在同一文件系统
workdir 不能手动动
如果:
- workdir 被删
- 被 rsync / cp 破坏
- 跨文件系统
会出现:
四、磁盘满 / inode 满
3. upperdir 所在磁盘满了
overlay 不会报错,而是:
检查:
df -h
df -i
五、使用了不支持 overlay 的底层文件系统
不支持或行为异常的情况:
- NFS
- 某些 CephFS
- 某些老版本 xfs(没开 ftype)
- 加密层叠太多
CentOS 常见坑:
xfs_info / | grep ftype
如果不是 ftype=1,Docker overlay2 会出问题
六、CentOS + Docker 的经典“丢数据”案例
Docker overlay2 + 容器重启
- 写在大路径
- 没挂载 volume
- 重启容器 → 数据没了
七、不是“丢”,是“被覆盖”
overlay 规则:
- lowerdir 有
a
- upperdir 也有
a
- 你看到的是 upperdir 的
如果你:
旧 upperdir 没了 → 看起来像数据丢失
八、如何避免“overlay 丢数据”
✅ 最佳实践
- 只用 merged 挂载点
- 持久数据一定用 volume
- 不手动改 overlay2 目录
- 磁盘有冗余
- xfs 开启 ftype=1
- 监控 inode 和磁盘
九、如果你能补充说明
我可以更精准判断:
- 是 Docker / Podman / 手动 mount overlay
- CentOS 版本(7 / 8 / Stream)
- 具体“丢数据”场景(容器重启?重启机器?写文件消失?)
你可以直接贴:
mount | grep overlay
df -h
xfs_info / | grep ftype
我可以帮你逐条排查。