前几天,关于高级文件系统方面也给大家分享过RAID和LVM,今天给大家分享的这款文件系统可能比这两者更先进,可以将其二者合二为一。第一,它可以使用磁盘或者分区大小不一样的设备组建RAID;第二,它可以做到像LVM一样,随时扩展以及缩减使用空间,LVM支持在线扩展,但不能支持在线缩减,btrfs同时支持在线扩展和在线缩减;并且支持一条命令直接创建出带RAID功能的LV。所以个人体验之后觉得相当不错,分享于大家。


一、btrfs文件系统定义

1、Btrfs (B-tree, Butter FS, Better FS), GPL, Oracle, 2007, CoW 

核心特性:

1、多物理卷支持:btrfs可由多个底层物理卷组成,支持RAID,以及联机“添加”、“移除”,“修改”

2、写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新

3、数据及元数据校验码:checksum

4、子卷:sub_volume

5、快照:支持快照的快照

6、透明压缩


二、brtfs文件系统操作的相关命令

1、创建文件系统

mkfs.btrfs

-L "LABEL"指定brtfs文件系统的卷标

-d <type>: raid0, raid1, raid5, raid6, raid10, single

-f|--force:强制写入btrfs文件系统(会覆盖原有文件系统)

-m <profile>: raid0, raid1, raid5, raid6, raid10, single or dup

-O <feature>:指定创建文件系统时启用的特性

-O list-all: 列出支持的所有feature

如:mkfs.btrfs -L mydata -f /dev/sdb /dev/sdc


2、查看文件系统属性

btrfs filesystem show 查看所有btrfs文件系统的设备属性,等同于使用blkid

btrfs filesystem show –m device 查看某个指定的设备的btrfs文件系统属性


3、挂载文件系统

mount -t btrfs device mount_point


4、挂载透明压缩机制

mount -o compress={lzo|zlib} device mount_point


5、在线缩减文件系统(可以带RAID操作)

btrfs filesystem resize -10G mount_point


6、在线扩展文件系统(可以带RAID操作)

btrfs filesystem resize +5G mount_point

btrfs filesystem resize max mount_point(使用全部空间)


7、查看指定btrfs文件系统的使用详情

btrfs filesytem df mount_point等同于使用df –lh


8、添加设备:man btrfs-device

btrfs device add /dev/sdb mount_point


9、删除设备

btrfs device delete /dev/sdb mount_point


10、平衡数据:man btrfs-banlance

btrfs banlance status mount_point 查看当前数据的平衡状态

btrfs banlance start mount_point 开始平衡数据

btrfs banlance pause mount_point 暂停平衡灵气

btrfs banlance cancel mount_point 取消平衡数据

btrfs banlance resume mount_point 查看数据平衡的摘要


11、修改raid级别:需要raid对成员数量的要求

btrfs balance start -mconvert=raid1|raid0|raid5 mount_point

btrfs balance start -dconvert=raid1|raid0|raid5 mount_point


12、子卷管理:man btrfs-subvolume

btrfs subvolume list mount_point 查看子卷信息

btrfs subvolume create mount_point/subv1 在当前卷下创建子卷

mount -o subvol=subv1 /dev/sdb mount_point 挂载子卷

mount /dev/sdb mount_point 挂父卷,子卷自动挂载

mount -o subvolid=### /dev/sdb mount_point 使用子卷ID挂载子卷

btrfs subvolume delete mount_point/subv1 删除子卷


13、创建快照

btrfs-subvolume snapshot [-r] mount_point/subv1 mount_point/snapshot_subv1


14、删除快照

btrfs-subvolume delete mount_point/snapshot_subv1


15、将ext4转换成btrfs(需要离线操作)

btrfs-convert /dev/sdb1


16、将btrfs转换成ext4(需要离线操作)

btrfs-convert -r /dev/sdb1


17、对文件启用CoW(写时复制)需要系统内核支持

cp --reflink testfile testfile2


