一、何为btrfs
Btrfs(通常念成Butter FS,B-tree, Better FS),由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。GPL授权的开源文件系统。目标是取代Linux目前的ext3文件系统,改善ext3的限制,特别是单一文件大小的限制,总文件系统大小限制以及加入文件校验和特性。加入目前ext3/4未支持的一些功能,例如可写的磁盘快照(snapshots),以及支持递归的快照(snapshots of snapshots),内建磁盘阵列(RAID)支持,支持子卷(Subvolumes)的概念,允许在线调整文件系统大小。
文件系统似乎是内核中比较稳定的部分,多年来,人们一直使用 ext2/3,ext 文件系统以其卓越的稳定性成为了事实上的 Linux 标准文件系统。近年来 ext2/3 暴露出了一些扩展性问题,于是便催生了 ext4 。在 2008 年发布的 Linux2.6.19 内核中集成了 ext4 的 dev 版本。 2.6.28 内核发布时,ext4 结束了开发版,开始接受用户的使用。似乎 ext 就将成为 Linux 文件系统的代名词。然而当您阅读很多有关 ext4 的文章时,会发现都不约而同地提到了 btrfs,并认为 ext4 将是一个过渡的文件系统。 ext4 的作者 Theodore Tso 也盛赞 btrfs 并认为 btrfs 将成为下一代 Linux 标准文件系统。 Oracle,IBM, Intel 等厂商也对 btrfs 表现出了极大的关注,投入了资金和人力。
二、btrfs的核心特性
多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”,“修改”;
写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新。即当我们修改某个文件的时候,不会直接修改源文件,而是复制一份然后对复制的文件进行修改,修改完把源文件的指针指向复制的文件。
数据及元数据校验码:存储每一个文件的时候,会把数据的校验码和元数据的校验码通过文件某些扩展保存下来,每个文件读取时快速校验文件是否损坏,如果检测到损坏还会自动尝试进行修复。
子卷:sub_volume,每一个子卷都可以独立进行挂载
快照:Btrfs 支持创建快照 (snapshot),和克隆 (clone) ,支持快照的快照;
透明压缩:任何数据流发往btrfs文件系统的时候,它自动能够通过占据CPU的时钟周期完成数据压缩后存放,当文件需要读取的时候又自动解压缩。能够节约空间,但是花费CPU时钟周期。
三、btrfs的管理
在Centos 7以上的版本中,btrfs默认是已经支持的了,但是在Centos 7以下的版本中,如果想要使用btrfs需要重新编译和更新内核及其对应的管理工具。
[root@localhost ~]# mkfs mkfs mkfs.cramfs mkfs.ext3 mkfs.minix mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.xfs #默认安装的Centos 7已经支持btrfs文件系统
在实验中,为了演示真实生产环境,我们为虚拟主机添加了三块硬盘来做实验,因为btrfs数据和元数据存放机制是可以基于阵列的形式的,同个硬盘的同一分区做btrfs除了单纯的组合分区大小外并无其他意义。
[root@localhost ~]# fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x00012971 Device Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 44042239 20971520 83 Linux /dev/sda3 44042240 48236543 2097152 82 Linux swap / Solaris Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdc: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdd: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes #可以看到新添加的三块硬盘:/dev/sdb,/dev/sdc,/dev/sdd
创建btrfs文件系统:
mkfs.btrfs
-L 'LABEL':指定卷标名
-d <type>: raid0, raid1, raid5, raid6, raid10, single:指定数据的存放机制
-m <profile>: raid0, raid1, raid5, raid6, raid10, single , dup:指定元数据的存放机制
-O <feature>:指定格式化时启动的feature,不是所有内核都支持,需要内核启动对应的某些功能
-O list-all: 列出支持的所有feature;
[root@localhost ~]# mkfs.btrfs -L mybtrfs /dev/sdb /dev/sdc Btrfs v3.16.2 See http://btrfs.wiki.kernel.org for more information. Turning ON incompat feature 'extref': increased hardlink limit per file to 65536 adding device /dev/sdc id 2 fs created label mybtrfs on /dev/sdb nodesize 16384 leafsize 16384 sectorsize 4096 size 16.00GiB #把/dev/sdb和/dev/sdc以默认的机制整合为一个btrfs文件系统,LABEL名存放在/dev/sdb上,总大小为两个硬盘大小 [root@localhost ~]# btrfs filesystem show Label: 'mybtrfs' uuid: d004175e-6488-4ded-a50b-815d58542171 Total devices 2 FS bytes used 112.00KiB devid 1 size 8.00GiB used 1.83GiB path /dev/sdb devid 2 size 8.00GiB used 1.81GiB path /dev/sdc #显示btrfs文件系统的信息,这里可以看到我们刚刚创建的卷标名为:mybtrfs的uuid,和整合的两个硬盘 [root@localhost ~]# blkid /dev/sdb /dev/sdb: LABEL="mybtrfs" UUID="d004175e-6488-4ded-a50b-815d58542171" UUID_SUB="814a7aa3-77e7-442b-845d-dfbeaa14e143" TYPE="btrfs" [root@localhost ~]# blkid /dev/sdc /dev/sdc: LABEL="mybtrfs" UUID="d004175e-6488-4ded-a50b-815d58542171" UUID_SUB="0f17445e-24b3-43fa-b8df-ffe49bbb2852" TYPE="btrfs" #这里可以看到两个硬盘的UUID是一样的,说明属于同一个btrfs文件系统卷,但是子卷UUID_SUB是不一样的 [root@localhost ~]# mkdir /mybtrfs [root@localhost ~]# mount /dev/sdb /mybtrfs/ [root@localhost ~]# mount proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel) devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=499884k,nr_inodes=124971,mode=755) securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000) configfs on /sys/kernel/config type configfs (rw,relatime) /dev/sda2 on / type ext4 (rw,relatime,seclabel,data=ordered) selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime) systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=30,pgrp=1,timeout=300,minproto=5,maxproto=5,direct) mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel) hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel) debugfs on /sys/kernel/debug type debugfs (rw,relatime) /dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota) /dev/sdb on /mybtrfs type btrfs (rw,relatime,seclabel,space_cache) [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 20G 903M 18G 5% / devtmpfs 489M 0 489M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 6.6M 491M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/sda1 1014M 114M 901M 12% /boot /dev/sdb 16G 896K 14G 1% /mybtrfs #可以看到我们创建挂载的btrfs已经可以正常使用
前面我们说过btrfs是支持透明压缩机制的,在Centos 7中,mount有个选项是支持透明压缩机制的,如果需要开启,挂载的时候可以使用下面命令:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
[root@localhost mybtrfs]# mount -o compress=zlib /dev/sdb /mybtrfs/
四、btrfs的管理
①、查看和设置btrfs文件系统
btrfs filesystem show
--mounted:查看已经挂载的btrfs文件系统信息
--all-devices:查看所有的btrfs文件系统信息,默认值
<path>|<uuid>|<device>|<label>:指明查看具体挂载路径,uuid,设备,卷标名的btrfs文件系统信息
[root@localhost mybtrfs]# btrfs filesystem show --mounted Label: 'mybtrfs' uuid: d004175e-6488-4ded-a50b-815d58542171 Total devices 2 FS bytes used 768.00KiB devid 1 size 8.00GiB used 1.83GiB path /dev/sdb devid 2 size 8.00GiB used 1.81GiB path /dev/sdc
btrfs filesystem sync
<path>:把挂载使用的btrfs文件系统在内存中的数据同步到硬盘上
btrfs filesystem df
<path>:查看已挂载的btrfs文件系统的数据和元数据使用率情况
[root@localhost mybtrfs]# btrfs filesystem df /mybtrfs/ Data, RAID0: total=1.60GiB, used=640.00KiB Data, single: total=8.00MiB, used=0.00 System, RAID1: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, RAID1: total=1.00GiB, used=112.00KiB Metadata, single: total=8.00MiB, used=0.00 GlobalReserve, single: total=16.00MiB, used=0.00
btrfs filesystem label
<device>|<mount_point>:查看设备和挂载点的LABEL名
[<device>|<mount_point>] [<newlabel>]:修改设备和挂载点的LABEL名
[root@localhost mybtrfs]# btrfs filesystem label /dev/sdd mybtrfs1 [root@localhost mybtrfs]# btrfs filesystem label /dev/sdd mybtrfs1
btrfs filesystem resize
[<devid>:]<size>[gkm]|[<devid>:]max <path>:调整挂载的btrfs文件系统的大小
[root@localhost mybtrfs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 20G 903M 18G 5% / devtmpfs 489M 0 489M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 6.6M 491M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/sda1 1014M 114M 901M 12% /boot /dev/sdb 16G 896K 14G 1% /mybtrfs [root@localhost mybtrfs]# btrfs filesystem resize -4G /mybtrfs/ Resize '/mybtrfs/' of '-4G' [root@localhost mybtrfs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 20G 903M 18G 5% / devtmpfs 489M 0 489M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 6.6M 491M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/sda1 1014M 114M 901M 12% /boot /dev/sdb 12G 896K 6.0G 1% /mybtrfs #可以看到mybtrfs大小由原来的16G变为12G [root@localhost mybtrfs]# btrfs filesystem resize max /mybtrfs/ Resize '/mybtrfs/' of 'max' #直接把逻辑边界调整为最大物理边界值
②、查看和设置btrfs设备
btrfs device add [-Kf] <dev> [<dev>...] <path>:为已经创建的btrfs中新添加一个设备,当硬盘已经格式化为其他文件系统时候,需要指定-f进行强制执行
[root@localhost mybtrfs]# btrfs device add /dev/sdd /mybtrfs/ [root@localhost mybtrfs]# btrfs filesystem show Label: 'mybtrfs' uuid: d004175e-6488-4ded-a50b-815d58542171 Total devices 3 FS bytes used 768.00KiB devid 1 size 8.00GiB used 1.83GiB path /dev/sdb devid 2 size 8.00GiB used 1.81GiB path /dev/sdc devid 3 size 8.00GiB used 0.00 path /dev/sdd #这里我们可以看到新添加的磁盘中使用为0,这是因为新添加的磁盘数据没有均衡到新磁盘中 [root@localhost mybtrfs]# btrfs balance start /mybtrfs/ Done, had to relocate 6 out of 6 chunks [root@localhost mybtrfs]# btrfs filesystem show Label: 'mybtrfs' uuid: d004175e-6488-4ded-a50b-815d58542171 Total devices 3 FS bytes used 448.00KiB devid 1 size 8.00GiB used 1.03GiB path /dev/sdb devid 2 size 8.00GiB used 256.00MiB path /dev/sdc devid 3 size 8.00GiB used 288.00MiB path /dev/sdd #添加完硬盘的时候需要对数据进行均衡操作,让数据平衡存放到各硬盘中
btrfs device delete [-Kf] <dev> [<dev>...] <path>:在已经创建的btrfs删除一个设备
[root@localhost mybtrfs]# btrfs device delete /dev/sdb /mybtrfs/ #删除设备时,btrfs的容量要大于数据容量,删除设备btrfs会自动把删除的设备中的数据移动到其他设备中
btrfs device scan [(--all-devices|-d)|<device> [<device>...]]:扫描btrfs中的设备
btrfs device stats [(--all-devices|-d)|<device> [<device>...]]:显示I/O统计数据
③、均衡所有数据到各btrfs设备,重新修改数据和元数据的组织机制
btrfs balance start <path>:当我们联机添加硬盘时,就需要把之前硬盘中的数据均衡到所有的硬盘中
[root@localhost mybtrfs]# btrfs balance start /mybtrfs/
注意:修改数据存放机制,设备如果不够的话raid级别是不支持的。入raid5至少需要三块硬盘
btrfs balance start -dconvert= raid0,raid1,raid5,raid6,raid10,single <path>:联机修改数据的存放机制
[root@localhost mybtrfs]# btrfs balance start -dconvert=raid5 /mybtrfs/ Done, had to relocate 1 out of 3 chunks
btrfs balance start -mconvert= raid0,raid1,raid5,raid6,raid10,single,dup <path>:联机修改元数据的存放机制
[root@localhost mybtrfs]# btrfs balance start -mconvert=raid5 /mybtrfs/ Done, had to relocate 2 out of 3 chunks
btrfs balance status <path>:查看当前磁盘均衡信息
btrfs balance pause <path>:暂停数据均衡,如果数据量太大又遇到业务繁忙时,可以暂时停止
btrfs balance resume <path>:重新执行停止的数据均衡
btrfs balance cancel <path>:清除运行或停止的数据均衡
④、管理btrfs设备子卷
btrfs subvolume create [-i <qgroupid>] <name>:创建子卷
[root@localhost mybtrfs]# btrfs subvolume create /mybtrfs/logs Create subvolume '/mybtrfs/logs' [root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/ ID 262 gen 57 top level 5 path logs #现在可以查看到logs子卷,ID为262 root@localhost /]# umount /mybtrfs/ [root@localhost /]# mkdir /logs [root@localhost /]# mount -o subvol=logs /dev/sdb /logs/ #当挂载父卷的时候,所有的子卷都会默认挂载,使用此命令单独挂载子卷
btrfs subvolume delete [options] <subvolume> [<subvolume>...]:删除子卷
[root@localhost mybtrfs]# btrfs subvolume delete /mybtrfs/logs/ Transaction commit: none (default) Delete subvolume '/mybtrfs/logs'
btrfs subvolume list [options] [-G <value>] [-C <value>] [--sort=rootid,gen,ogen,path] <path>:列出所有或指定的子卷
[root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/ ID 262 gen 57 top level 5 path logs #现在可以查看到logs子卷,ID为262
btrfs subvolume snapshot [-r] <source> <dest>|<name>:做快照
[root@localhost mybtrfs]# btrfs subvolume create /mybtrfs/logs Create subvolume '/mybtrfs/logs' [root@localhost mybtrfs]# btrfs subvolume snapshot /mybtrfs/logs/ /mybtrfs/logs_snapshot Create a snapshot of '/mybtrfs/logs/' in '/mybtrfs/logs_snapshot' [root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/ ID 262 gen 64 top level 5 path logs ID 263 gen 64 top level 5 path logs_snapshot #可以查看此时快照卷作为父卷的子卷已经生产。
由于btrfs写时复制的机制,这里还可以对单个文件进行快照
[root@localhost logs]# cp --reflink passwd passwd.snap
btrfs subvolume get-default <path>:查看那个子卷为默认卷
btrfs subvolume set-default <id> <path>:设置默认子卷
btrfs subvolume show <path>:查看子卷的详细信息
[root@localhost /]# btrfs subvolume show /logs/ /logs Name: logs uuid: 7776e291-e9c4-664d-8eb7-15a42a1bdcb4 Parent uuid: - Creation time: 2015-09-29 07:28:59 Object ID: 262 Generation (Gen): 58 Gen at creation: 57 Parent: 5 Top Level: 5 Flags: - Snapshot(s):
⑤、将其他文件系统转换为btrfs系统
1、对需要转换的文件系统进行强制检查
[root@localhost logs]# fsck -f /dev/sda4 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/sda4: 11/655360 files (0.0% non-contiguous), 83137/2621440 block
2、使用btrfs-convert命令进行转换
[root@localhost logs]# btrfs-convert /dev/sda4 creating btrfs metadata. creating ext2fs image file. cleaning up system chunk. conversion complete.
3、查看是否转换成功并挂载查看是否正常
[root@localhost logs]# btrfs filesystem show Label: none uuid: 5eb3f147-519a-49ea-ad21-d754f966aafa Total devices 1 FS bytes used 324.80MiB devid 1 size 10.00GiB used 10.00GiB path /dev/sda4
4、对转换成功的文件系统降级回原来的文件系统
[root@localhost logs]# btrfs-convert -r /dev/sda4 rollback complete. [root@localhost logs]# blkid /dev/sda4 /dev/sda4: UUID="b9b43946-e2df-4348-b431-0cb5212b2f0d" TYPE="ext4" #这里可以看到/dev/sda4已经降级会ext4