阅读计划-Linux Aufs

Posted by 聪少 on 2019-06-04

AUFS 是一种联合文件系,就是把不同物理位置的目录合并mount到同一个目录中。

检查系统是否支持aufs

1
[root@tyy ~]# grep aufs /proc/filesystems

安装aufs

下载

由于我的系统是Centos 7,所以需要自行安装,具体安装需要根据自己的系统来安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@tyy ~]# cd /etc/yum.repos.d/
[root@tyy yum.repos.d]# ll
总用量 8
-rw-r--r-- 1 root root 675 5月 5 14:34 CentOS-Base.repo
-rw-r--r-- 1 root root 230 5月 5 14:34 epel.repo
# 添加yum源
[root@tyy yum.repos.d]# wget https://yum.spaceduck.org/kernel-ml-aufs/kernel-ml-aufs.repo
--2019-06-04 16:45:44-- https://yum.spaceduck.org/kernel-ml-aufs/kernel-ml-aufs.repo
正在解析主机 yum.spaceduck.org (yum.spaceduck.org)... 149.248.8.242
正在连接 yum.spaceduck.org (yum.spaceduck.org)|149.248.8.242|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:133 [application/octet-stream]
正在保存至: “kernel-ml-aufs.repo”

100%[==================================================================>] 133 --.-K/s 用时 0s

2019-06-04 16:45:46 (48.6 MB/s) - 已保存 “kernel-ml-aufs.repo” [133/133])

[root@tyy yum.repos.d]# ll^C
[root@tyy yum.repos.d]# ls
CentOS-Base.repo epel.repo kernel-ml-aufs.repo
# 安装
[root@tyy yum.repos.d]# yum install kernel-ml-aufs

修改内核

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@tyy yum.repos.d]# vi /etc/default/grub
# 修改参数, 表示启动时选择第一个内核
###################################
GRUB_DEFAULT=0
###################################

# 重新生成grub.cfg
[root@tyy yum.repos.d]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-5.1.6-1.el7.x86_64
Found initrd image: /boot/initramfs-5.1.6-1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-693.2.2.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.2.2.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-f0f31005fb5a436d88e3c6cbf54e25aa
Found initrd image: /boot/initramfs-0-rescue-f0f31005fb5a436d88e3c6cbf54e25aa.img

# 重启计算机
[root@tyy yum.repos.d]# reboot
GRUB_DEFAULT为saved,saved表示下次启动时默认启动上次的内核,这里我们需要更改GRUB_DEFAULT=0, 表示启动时选择第一个内核

查看是否支持

1
2
[root@tyy ~]#  grep aufs /proc/filesystems
nodev aufs

安装完毕!

挂载aufs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建目录
[root@tyy aufs]# mkdir test1
[root@tyy aufs]# mkdir test2
[root@tyy aufs]# mkdir test3
[root@tyy aufs]# mkdir mountSet
# 创建文件
[root@tyy aufs]# touch test1/1.txt
[root@tyy aufs]# touch test2/2.txt
[root@tyy aufs]# touch test3/3.txt
# 联合挂载
[root@tyy aufs]# mount -t aufs -o br=./test1:./test2:./test3 none ./mountSet
[root@tyy aufs]# cd mountSet/
# 已经合并在一个文件夹中
[root@tyy mountSet]# ls
1.txt 2.txt 3.txt
  • -t aufs: 指定挂载类型为aufs
  • -o br=./test1:./test2:./test3: 表示将当前目录下的test1、test2、test3三个文件夹联合到一起
  • none: aufs不需要设备,只依赖于-o br指定的文件夹,所以这里填none即可
  • ./mountSet: 表示将最后联合的结果挂载到当前的mountSet目录下,然后我们就可以往这个目录里面读写文件了

mountSet就是最后这三个目录联合后挂载到的位置,访问这个目录下的文件都会经过aufs文件系统,换句话说,直接访问test1,2,3这三个目录的话,aufs是不知道的。注意: 并不是所有文件系统里的目录都能作为aufs的branch(branch是aufs里面的概念,其实一个branch就是一个目录),目前aufs不支持的有: btrfs aufs eCryptfs。

