Docker 要使用 Btrfs 文件系统,我们先了解一下 Btrfs 的一些用法:
# mkfs.btrfs -f -L testbtrfs /dev/sdd1 /dev/sdd2 /dev/sdd3
-f 是强行覆盖已有分区,上面命令建立了一个 testbtrfs 卷,是个3节点的磁盘阵列,其中 RAID0 保存数据, RAID1 保存 metadata 。注意,这个阵列的 RAID0 会把数据按序分配到所有节点上,而 RAID1 有点特别,metadata 会生成2份,按照 round-robin 的方式决定把两份数据到所有节点的某两个节点上。
# blkid /dev/sdd*
/dev/sdd: UUID="e9b11649" UUID_SUB="af7ce22c" TYPE="btrfs"
/dev/sdd1: LABEL="testbtrfs" UUID="b6a05243" UUID_SUB="4770cbfb" TYPE="btrfs"
/dev/sdd2: LABEL="testbtrfs" UUID="b6a05243" UUID_SUB="b4524e3d" TYPE="btrfs"
/dev/sdd3: LABEL="testbtrfs" UUID="b6a05243" UUID_SUB="7e279107" TYPE="btrfs"
查看 blkid ,会发现三个分区的UUID是一样的,但是UUID_SUB不一样。
# mkdir /btrfs
# mount /dev/sdd3 /btrfs
# vi /etc/fstab
------
LABEL=testbtrfs /btrfs btrfs defaults 0 0
或者
UUID=b6a05243 /btrfs btrfs defaults 0 0
------
两种挂载方式
# btrfs filesystem df /btrfs
Data, RAID0: total=3.00GB, used=0.00
Data: total=8.00MB, used=0.00
System, RAID1: total=8.00MB, used=4.00KB
System: total=4.00MB, used=0.00
Metadata, RAID1: total=1.00GB, used=24.00KB
Metadata: total=8.00MB, used=0.00
查看分区的空间
# btrfs filesystem show /dev/sdd1
failed to open /dev/sr0: No medium found
Label: 'testbtrfs' uuid: b6a05243
Total devices 3 FS bytes used 6.95GB
devid 3 size 11.72GB used 4.01GB path /dev/sdd3
devid 2 size 11.72GB used 3.01GB path /dev/sdd2
devid 1 size 11.72GB used 4.02GB path /dev/sdd1
直接查看原始分区
# btrfs subvolume create /btrfs/sub1
# btrfs subvolume create /btrfs/sub2
# btrfs subvolume create /btrfs/sub2/sub3
建立子卷
建好后的结构如上图
# btrfs subvolume list /btrfs
ID 260 gen 22 top level 5 path sub1
ID 261 gen 22 top level 5 path sub2
ID 262 gen 22 top level 5 path sub2/sub3
用btrfs命令查看
# umount /btrfs/
# mount -o subvolid=261 /dev/sdd1 /btrfs/
把sub2挂接成/btrfs
# btrfs subvolume set-default 261 /btrfs
设置缺省卷
LABEL=testbtrfs /btrfs defaults,subvolid=269 0 0
fstab挂接非缺省卷的方法
btrfs subvolume snapshot /btrfs/sub1 /btrfs/sub1/snapshot
建立子卷快照
# mv /btrfs/snapshotname /btrfs/subvolumename
将快照回滚到正常的卷