三、btrfs文件系统管理实例

1、使用四块同样大小的硬盘,创建一个带有raid10功能的btrfs文件系统

[root@centos7 ~]# lsblk

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

sda      8:0    0   20G  0 disk 

├─sda1   8:1    0  200M  0 part /boot

├─sda2   8:2    0    5G  0 part /

└─sda3   8:3    0    5G  0 part /test

sdb      8:16   0   20G  0 disk 

sdc      8:32   0   20G  0 disk 

sdd      8:48   0   20G  0 disk 

sde      8:64   0   20G  0 disk 

sr0     11:0    1  7.2G  0 rom  

[root@centos7 ~]# mkfs.btrfs -L raid10 -d raid10 -f /dev/sd{b,c,d,e}

btrfs-progs v3.19.1

See http://btrfs.wiki.kernel.org for more information.


Turning ON incompat feature 'extref': increased hardlink limit per file to 65536

Turning ON incompat feature 'skinny-metadata': reduced-size metadata extent refs

adding device /dev/sdc id 2

adding device /dev/sdd id 3

adding device /dev/sde id 4

fs created label raid10 on /dev/sdb

nodesize 16384 leafsize 16384 sectorsize 4096 size 80.00GiB

[root@centos7 ~]# 

btrfs文件系统创建成功,现在可以创建挂载点挂载使用了


[root@centos7 ~]# mkdir /raid10

[root@centos7 ~]# mount /dev/sde /raid10

