Overlay 文件系统

时间:2025-03-25 14:30:06

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