1 btrfs文件系统

  btrfs文件系统在生产环境应用还不多,技术还不太成熟,因此,本文仅仅简单学习.

1.1 btrfs文件系统核心特性

  1)多物理卷支持:btrfs可由多个底层物理卷组成(可以是单块物理磁盘,也可以是某一分区等);支持RAID,支持联机在线热“添加”、“移除”,“修改”;
  2)写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;
  3)数据及元数据校验码:checksum ,此机制可以保证数据的可靠性;
  4)支持多子卷:sub_volume;
  5)快照:支持快照的快照(增量快照);
  6)透明压缩:(lzo|zlib压缩算法自动压缩)节约存储空间,但会消耗更多的CPU时钟周期.

  注意:仅仅在单块物理磁盘的不同分区创建btrfs文件系统没有太大意义,多块磁盘组合创建为btrfs文件系统才有意义.

1.2 管理btrfs文件系统需要掌握的命令

  掌握btrfs管理命令就可以熟练操作btrfs文件系统了,其主要命令如下(其命令中还有很多子命令,具体查看man帮助手册):

命令说明
mkfs.btrfs

含义:mkfs.btrfs - create a btrfs filesystem 创建btrfs文件系统

Usage: mkfs.btrfs [options] dev [ dev ... ]

指定物理磁盘设备或者磁盘分区,并将其创建为btrfs文件系统

btrfs filesystem

含义:btrfs-filesystem - command group of btrfs that usually work on the whole filesystem

  查看btrfs属性信息

usage: btrfs filesystem [<group>] <command> [<args>]

btrfs device

含义:btrfs-device - manage devices of btrfs filesystems ,管理btrfs文件系统设备

usage: btrfs device <command> [<args>]

btrfs balance

含义:btrfs-balance - balance block groups on a btrfs filesystem ,均衡btrfs文件系统数据相关

usage: btrfs balance <command> [options] <path>

btrfs-convert

含义:btrfs-convert - convert from ext2/3/4 filesystem to btrfs in-place 文件系统格式互转

usage: btrfs-convert [options] device

btrfs subvolume

含义:btrfs-subvolume - manage btrfs subvolumes ,管理btrfs文件系统子卷

usage: btrfs subvolume <command> <args>

btrfs check

含义:btrfs-check - check or repair an unmounted btrfs filesystem

  检测一个未被挂载的btrfs文件系统

usage: btrfs check [options] <device>

btrfs rescue

含义:btrfs-rescue - Recover a damaged btrfs filesystem

  恢复救援损坏的btrfs文件系统

usage: btrfs rescue <command> [options] <path>

btrfs inspect-internal

含义:btrfs-inspect-internal - query various internal information

usage: btrfs inspect-internal <command> <args>

btrfs property 
btrfs qgroup 
btrfs quota 
btrfs receive 
btrfs replace 
btrfs restore

含义:Try to restore files from a damaged filesystem (unmounted)

  尝试从一个未被挂载的损坏的btrfs文件系统中恢复数据

usage: btrfs restore [options] <device> <path> | -l <device>

btrfs scrub 
btrfs send 
btrf stune 

1.3 简单实践btrfs文件系统

  实践过程:虚拟机新添加3块20G虚拟磁盘测试并创建btrfs文件系统.

[root@localhost ~]# fdisk -l|grep "^Disk /dev/sd[abcd]\>"|cut -d":" -f1
Disk /dev/sda	#<==系统盘
Disk /dev/sdb	#<==新添加的20G虚拟磁盘
Disk /dev/sdc	#<==新添加的20G虚拟磁盘
Disk /dev/sdd	#<==新添加的20G虚拟磁盘
[root@localhost ~]# mkfs.btrfs -L mydata /dev/sdb /dev/sdc		#<==直接使用此命令即可创建指定卷标的btrfs文件系统
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.

