众所周知,overlayfs 引入了 lower 和 upper 两层,再加一个 merge 层展示,低层的文件只读不写,上层的文件可以发生读写,对于增加文件和修改文件都很容易理解,如果是删除文件或者对文件重命名,overlayfs 又是如何解决?
初始化
$ pwd
/root/go/mydocker/merged
$ ls bin/
diff i2cget mkfifo resume tcpsvd zcat
dirname i2cset mkfs.ext2 rev tee zcip
dmesg i2ctransfer mkfs.minix rm telnet
dnsd id mkfs.vfat rmdir telnetd
dnsdomainname ifconfig mknod rmmod test
shell 1 处于 merged 层中可以查看 bin 下有很多文件
$ pwd
/root/go/mydocker/upper
$ ls
shell 2 处于 upper 层中可以看到文件夹下是空的
文件删除
$ rm -rf bin/test
$ ls -la bin/
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 who
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 whoami
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 whois
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 xargs
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 xxd
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 xz
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 xzcat
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 yes
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 zcat
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 zcip
shell 1 中删除其中一个文件
$ ls -la bin/
c--------- 1 root root 0, 0 Feb 21 17:27 test
shell 2 中可以看到这个文件的第一个 flag 打上了一个 c 标签,这在最终 merge 时就会被隐藏掉
文件重命名
$ mv bin/zcip bin/zcip2
$ ls -la bin/
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 which
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 who
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 whoami
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 whois
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 xargs
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 xxd
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 xz
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 xzcat
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 yes
-rwxr-xr-x 404 root root 1021496 Jan 18 05:58 zcat
-rwxr-xr-x 1 root root 1021496 Jan 18 05:58 zcip2
shell 1 中将 zcip 文件修改为 zcip2
$ ls -la bin/
c--------- 1 root root 0, 0 Feb 21 17:27 test
c--------- 1 root root 0, 0 Feb 21 17:31 zcip
-rwxr-xr-x 1 root root 1021496 Jan 18 05:58 zcip2
shell 2 中可以看到 zcip 被打上了一个 c flag,并且将 zcip 复制了一份为 zcip2
总结
删除是通过同名文件并且打上一个 c flag 表示的,重命名是通过复制+删除实现的