1. 简介

OverlayFS是一种文件系统,由Miklos Szeredi开发,主要目的是在共同的基础文件系统上建立虚拟化系统。其主要特性是:叠合两种不同的文件系统,一个是只读,另一个可写。这样的特性对用户是透明的,使系统能支持恢复出厂配置等功能。OverlayFS在2014年12月3.18版本中被合并到Linux kernel主线中。著名的OpenWrt和Docker都采用了Overlay技术。

2. 原理

overlay1.png

Overlay表示叠加和覆盖的意思。OverlayFS文件系统则如上图所示:OverlayFS的实现方式是使用一个lower层和一个upper层叠加成为work,其中lower是基础文件系统(所有文件直接呈现到work),upper是叠加在lower之上的文件系统(所有文件也呈现到work,但是如果某个文件名与lower中一致则使用upper中的文件)。

3. 实践

root@hk:~# mkdir -p /overlay/overlaydemo
root@hk:~# cd !$
root@hk:/overlay/overlaydemo# mkdir -p lower upper work merged
root@hk:/overlay/overlaydemo# mkdir -p lower/d1 upper/d1
root@hk:/overlay/overlaydemo# touch lower/f1 upper/f1
root@hk:/overlay/overlaydemo# echo "lower f1"> lower/f1
root@hk:/overlay/overlaydemo# echo "upper f1"> upper/f1
root@hk:/overlay/overlaydemo# touch lower/d1/d1f1 upper/d1/d1f1
root@hk:/overlay/overlaydemo# echo "lower d1 d1f1"> lower/d1/d1f1
root@hk:/overlay/overlaydemo# echo "upper d1 d1f1"> upper/d1/d1f1
root@hk:/overlay/overlaydemo# touch lower/d1/d1fa upper/d1/d1fb
root@hk:/overlay/overlaydemo# echo "lower d1 d1fa"> lower/d1/d1fa
root@hk:/overlay/overlaydemo# echo "upper d1 d1fb"> upper/d1/d1fb
root@hk:/overlay/overlaydemo# tree # 整个目录结构如下所示
.
├── lower
│ ├── d1
│ │ ├── d1f1
│ │ └── d1fa
│ └── f1
├── merged
│ ├── d1
│ │ ├── d1f1
│ │ ├── d1fa
│ │ └── d1fb
│ └── f1
├── upper
│ ├── d1
│ │ ├── d1f1
│ │ └── d1fb
│ └── f1
└── work
└── work

8 directories, 10 files
root@hk:/overlay/overlaydemo# mount -t overlay ol -o lowerdir=lower,upperdir=upper,workdir=work merged
root@hk:/overlay/overlaydemo# df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 461724 0 461724 0% /dev
tmpfs 94388 11348 83040 13% /run
/dev/sda1 64860904 2411580 62432940 4% /
tmpfs 471928 0 471928 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 471928 0 471928 0% /sys/fs/cgroup
/dev/sda15 106858 3195 103664 3% /boot/efi
/dev/sdb1 4060864 8188 3826680 1% /mnt
tmpfs 94388 0 94388 0% /run/user/0
ol 64860904 2411580 62432940 4% /overlay/overlaydemo/merged
root@hk:/overlay/overlaydemo# tree merged/
merged/
├── d1
│ ├── d1f1
│ ├── d1fa
│ └── d1fb
└── f1

1 directory, 4 files
# 由上可知 刚才的f1和d1f1这里只有一份而d1fa和d1fb都存在。
root@hk:/overlay/overlaydemo# cat merged/d1/d1f1
upper d1 d1f1
# 查看d1f1文件发现是upper的d1f1内容
root@hk:/overlay/overlaydemo# cat merged/d1/d1fa
lower d1 d1fa
# 查看d1fa文件发现是lower的d1fa内容
root@hk:/overlay/overlaydemo# cat merged/d1/d1fb
upper d1 d1fb
# 查看d1fb文件发现是upper的d1fb内容
root@hk:/overlay/overlaydemo# cat merged/f1
upper f1
# 查看f1文件发现是upper的f1内容
root@hk:/overlay/overlaydemo# echo "update it...">> merged/d1/d1fa
# 现在修改 最初只在lower中的文件 -- merged/d1/d1fa
root@hk:/overlay/overlaydemo# cat merged/d1/d1fa
lower d1 d1fa
update it...
# 发现 merged中 文件内容已经更新了
root@hk:/overlay/overlaydemo# cat lower/d1/d1fa
lower d1 d1fa
# 而lower中 文件内容 没有更新
root@hk:/overlay/overlaydemo# cat upper/d1/d1fa
lower d1 d1fa
update it...
# 发现upper中 多了一个同名文件d1fa 并且内容为修改后的内容。

4. 其他

  • -t overlay代表使用overlay文件系统
  • ol代表文件系统名称可以随意指定
  • lowerdir可以有多个,用:分隔
  • upperdir和workdir只能有一个
  • workdir必须是个空文件夹,也可以不创建会自动生成
  • merged是最终的挂载目录,我这里是当前文件夹的merged目录