BTRFS(B-tree,Butter FS,Better FS之称),由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。btrfs 出现的原因是它的开发者起初希望扩展文件系统的功能使得它包括快照、池化pooling、校验以及其它一些功能。虽然和 ext4 无关,它也希望能保留 ext4 中能使消费者和企业受益的功能,并整合额外的能使每个人,尤其是企业受益的功能。对于使用大型软件以及大规模数据库的企业,让多种不同的硬盘看起来一致的文件系统能使他们受益并且使数据整合变得更加简单。删除重复数据能降低数据实际使用的空间,当需要镜像一个单一而巨大的文件系统时使用 btrfs 也能使数据镜像变得简单。
核心特性:
1.多物理卷支持,支持RAID,以联机“添加”、“移除”,“修改”,实在是很方便;raid部分请参考 https://blog.51cto.com/marvin89/2106891
2.关于数据一致性相关的特性,btrfs支持数据及元数据校验码,做checksum,避免了 silent corrupt的出现。而传统文件系统则无法做到这一点。btrfs写时复制更新机制(cow)来保证文件系统的一致性。
3.Btrfs 支持创建极为方便的快照 和克隆 。 btrfs 还能够方便的管理多个物理设备,使得传统的卷管理软件变得多余。
4.透明压缩,目录索引,延迟分配,节约硬盘存储空间,提高搜索效率。


具体实现

1、准备4个分区,最好是4块磁盘,这里实验方便在一块磁盘上实现(raid在不同磁盘上实现才有意义)

/dev/sdc1            2048    20971519    10484736    5  Extended
/dev/sdc5            4096     2101247     1048576   83  Linux
/dev/sdc6         2103296     4200447     1048576   83  Linux
/dev/sdc7         4202496     6299647     1048576   83  Linux

2.1、创建btrfs文件系统

[root@localhost ~]# mkfs.btrfs -L mydata -f /dev/sdb{5,6,7,8}
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.

Label:              mydata
UUID:               54161207-74c5-4851-b945-70c510a914c1
Node size:          16384
Sector size:        4096
Filesystem size:    4.00GiB
Block group profiles:
  Data:             RAID0           409.50MiB
  Metadata:         RAID1           204.75MiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  4
Devices:
   ID        SIZE  PATH
    1     1.00GiB  /dev/sdb5
    2     1.00GiB  /dev/sdb6
    3     1.00GiB  /dev/sdb7
    4     1.00GiB  /dev/sdb8

2.2 挂载

[root@localhost ~]# mount -U 54161207-74c5-4851-b945-70c510a914c1 /mnt/t1
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       4.0G   17M  3.6G    1% /mnt/t1
#等同于mount /dev/sdb5  /mnt/t1

2.3 指定数据元数据都是用raid1 创建

[root@localhost ~]# umount /mnt/t1
[root@localhost ~]# mkfs.btrfs -L mydata -d raid1 -m raid1 -f /dev/sdb{5,6,7,8}
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.

Label:              mydata
UUID:               6a2fe147-c2e3-4c98-b6cb-be6da13886c2
Node size:          16384
Sector size:        4096
Filesystem size:    4.00GiB
Block group profiles:
  Data:             RAID1           204.75MiB
  Metadata:         RAID1           204.75MiB
  System:           RAID1             8.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  4
Devices:
   ID        SIZE  PATH
    1     1.00GiB  /dev/sdb5
    2     1.00GiB  /dev/sdb6
    3     1.00GiB  /dev/sdb7
    4     1.00GiB  /dev/sdb8

[root@localhost ~]# mount /dev/sdb5 /mnt/t1    
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       2.0G   17M  1.8G    1% /mnt/t1   #由此可见数据有raid0到raid1 一半用来做备份  元数据都是204.75mb  可写部分1.8G

[root@localhost ~]# btrfs filesystem df /mnt/t1
Data, RAID1: total=204.75MiB, used=128.00KiB
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=204.75MiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B

3、在raid1的基础上写入数据

[root@localhost ~]# dd if=/dev/zero of=/mnt/t1/a  bs=1024 count=1048576
[root@localhost ~]# dd if=/dev/zero of=/mnt/t1/b  bs=1024 count=1048576

[root@localhost t1]# ll -h
total 1.8G
-rw-r--r--. 1 root root 1.0G Apr 24 09:04 a
-rw-r--r--. 1 root root 810M Apr 24 09:06 b
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       2.0G  1.9G   64K  100% /mnt/t1

