温馨提示×

ubuntu overlay为何丢数据

小樊
43
2026-09-27 23:42:37
栏目: 智能运维

在 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)

表现:

  • 写失败
  • whiteout 失效
  • 文件“消失”

六、硬链接 / 特殊文件问题

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
  • 什么操作后发现“丢了”

我可以直接帮你定位是哪一类问题。

0 踩