[root@centos7 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2       5.0G  4.3G  743M  86% /

devtmpfs        899M     0  899M   0% /dev

tmpfs           913M   84K  913M   1% /dev/shm

tmpfs           913M  8.9M  904M   1% /run

tmpfs           913M     0  913M   0% /sys/fs/cgroup

/dev/sda3       4.8G  1.2G  3.4G  26% /test

/dev/sda1       197M  139M   59M  71% /boot

tmpfs           183M   16K  183M   1% /run/user/42

tmpfs           183M     0  183M   0% /run/user/0

/dev/sdb         40G   17M   38G   1% /raid10

[root@centos7 ~]#

由此我们可以看出,raid10创建出来的效果,80G的硬盘做出来的是40G的raid,而且可以直接以其中任意一块盘的名称去挂载使用,但是挂载列表中显示出来的始终是文件系统创建成功时标明带有卷标的那个硬盘或者分区


查看文件系统属性

[root@centos7 ~]# btrfs filesystem show

Label: 'raid10'  uuid: 37cf611f-e4d9-4a42-a599-5e8016b67958

Total devices 4 FS bytes used 896.00KiB

devid    1 size 20.00GiB used 2.02GiB path /dev/sdb

devid    2 size 20.00GiB used 2.00GiB path /dev/sdc

devid    3 size 20.00GiB used 1.01GiB path /dev/sdd

devid    4 size 20.00GiB used 1.01GiB path /dev/sde

btrfs-progs v3.19.1

[root@centos7 ~]# 


查看指定btrfs文件系统的使用详情

[root@centos7 ~]# btrfs filesystem df /raid10

Data, RAID10: total=2.00GiB, used=768.00KiB

Data, single: total=8.00MiB, used=0.00B

System, RAID1: total=8.00MiB, used=16.00KiB

System, single: total=4.00MiB, used=0.00B

Metadata, RAID1: total=1.00GiB, used=112.00KiB

Metadata, single: total=8.00MiB, used=0.00B

GlobalReserve, single: total=16.00MiB, used=0.00B

[root@centos7 ~]# 


添加压缩挂载选项

[root@centos7 ~]# mount -o compress=zlib /dev/sdb /raid10

[root@centos7 ~]# mount

/dev/sda2 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

/dev/sda3 on /test type ext4 (rw,relatime,seclabel,data=ordered)

/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

/dev/sdb on /raid10 type btrfs (rw,relatime,seclabel,compress=zlib,space_cache)

[root@centos7 ~]# 


2、在线缩减空间

[root@centos7 ~]# btrfs filesystem resize -10G /raid10

Resize '/raid10' of '-10G'

[root@centos7 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2       5.0G  4.3G  743M  86% /

devtmpfs        899M     0  899M   0% /dev

tmpfs           913M   84K  913M   1% /dev/shm

tmpfs           913M  8.9M  904M   1% /run

tmpfs           913M     0  913M   0% /sys/fs/cgroup

/dev/sda3       4.8G  1.2G  3.4G  26% /test

/dev/sda1       197M  139M   59M  71% /boot

tmpfs           183M   16K  183M   1% /run/user/42

tmpfs           183M     0  183M   0% /run/user/0

/dev/sdb         35G   17M   18G   1% /raid10

[root@centos7 ~]# btrfs filesystem show

Label: 'raid10'  uuid: 37cf611f-e4d9-4a42-a599-5e8016b67958

Total devices 4 FS bytes used 896.00KiB

devid    1 size 10.00GiB used 2.02GiB path /dev/sdb

devid    2 size 20.00GiB used 2.00GiB path /dev/sdc

devid    3 size 20.00GiB used 1.01GiB path /dev/sdd

devid    4 size 20.00GiB used 1.01GiB path /dev/sde

btrfs-progs v3.19.1

[root@centos7 ~]# 

没有取消挂载的情况下,直接把raid10的空间缩减下来了


3、在线扩展空间

[root@centos7 ~]# btrfs filesystem resize max /raid10

Resize '/raid10' of 'max'

[root@centos7 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2       5.0G  4.3G  743M  86% /

devtmpfs        899M     0  899M   0% /dev

tmpfs           913M   84K  913M   1% /dev/shm

tmpfs           913M  8.9M  904M   1% /run

tmpfs           913M     0  913M   0% /sys/fs/cgroup

/dev/sda3       4.8G  1.2G  3.4G  26% /test

/dev/sda1       197M  139M   59M  71% /boot

tmpfs           183M   16K  183M   1% /run/user/42

tmpfs           183M     0  183M   0% /run/user/0

/dev/sdb         40G   17M   38G   1% /raid10

[root@centos7 ~]# 

没有取消挂载的情况下,直接把raid10的空间扩展到了可用空间最大值了


4、在线转换RAID级别(RAID10->RAID5)

需要分两步进行,先转换元数据,再转换数据

[root@centos7 ~]# btrfs balance start -mconvert=raid5 /raid10

Done, had to relocate 4 out of 6 chunks

[root@centos7 ~]# btrfs filesystem df /raid10

Data, RAID10: total=2.00GiB, used=768.00KiB

Data, single: total=8.00MiB, used=0.00B

System, RAID5: total=96.00MiB, used=16.00KiB

Metadata, RAID5: total=1.03GiB, used=112.00KiB

GlobalReserve, single: total=16.00MiB, used=0.00B

[root@centos7 ~]# 

元数据已经转换好了,接下来转换数据


[root@centos7 ~]# btrfs balance start -dconvert=raid5 /raid10

Done, had to relocate 2 out of 4 chunks

[root@centos7 ~]# btrfs filesystem df /raid10

Data, RAID5: total=3.00GiB, used=1.00MiB

System, RAID5: total=96.00MiB, used=16.00KiB

Metadata, RAID5: total=1.03GiB, used=112.00KiB

GlobalReserve, single: total=16.00MiB, used=0.00B

[root@centos7 ~]# 

元数据和数据都转换完成了


其它选项,就不再给大家一一演示了,大家可以按照我给的命令格式自行实践。虽说btrfs文件系统是一个测试版本,目前也只有Centos7上默认支持,但个人觉得功能还是相当强大,在未来是有市场空间的。如果在我们生产环境允许的情况下,也是可以考虑使用这款文件系统的。只是我们尽量采用RAID和LVM的标准参数思维来创建以及使用这款文件系统,相信它会给你带你事半功倍的效应。