Overlay文件系统是Docker容器广泛使用的文件系统。写时复制的思想,将文件分成两层,分为lower和upper。
- 写文件的时候,会从lower层复制一份文件到upper层,然后再写。
- 读文件时,假如upper层没有,就去lower层读。
- 删文件时,在upper层添加一个特殊文件标识文件被删除。
Overlay文件系统实际上是一种挂载技术:
比如新建三个文件夹:
mkdir upper lower merged work
# lower层和upper层各包括一个文件
echo "I'm from lower!" > lower/in_lower.txt
echo "I'm from upper!" > upper/in_upper.txt
# 然后创建一个两层都有的文件
echo "I'm from lower! " > lower/in_both.txt
echo "I'm from upper! " > upper/in_both.txt
执行overlay:
mount -t overlay overlay -o lowerdir=/root/overlay/lower,upperdir=/root/overlay/upper,workdir=/root/overlay/work \
/root/overlay/merged
在合并层新建一个文件:
[root@localhost overlay]# touch /root/overlay/merged/
#发现仅upper层有
[root@localhost overlay]# tree .
.
├── lower
│ ├── in_both.txt
│ └── in_lower.txt
├── merged
│ ├── in_both.txt
│ ├── in_lower.txt
│ ├── in_upper.txt
│ └──
├── upper
│ ├── in_both.txt
│ ├── in_upper.txt
│ └──
└── work
└── work
在合并层删除一个文件:
[root@localhost overlay]# rm -f /root/overlay/merged/in_both.txt
# in_both.txt它还是存在的!!!不过你可以查看下它的文件格式
[root@localhost overlay]# tree .
.
├── lower
│ ├── in_both.txt
│ └── in_lower.txt
├── merged
│ ├── in_lower.txt
│ ├── in_upper.txt
│ └──
├── upper
│ ├── in_both.txt
│ ├── in_upper.txt
│ └──
└── work
└── work
[root@localhost overlay]# cat /root/overlay/upper/in_both.txt
cat: /root/overlay/upper/in_both.txt: No such device or address
[root@localhost overlay]# file /root/overlay/upper/in_both.txt
/root/overlay/upper/in_both.txt: character special
修改合并层的一个文件:
[root@localhost overlay]# echo "change in merge" >> merged/in_lower.txt
[root@localhost overlay]# tree .
.
├── lower
│ ├── in_both.txt
│ └── in_lower.txt
├── merged
│ ├── in_lower.txt
│ ├── in_upper.txt
│ └──
├── upper
│ ├── in_both.txt
│ ├── in_lower.txt # 因为修改这里多了一个文件
│ ├── in_upper.txt
│ └──
└── work
└── work
5 directories, 9 files
# 你会发现lower层文件没有更改
[root@localhost overlay]# cat merged/in_lower.txt
I'm from lower!
change in merge
[root@localhost overlay]# cat upper/in_lower.txt
I'm from lower!
change in merge
[root@localhost overlay]# cat lower/in_lower.txt
I'm from lower!
看下文件尺寸你会发现它重新复制了一份:
[root@localhost overlay]# ls -al upper/in_lower.txt
-rw-r--r--. 1 root root 33[这里加了16个字节,我不知道为什么多一个!!!] May 20 14:43 upper/in_lower.txt
[root@localhost overlay]# ls -al lower/in_lower.txt
-rw-r--r--. 1 root root 17 May 20 14:12 lower/in_lower.txt