btrfs(B-tree filesystem),由Oracle 2007年后研发,这是一个技术预览版的文件系统,推出用于弥补、替换Linux中的Ext系列文件系统。   重要技术特性:    1)支持写时复制(COW),保证数据的可靠性    2)更好的扩展性支持,利用动态inode创建、Extent、B-tree实现    3)支持非常大的单个文件与总容量    4)支持文件快速检查功能,基于数据及元数据校验码机制,将数据、元数据的某些属性保存下来,下次读取时可根据这些属性快速检测是否受损,如果损坏还能尝试修复,这样极大的提高数据的准确性    5)支持将多个物理卷组成一个Btrfs文件系统,并内置RAID,支持将数据、元数据以RAID、single、dup等方式在多个物理卷中存储。    6)支持创建子卷,可以创建多个子卷,子卷可以单独挂载    7)支持透明压缩功能,自动占用CPU资源对传入/出的文件进行压缩/解压    8)支持快照,支持对子卷、文件进行快照,还能对快照进行快照       Ext系列对比Btrfs系统:    参考: https://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/index.html

**btrfs 文件系统管理命令: **   btrfs subvolume     用于管理子卷   btrfs filesystem    用于管理文件系统   btrfs balance    用于调整数据、元数据存储负载均衡   btrfs device    用于管理设备   btrfs rescue    用于救援   btrfs quota     用于设置磁盘配额 一、将多个设备文件创建为一个Btrfs文件系统

mkfs.btrfs [options] Device ...
	-L 	指定卷标
	-m	指定元数据如何跨设备文件存储,可以为 raid0, raid1, raid5, raid6, raid10, single or dup。
	-d	指定数据如何跨设备文件存储,可以为raid0, raid1, raid5, raid6, raid10 or single or dup
	-f	强制格式化

[root@localhost ~]# mkfs.btrfs  -f  -L  myBtrfs  /dev/sdb /dev/sdc
btrfs-progs v4.4.1
See http://btrfs.wiki.kernel.org for more information.

Label:              myBtrfs
UUID:               144d67a0-5235-491b-bc0c-5edeb63e94f4
Node size:          16384
Sector size:        4096
Filesystem size:    40.00GiB
Block group profiles:
  Data:             RAID0             2.01GiB		发现数据以RAID0存放
  Metadata:         RAID1             1.01GiB		发现元数据以RAID1存放
  System:           RAID1            12.00MiB
SSD detected:       no
Incompat features:  extref, skinny-metadata
Number of devices:  2
Devices:
   ID        SIZE  PATH
    1    20.00GiB  /dev/sdb
    2    20.00GiB  /dev/sdc
		```
**二、调整Btrfs逻辑边界**

查看Btrfs文件系统由sdb、sdc组成,大小为40G [root@localhost ~]# btrfs filesystem show /data/ Label: 'myBtrfs' uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4 Total devices 2 FS bytes used 896.00KiB devid 1 size 20.00GiB used 2.01GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc 将Btrfs文件系统缩减10G的大小 [root@localhost ~]# btrfs filesystem resize -10G /data/ Resize '/data/' of '-10G'

[root@localhost ~]# btrfs filesystem show /data/ Label: 'myBtrfs' uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4 Total devices 2 FS bytes used 896.00KiB devid 1 size 10.00GiB used 2.01GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc ``` 三、为原Btrfs文件系统添加、删除物理设备

添加sdd、sde设备
[root@localhost ~]# btrfs  device add  /dev/sdd  /dev/sde /data/

[root@localhost ~]# btrfs  filesystem show  /data/
Label: 'myBtrfs'  uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
        Total devices 4 FS bytes used 896.00KiB
        devid    1 size 10.00GiB used 2.01GiB path /dev/sdb
        devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
        devid    3 size 20.00GiB used 0.00B path /dev/sde
        devid    4 size 20.00GiB used 0.00B path /dev/sdd

删除sde设备
[root@localhost ~]# btrfs device  del  /dev/sde /data

[root@localhost ~]# btrfs filesystem show /data
Label: 'myBtrfs'  uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
        Total devices 3 FS bytes used 896.00KiB
        devid    1 size 10.00GiB used 2.01GiB path /dev/sdb
        devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
        devid    4 size 20.00GiB used 0.00B path /dev/sdd

相比LVM ,Btrfs不需要人工把数据此该磁盘中移出来,Btrfs自动完成,功能更为强大
四、管理数据、元数据存放磁盘及方式
当新添加一块硬盘进来后,需要将数据均匀存放到各个磁盘上,此时可以这样做:
[root@localhost ~]# btrfs  balance  start /data/
Done, had to relocate 3 out of 3 chunks

当数据过大时可以使用pause暂停,resume恢复。

修改数据的存放方式为RAID5:
[root@localhost ~]# btrfs  balance start -dconvert=raid5 /data/
Done, had to relocate 1 out of 3 chunks
修改元数据的存放方式为RAID1:
[root@localhost ~]# btrfs  balance start -mconvert=raid1 /data/
Done, had to relocate 2 out of 4 chunks

五、启用透明压缩机制