[root@localhost ~]# btrfs filesystem df /mnt/t1      #btrfs的df用来观察当时  文件系统的存储情况
Data, RAID1: total=1.79GiB, used=1.79GiB             #数据部分
System, RAID1: total=8.00MiB, used=16.00KiB
Metadata, RAID1: total=204.75MiB, used=2.00MiB         #在创建玩文件系统后元数据是固定的
GlobalReserve, single: total=16.00MiB, used=0.00B

4、联机状态下修改raid模式

[root@localhost t1]# rm -f {a,b}

[root@localhost ~]# btrfs balance start -dconvert=raid0 -mconvert=raid1  /mnt/t1
Done, had to relocate 4 out of 4 chunks

5.1、移除设备

[root@localhost ~]# btrfs device delete /dev/sdb8 /mnt/t1    #参考 man btrfs-device remove 是remove的别名   会自动移除数据 The operation can take long as it needs to move all data from the device.
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       3.0G  418M  1.8G   19% /mnt/t1

5.2、添加设备

[root@localhost ~]# btrfs device add  /dev/sdb8 /mnt/t1
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       4.0G  418M  2.9G   13% /mnt/t1

6.1、缩减

[root@localhost ~]# btrfs filesystem resize -700M  /mnt/t1
Resize '/mnt/t1' of '-700M'
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       3.4G  418M  2.1G   17% /mnt/t1

6.2扩展到最大

[root@localhost ~]# btrfs filesystem resize max  /mnt/t1
Resize '/mnt/t1' of 'max'
[root@localhost ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb5       4.0G  418M  3.1G   12% /mnt/t1

7、缩减还是设备移动之后做下数据均匀

[root@localhost ~]# btrfs balance start /mnt/t1

子卷跟快照

1、创建子卷

[root@localhost ~]# btrfs subvolume  create  /mnt/t1/logs
Create subvolume '/mnt/t1/logs'

[root@localhost ~]#  btrfs subvolume  list /mnt/t1
ID 281 gen 196 top level 5 path logs

2、子卷默认是跟着父卷的,也可以单独挂载 | 子卷一般不单独挂载,在父卷下可以使用快照卷

[root@localhost ~]# umount /mnt/t1
[root@localhost ~]# mount -o subvol=logs /dev/sdb5 /mnt/t1   #mount -o subvolid=281 /dev/sdb5 /mnt/t1 
[root@localhost ~]# touch /mnt/t1/a
[root@localhost ~]# btrfs subvolume show /mnt/t1/
/mnt/t1
    Name:           logs
    UUID:           7bb3b73f-931c-5a4b-811d-e0290075c534
    Parent UUID:        -
    Received UUID:      -
    Creation time:      2018-04-24 10:06:45 -0400
    Subvolume ID:       281
    Generation:         196
    Gen at creation:    196
    Parent ID:      5
    Top level ID:       5
    Flags:          -
    Snapshot(s):

[root@localhost ~]# umount /mnt/t1
[root@localhost ~]# mount /dev/sdb5 /mnt/t1
[root@localhost ~]# cat /mnt/t1/logs/abc  #子卷中的文件依然存在

3、 创建快照

#现在logs下面创建一个标记文件
[root@localhost logs]# touch a
[root@localhost logs]# echo aa > a

#快照   还是要注意大小,快照是记录源文件变化量,  源文件跟快照都在同一个文件系统中
[root@localhost logs]# btrfs subvolume snapshot /mnt/t1/logs/   /mnt/t1/logs_snapshot
Create a snapshot of '/mnt/t1/logs/' in '/mnt/t1/logs_snapshot'

#快照验证

[root@localhost logs]# tail -1 ../logs_snapshot/a
aa
[root@localhost logs]# echo bb >> a
[root@localhost logs]# tail -1 ../logs_snapshot/a
aa

[root@localhost logs]# touch b
[root@localhost logs]# ls ../logs_snapshot/
a

4、删除快照

[root@localhost logs]# btrfs subvolume  delete  /mnt/t1/logs_snapshot/
Delete subvolume (no-commit): '/mnt/t1/logs_snapshot'

5、写实复制功能(单个文件快照)

#https://bugs.centos.org/view.php?id=14228    目前bug
[root@localhost logs]# cp --reflink=auto fstab fstab.bak
[root@localhost logs]# echo 888 >> fstab
[root@localhost logs]# tail -1 fstab.bak
UUID=943c7e04-b733-42fe-a1e2-eabf93693f6b swap                    swap    defaults        0 0

#通过写时复制完成

6、删除子卷

[root@localhost ~]# btrfs subvolume delete /mnt/t1/logs/
Delete subvolume (no-commit): '/mnt/t1/logs'