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