
OverlayFS 是 Linux 内核原生的联合挂载文件系统Union Mount核心是写时复制COW将多个目录虚拟合并为统一视图上层优先、下层只读、修改自动拷贝到上层。它是 Docker/containerd 等容器的标准存储驱动也广泛用于 LiveCD、嵌入式只读系统与系统快照。合并多个目录为一个视图写时复制上层修改不影响下层。需要 root 权限才能直接mount。核心结构四层OverlayFS 挂载必须指定 4 个目录upperdir/workdir必须同分区目录读写作用lowerdir只读基础层镜像 / 系统可多层lower1:lower2:...Linux 4.0upperdir可写上层修改层所有写入 / 删除 / 元数据变更都落在这里workdir临时内部临时目录原子 rename、whiteout 等挂载后自动清空merged视图用户看到的统一合并目录挂载点核心原理三大规则1. 同名文件上层覆盖上下层同名文件 →只显示 upperlower 被隐藏。示例lower/file.txt与upper/file.txt共存 →merged/file.txt指向upper/file.txt。2. 同名目录合并展示上下层同名目录 → 内容合并显示上层优先Linux Kernel。示例lower/dir/a.txtupper/dir/b.txt→merged/dir/同时看到a.txt、b.txt。3. 写时复制Copy‑up修改 lower 层文件 → 先完整拷贝到 upper再在 upper 副本上修改lower 原文件不变。删除 lower 层文件 → 在 upper 层创建whiteout白色标记空文件 / 特殊标记模拟删除。修改元数据chmod/chown→ 可开启metacopy仅拷贝元数据不拷贝数据节省空间挂载与使用1. 基础挂载单 lower# 准备目录 mkdir -p /lower /upper /work /merged # 挂载 OverlayFS mount -t overlay overlay \ -o lowerdir/lower,upperdir/upper,workdir/work \ /merged2. 多 lower 层Linux 4.0# lower1 lower2 lower3越左优先级越高 mount -t overlay overlay \ -o lowerdir/lower1:/lower2:/lower3,upperdir/upper,workdir/work \ /merged3. 卸载umount /merged典型应用场景容器存储Docker/containerd镜像多层只读lowerdir 容器可写upperdir→ 高效分层、快速启动、节省存储。Docker 用overlay2驱动原生支持多 lower最多 128 层。LiveCD / 嵌入式只读系统只读 squashfs 作为lowertmpfs/ram 作为upper→ 系统可写但重启后恢复初始状态。系统快照与测试系统根目录为lower临时upper做测试 → 测试后卸载即恢复无残留。关键特性与限制优势内核原生3.18、无额外依赖、性能优于 AUFS。写时复制节省空间、保护底层只读数据。多 lower 层支持适配容器镜像分层。限制upper/work 必须同分区依赖原子 rename。不支持跨节点分布式本地文件系统。大文件首次写时拷贝有短暂 I/O 开销可通过metacopy缓解。部分文件系统如 NFS不适合做 upper需 xattr、d_type 支持。与 AUFS/Btrfs/ZFS 对比特性OverlayFSAUFSBtrfs/ZFS内核集成原生3.18非主线原生多 lower 层4.0 支持支持子卷 / 快照写机制COW文件级COWCOW块级复杂度低中高容器适配最佳overlay2早期 Docker较少OverlayFS 与 pivot_rootpivot_root 是什么一句话把进程的 “/” 根目录彻底换成新的根目录。让进程看不到宿主机的任何文件只能看到你指定的根文件系统比如 OverlayFS 合并后的目录是容器实现「文件系统完全隔离」的核心系统调用对比chroot简陋切换根不安全、不彻底pivot_root安全、干净、内核推荐的真正根切换必须满足的 3 个条件必须在独立 mount namespace 里unshare -m新根必须是一个挂载点Overlay 挂载最常用旧根必须能被挂载覆盖通常把新根放在旧根下pivot_root 命令格式pivot_root 新根 旧根存放目录最常用写法pivot_root . .意思把当前目录作为新根把旧根放到当前目录里之后可以卸载完整可运行脚本root 执行# 1. 创建目录 mkdir -p /tmp/lower /tmp/upper /tmp/work /tmp/merged # 2. 下层放基础文件 echo this is overlay root /tmp/lower/test.txt # 3. 进入隔离命名空间并执行切换根 unshare -m -- sh -c # 挂载 overlayfs mount -t overlay overlay \ -o lowerdir/tmp/lower,upperdir/tmp/upper,workdir/tmp/work \ /tmp/merged # 让新根成为挂载点必须 mount --bind /tmp/merged /tmp/merged # 进入新根 cd /tmp/merged # 关键pivot_root 切换根目录 pivot_root . . # 卸载旧的宿主机根完全隔离 umount -l / # 现在你进入了一个完全独立的迷你容器 exec /bin/sh 进入后效果ls /看不到宿主机任何文件只能看到 Overlay 合并后的根写操作全部落到 upperdir宿主机完全不受影响这就是容器和 chroot 的区别方式安全性彻底性容器使用pivot_root高完全隔离Docker / 容器标准chroot低不彻底老旧工具pivot_root 会彻底切换内核级根目录chroot 只是伪装。和 PRoot 的区别pivot_root内核级、快、需要 rootPRoot用户态、慢、不需要 root你可以理解PRoot 无 root 模拟 pivot_rootpivot_root 真正生产级容器根切换