Label:              mydata				#<==卷标
UUID:               8c6abba9-73dc-4e60-a87f-e313dca6a007	#<==UUID
Node size:          16384
Sector size:        4096	#<==扇区大小
Filesystem size:    40.00GiB	#<==文件系统大小
Block group profiles:
  Data:             RAID0             2.00GiB
  Metadata:         RAID1             1.00GiB
  System:           RAID1             8.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

[root@localhost ~]# btrfs filesystem show
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
	Total devices 2 FS bytes used 112.00KiB
	devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
	devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# btrfs filesystem show /dev/sdb		#<==同一个btrfs文件系统卷,其UUID是一样的
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
	Total devices 2 FS bytes used 112.00KiB
	devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
	devid    2 size 20.00GiB used 2.01GiB path /dev/sdc

[root@localhost ~]# btrfs filesystem show /dev/sdc
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
	Total devices 2 FS bytes used 112.00KiB
	devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
	devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# blkid /dev/sdb		#<==同一个btrfs文件系统卷UUID一样,但子卷的UUID不一样,因此,支持多卷
/dev/sdb: LABEL="mydata" UUID="8c6abba9-73dc-4e60-a87f-e313dca6a007" UUID_SUB="1a163afe-6733-4f11-9961-24c125bf5927" TYPE="btrfs"
[root@localhost ~]# blkid /dev/sdc
/dev/sdc: LABEL="mydata" UUID="8c6abba9-73dc-4e60-a87f-e313dca6a007" UUID_SUB="a3306dfe-2a00-45a5-b25b-f82fafe7649a" TYPE="btrfs"
[root@localhost ~]# btrfs filesystem show --mounted		#<==显示已挂载的btrfs文件系统
[root@localhost ~]# btrfs filesystem show --all-devices		#<==默认不加,就是显示所有
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
	Total devices 2 FS bytes used 112.00KiB
	devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
	devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# btrfs filesystem show /dev/sdb		#<==指定某一个磁盘设备,同一个btrfs文件系统卷下的物理磁盘设备会全部显示
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
	Total devices 2 FS bytes used 112.00KiB
	devid    1 size 20.00GiB used 2.01GiB path /dev/sdb
	devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount -t btrfs /dev/sdb /data/		#<==挂载使用,指定任意一个物理磁盘设备都代表了所属的同一个btrfs文件系统卷
