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