压缩算法有lzo与zlib两种,通过mount重新挂载时选择
[root@localhost ~]# mount -o remount,compress=lzo /dev/sdb /data/
[root@localhost ~]# cp /var/log/messages /data/
对比查看还是有点效果的,原来128K现在压缩后127K...
[root@localhost ~]# ll -h /var/log/messages /data/messages 
-rw-------. 1 root root 127K Jan  4 06:24 /data/messages
-rw-------. 1 root root 128K Jan  4 06:25 /var/log/messages

六、管理子卷

创建子卷log、Coo:
[root@localhost ~]# btrfs  subvolume  create  /data/log
Create subvolume '/data/log'
[root@localhost ~]# btrfs  subvolume  create  /data/Coo
Create subvolume '/data/Coo'

查看子卷的简要信息:
[root@localhost data]# btrfs  subvolume list /data/ 
ID 264 gen 95 top level 5 path log
ID 265 gen 92 top level 5 path Coo

查看子卷的详细信息:
[root@localhost ~]# btrfs  subvolume  show  /data/log/
/data/log
        Name:                   log			#子卷名字
        UUID:                   b22a5c9d-05f7-da41-89c7-d4dcceae9a0e	#子卷UUID
        Parent UUID:            -
        Received UUID:          -
        Creation time:          2018-01-04 06:32:19 -0800
        Subvolume ID:           264				#子卷ID
        Generation:             91
        Gen at creation:        91
        Parent ID:              5
        Top level ID:           5
        Flags:                  -
        Snapshot(s):
				
[root@localhost ~]# btrfs  subvolume  show  /data/Coo
/data/Coo
        Name:                   Coo
        UUID:                   a5552185-a8b4-2543-b2ac-f0e348668c8e	
        Parent UUID:            -
        Received UUID:          -
        Creation time:          2018-01-04 06:32:46 -0800
        Subvolume ID:           265
        Generation:             92
        Gen at creation:        92
        Parent ID:              5
        Top level ID:           5
        Flags:                  -
        Snapshot(s):

挂载子卷,一般如果挂载父卷则自动挂载所有子卷。

还能单独挂载子卷:
[root@localhost ~]# mount  -o subvol=log  /dev/sdb /mnt/
[root@localhost ~]# mount | grep mnt
/dev/sdb on /mnt type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=264,subvol=/log)

[root@localhost ~]# mount -o  subvolid=265 /dev/sdb /media/ 
[root@localhost ~]# mount | grep media
/dev/sdb on /media type btrfs (rw,relatime,seclabel,compress=lzo,space_cache,subvolid=265,subvol=/Coo)

七、快照卷的管理

创建快照卷:
[root@localhost ~]# btrfs subvolume  snapshot  /data/log /data/log_snap
Create a snapshot of '/data/log' in '/data/log_snap'
查看子卷的信息:
[root@localhost data]# btrfs  subvolume list /data/ 
ID 264 gen 95 top level 5 path log
ID 265 gen 92 top level 5 path Coo
ID 266 gen 93 top level 5 path log_snap

删除快照卷:
[root@localhost data]# btrfs  subvolume  delete /data/log_snap/
Delete subvolume (no-commit): '/data/log_snap'

对快照卷做快照:
注:创建快照之前最好将磁盘设为只读挂载
[root@localhost data]# btrfs  subvolume  snapshot /data/log_snap/ /data/log_snap_snap
Create a snapshot of '/data/log_snap/' in '/data/log_snap_snap'
对文件做快照(只能在Btrfs中实现):
[root@localhost data]# cp --reflink  1.t  1.t_snap

恢复快照卷:
[root@localhost data]# btrfs  subvolume  delete  log
Delete subvolume (no-commit): '/data/log'

[root@localhost data]# mv  log_snap log

八、文件系统转换、回退

将EXT4转换为Btrfs:
[root@localhost ~]# fsck -f /dev/sde 			#检查磁盘是否损坏、剩余空间
fsck from util-linux 2.23.2
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sde: 11/1310720 files (0.0% non-contiguous), 126322/5242880 blocks

[root@localhost ~]# btrfs-convert  /dev/sde 		#开始转换
create btrfs filesystem:
        blocksize: 4096
        nodesize:  16384
        features:  extref, skinny-metadata (default)
creating btrfs metadata.
copy inodes [o] [         0/        11]
creating ext2 image file.
cleaning up system chunk.
conversion complete.

[root@localhost ~]# btrfs  filesystem show 
Label: 'myBtrfs'  uuid: 144d67a0-5235-491b-bc0c-5edeb63e94f4
        Total devices 3 FS bytes used 10.77MiB
        devid    1 size 10.00GiB used 3.00GiB path /dev/sdb
        devid    2 size 20.00GiB used 2.31GiB path /dev/sdc
        devid    4 size 20.00GiB used 2.31GiB path /dev/sdd

Label: none  uuid: 3e61c271-cfcb-42c0-b3f5-a62e9dc8b98a
        Total devices 1 FS bytes used 494.21MiB
        devid    1 size 20.00GiB used 20.00GiB path /dev/sde


回滚:
[root@localhost ~]# btrfs-convert  -r  /dev/sde 
rollback complete.
[root@localhost ~]# blkid  /dev/sde
/dev/sde: UUID="39eb4603-ad53-4fb7-8d23-d69732921539" TYPE="ext4"