[root@localhost ~]# mount |tail -1					#<==同一个btrfs文件系统卷只挂载一个物理磁盘设备即代表挂载了全局的物理磁盘
/dev/sdb on /data type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)
[root@localhost /]# umount /dev/sdb
###启用透明压缩算法(lzo|zlib,此2种算法可以选择其中一种)
[root@localhost /]# mount -t btrfs -o compress=lzo /dev/sdb /data/	#<==注意,如果被blkid命令识别的文件系统,可以不加-t参数,忽略指定文件系统类型步骤
###调整btrfs文件系统大小,须先挂载使用(使用resize子命令,但调整大小取决于底层物理磁盘设备是否加入了btrfs文件系统卷中)
[root@localhost /]# btrfs filesystem resize -10G /data/		#<==指定挂载点,缩减btrfs文件系统大小
Resize '/data/' of '-10G'
[root@localhost /]# btrfs filesystem df /data/		#<==此命令看不出变化
Data, RAID0: total=2.00GiB, used=768.00KiB			#<==存储数据默认使用raid0,所以2块20G磁盘加起来是40G
System, RAID1: total=8.00MiB, used=16.00KiB			#<==文件系统内部机制使用raid1
Metadata, RAID1: total=1.00GiB, used=112.00KiB		#<==元数据使用raid1存储
GlobalReserve, single: total=16.00MiB, used=0.00B
[root@localhost /]# df -lh
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   39G  1.8G   37G   5% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.5M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1               1014M  133M  882M  14% /boot
tmpfs                    182M     0  182M   0% /run/user/0
/dev/sdb                  30G   17M   18G   1% /data		#<==此命令看到btrfs文件系统已减少10G
[root@localhost /]# btrfs filesystem resize +10G /data/		#<==此步骤调整的是逻辑边界
Resize '/data/' of '+10G'
[root@localhost /]# df -lh
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   39G  1.8G   37G   5% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.5M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1               1014M  133M  882M  14% /boot
tmpfs                    182M     0  182M   0% /run/user/0
/dev/sdb                  40G   17M   38G   1% /data
[root@localhost /]# btrfs filesystem resize max /data/	#<==直接调整至最大,要更大,就要新加底层物理卷进来
Resize '/data/' of 'max'
###添加底层物理磁盘
[root@localhost /]# btrfs device add /dev/sdd /data/	#<==直接使用btrfs device子命令添加
[root@localhost /]# df -lh
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   39G  1.8G   37G   5% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.5M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1               1014M  133M  882M  14% /boot
tmpfs                    182M     0  182M   0% /run/user/0
/dev/sdb                  60G   17M   56G   1% /data		#<==容量已变为60G,因为添加多了一块20G物理磁盘
注意:数据如果需要均衡存储到各个底层物理磁盘,需要使用btrfs balance命令及其子命令
[root@localhost /]# btrfs balance start /data/		#<==生产环境有大量数据均衡存储到各底层物理磁盘(视情况)
[root@localhost /]# btrfs balance status /data/ 	#<==查看状态
No balance found on '/data/'
###移除底层物理卷(必须剩余的物理卷可以存储现有的数据:btrfs文件系统会自动把数据移走到其他物理磁盘)
[root@localhost /]# btrfs device delete /dev/sdd /data	#<==联机时移除设备
[root@localhost /]# btrfs filesystem show /data/		#<==被移除的设备上的数据会自动被btrfs文件系统移走到其他底层物理卷
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
	Total devices 2 FS bytes used 1.44MiB
	devid    1 size 20.00GiB used 1.28GiB path /dev/sdb
	devid    2 size 20.00GiB used 1.28GiB path /dev/sdc
[root@localhost /]# ls /data/		#<==数据还在
a.txt
###修改btrfs的数据组织机制,使用btrfs balance命令及其子命令(注意,如果是raid,低层物理磁盘个数需要满足组raid的要求)
[root@localhost /]# btrfs device add /dev/sdd /data
[root@localhost /]# btrfs filesystem show /data/
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
	Total devices 3 FS bytes used 704.00KiB
	devid    1 size 20.00GiB used 1.28GiB path /dev/sdb
	devid    2 size 20.00GiB used 1.28GiB path /dev/sdc
	devid    3 size 20.00GiB used 0.00B path /dev/sdd
[root@localhost /]# btrfs balance start -mconvert=raid5 /data/		#<==使用raid5,低层物理磁盘个数必须满足最低3个
Done, had to relocate 2 out of 3 chunks
[root@localhost /]# btrfs filesystem df /data/
Data, RAID0: total=2.00GiB, used=768.00KiB
System, RAID5: total=64.00MiB, used=16.00KiB		#<==文件系统内部机制及元数据已使用raid存储
Metadata, RAID5: total=1.00GiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
###创建子卷,使用btrfs subvolmue命令及其子命令
[root@localhost /]# btrfs subvolume list /data/		#<==列出父卷下的所有子卷
[root@localhost /]# btrfs subvolume create /data/logs	#<==在父卷下指定名称创建子卷,这里不是创建目录,而是创建子卷
Create subvolume '/data/logs'
[root@localhost /]# btrfs subvolume list /data/		#<==查看父卷下已有的子卷及其卷ID
ID 263 gen 62 top level 5 path logs
注意:挂载了父卷,所有已创建的子卷会被自动挂载在父卷的基础上
###单独挂载某个子卷,须先卸载父卷,并指明某子卷的名称进行挂载(或指定子卷的ID进行挂载)
[root@localhost /]# umount /data/
[root@localhost /]# mount -o subvol=logs /dev/sdd /mnt
[root@localhost /]# mount -o subvolid=263 /dev/sdd /mnt
mount: /dev/sdd is already mounted or /mnt busy
[root@localhost /]# btrfs subvolume show /mnt/		#<==查看子卷的挂载信息
[root@localhost /]# mount /dev/sdd /data/		#<==挂载父卷才可以删除子卷
[root@localhost /]# btrfs subvolume delete /data/logs
Delete subvolume (no-commit): '/data/logs'
[root@localhost /]# btrfs subvolume list /data/
###将ext系列与btrfs互转
[root@localhost /]# btrfs balance start -mconvert=raid1 /data/
Done, had to relocate 2 out of 3 chunks
[root@localhost /]# btrfs device delete /dev/sdd /data/
#将/dev/sdd1格式化为ext4文件系统
[root@localhost /]# mke2fs -t ext4 /dev/sdd1
[root@localhost /]# partx /dev/sdd
NR START      END  SECTORS SIZE NAME UUID
 1  2048 20973567 20971520  10G