只读挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[root@tyy aufs]#  mkdir /tmp/aufs && cd /tmp/aufs
[root@tyy aufs]# mkdir dir0 dir1 root
[root@tyy aufs]# echo dir0 > dir0/001.txt
[root@tyy aufs]# echo dir0 > dir0/002.txt
[root@tyy aufs]# echo dir1 > dir1/002.txt
[root@tyy aufs]# echo dir1 > dir1/003.txt
[root@tyy aufs]# pwd
/tmp/aufs
[root@tyy aufs]# tree
.
├── dir0
│   ├── 001.txt
│   └── 002.txt
├── dir1
│   ├── 002.txt
│   └── 003.txt
└── root

3 directories, 4 files
[root@tyy aufs]# sudo mount -t aufs -o br=./dir0=ro:./dir1=ro none ./root
[root@tyy aufs]# ls root/
001.txt 002.txt 003.txt
[root@tyy aufs]# cat root/002.txt
dir0
# 只读不能创建
[root@tyy aufs]# touch root/001.txt
touch: 无法创建"root/001.txt": 只读文件系统
[root@tyy aufs]# touch root/003.txt
touch: 无法创建"root/003.txt": 只读文件系统
# 但是我们可以跳过root目录来修改001.txt和003.txt,
# 因为跳过了root目录,所以就不受aufs控制
[root@tyy aufs]# touch dir0/001.txt
[root@tyy aufs]# touch dir1/003.txt
[root@tyy aufs]# touch dir1/004.txt
[root@tyy aufs]# ls ./root/
001.txt 002.txt 003.txt 004.txt
[root@tyy aufs]# ls ./root/
001.txt 002.txt 003.txt 004.txt
[root@tyy aufs]# rm ./dir1/004.txt
rm:是否删除普通空文件 "./dir1/004.txt"?y

读写挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@tyy aufs]#  mount -t aufs -o br=./dir0=rw:./dir1=ro none ./root
[root@tyy aufs]# ll root/
总用量 12
-rw-r--r-- 1 root root 5 6月 4 18:07 001.txt
-rw-r--r-- 1 root root 5 6月 4 18:06 002.txt
-rw-r--r-- 1 root root 5 6月 4 18:07 003.txt
[root@tyy aufs]# echo "root->write" >> ./root/001.txt
[root@tyy aufs]# echo "root->write" >> ./root/002.txt
[root@tyy aufs]# echo "root->write" >> ./root/003.txt
[root@tyy aufs]# echo "root->write" >> ./root/005.txt
[root@tyy aufs]# ls root/
001.txt 002.txt 003.txt 005.txt
[root@tyy aufs]# ls ./dir0/
001.txt 002.txt 003.txt 005.txt
[root@tyy aufs]# ls ./dir1/
002.txt 003.txt
# dir1里面的内容保持不变
[root@tyy aufs]# cat ./dir1/002.txt
dir1
[root@tyy aufs]# cat ./dir1/003.txt
dir1
# dir0下的文件内容都变了
[root@tyy aufs]# cat ./dir0/001.txt
dir0
root->write
[root@tyy aufs]# cat ./dir0/002.txt
dir0
root->write
  • 当创建一个新文件的时候,新的文件会写入具有rw权限的那个目录,如果有多个目录具有rw权限,那么依赖于挂载时配置的的创建策略
  • 当修改一个具有rw权限目录下的文件时,直接修改该文件
  • 当修改一个只有ro权限目录下的文件时,aufs会先将该文件拷贝到一个rw权限的目录里面,然后在上面进行修改,这就是所谓的COW(copy on write),拷贝的速度依赖于底层branch所在的文件系统。

删除文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@tyy aufs]#  rm ./root/001.txt ./root/002.txt ./root/003.txt ./root/005.txt
rm:是否删除普通文件 "./root/001.txt"?y
rm:是否删除普通文件 "./root/002.txt"?y
rm:是否删除普通文件 "./root/003.txt"?y
rm:是否删除普通文件 "./root/005.txt"?y

# dir0下的文件全被删除了,但dir1目录下的文件没动
[root@tyy aufs]# tree
.
├── dir0
├── dir1
│   ├── 002.txt
│   └── 003.txt
└── root

3 directories, 2 files

# 通过-a参数来看看dir0目录下的内容
# 可以看到aufs为002.txt和003.txt新建了两个特殊的以.wh开头的文件,
# 用来表示这两个文件已经被删掉了
# 这里其他.wh开头的文件都是aufs用到的一些属性文件
[root@tyy aufs]# ls ./dir0/ -a
. .. .wh.002.txt .wh.003.txt .wh..wh.aufs .wh..wh.orph .wh..wh.plnk

上述例子参考地址