[root@localhost /]# fsck -f /dev/sdd1
[root@localhost /]# btrfs-convert /dev/sdd1		#<==将ext4转换为btrfs
create btrfs filesystem:
	blocksize: 4096
	nodesize:  16384
	features:  extref, skinny-metadata (default)
creating ext2 image file
creating btrfs metadatacopy inodes [o] [         2/        11]
[root@localhost /]# btrfs filesystem show
Label: 'mydata'  uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
	Total devices 2 FS bytes used 704.00KiB
	devid    1 size 20.00GiB used 1.28GiB path /dev/sdb
	devid    2 size 20.00GiB used 1.28GiB path /dev/sdc

Label: none  uuid: 4eb42c5e-f260-4e64-ac2d-080f488c747b
	Total devices 1 FS bytes used 325.27MiB
	devid    1 size 10.00GiB used 583.66MiB path /dev/sdd1
#挂载使用
[root@localhost /]# mount /dev/sdd1 /mnt/
#回滚至ext文件系统
[root@localhost /]# umount /mnt/
[root@localhost /]# btrfs-convert -r /dev/sdd1
rollback complete
[root@localhost /]# blkid /dev/sdd1
/dev/sdd1: UUID="a88d5de4-620d-41d3-bd0e-3ff88c787362" TYPE="ext4"

###将某磁盘的单个分区添加至现有的btrfs文件系统中
[root@localhost /]# partx /dev/sdd
NR START END SECTORS SIZE NAME UUID
1 2048 20973567 20971520 10G
2 20973568 31459327 10485760 5G
[root@localhost /]# mkfs.btrfs /dev/sdd2
btrfs-progs v4.9.1
See http://btrfs.wiki.kernel.org for more information.

Label: (null)
UUID: 3b7731a0-af8a-488c-bf23-23b207bdf6da
Node size: 16384
Sector size: 4096
Filesystem size: 5.00GiB
Block group profiles:
Data: single 8.00MiB
Metadata: DUP 256.00MiB
System: DUP 8.00MiB
SSD detected: no
Incompat features: extref, skinny-metadata
Number of devices: 1
Devices:
ID SIZE PATH
1 5.00GiB /dev/sdd2

[root@localhost /]# btrfs device add /dev/sdd2 /data/
/dev/sdd2 appears to contain an existing filesystem (btrfs).
ERROR: use the -f option to force overwrite of /dev/sdd2   #<==强制覆盖数据后添加
[root@localhost /]# btrfs device add -f /dev/sdd2 /data/
[root@localhost /]# btrfs filesystem show
Label: 'mydata' uuid: 8c6abba9-73dc-4e60-a87f-e313dca6a007
Total devices 3 FS bytes used 704.00KiB
devid 1 size 20.00GiB used 1.28GiB path /dev/sdb
devid 2 size 20.00GiB used 1.28GiB path /dev/sdc
devid 3 size 5.00GiB used 0.00B path /dev/sdd2

  

12-14 14:40