Btrfs文件系统
一.Btrfs简介
Btrfs(B-tree,Butter FS,Better FS)是Oracle公司在2007年左右开始研发的一个开源文件系统,由GPL授权。该文件系统最重要的特性就是支持写时复制,写时复制在修复文件数据方面比传统就地修改的文件系统有着极大的优势,其目的是用来取代Linux早些年来一直使用的ext系列文件系统,ext系列文件系统的反删除功能一直不太好。Btrfs能够支持非常大的单个文件大小和总大小,并且有文件检查功能,快照功能。还能做累积性快照(快照的快照),能实现和增量备份一样的效果。btrfs内置就支持RAID功能,条带和镜像各种常见功能。而且btrfs在实现文件系统功能时,支持将多个物理卷组织成一个btrf文件系统。并且这个btrfs文件系统挂载后可以直接使用也可以再划分子卷。
二.核心特性总结:
1.多物理卷支持:一个btrfs可以由多个底层物理卷组成,支持RAID功能并且以联机的方式进行“添加”,“移除”,“修改”。
2.写时复制:比如修改一个文件时,btrfs并不是直接在原处修改,而是先复制一份。然后在复制来的这份文件上进行修改,当修改完成后,再用原来的文件名来引用(指向)这个修改了的文件。而原来的文件数据还在,这样在修复时就容易多了。这是btrfs写时复制特性的一个体现,具体的还有复制,更新,替换指针等特性。
3.数据及元数据校验码:当我们存储一个文件时,btrfs会将数据的校验码和元数据的校验码都通过文件的某些属性扩展保存下来。这样当我们读取某个文件时,可以很方便的去快速检测文件是否受损了。如果检测到文件受损,还可以自动尝试修复受损文件。这种对数据及元数据的checksum特性极大的保证了数据的可靠性。
4.支持子卷:sub_volume,我们可以在一个btrfs上创建多个子卷,而每个子卷都支持单独挂载和使用。
5.支持快照;其实快照是子卷的一个副本,是基于CoW机制的。相比较LVM的快照功能,btrfs的快照还支持快照的快照,可以进行增量备份。
6.透明压缩:可以将任何发往btrfs的数据流,通过占用cpu的某个时钟周期完成数据的压缩存放。这个过程对用户来说是透明的。而在数据读取时,又能够自动解压缩。虽然占用了cpu资源,但是可以节省文件系统的使用空间。
三.btrfs常用管理命令
1.文件系统创建:
mkfs.btrfs
-L "LABEL": 指定卷标名
-d <type> :raid0,raid1,raid5,raid6,raid10,single 指明数据存储时的类型,默认为single
-m <profile>:raid0,raid1,raid5,raid6,raid10,single,dup 指明元数据存储时的机制
-O <feature>:指明在格式化时就启用的特性
-O list-all:列出其支持的所有特性(并不是所有的内核版本都支持)
例如:mkfs.btrfs -L mybtrfs /dev/sdb /dev/sdc
[root@slave1 ~]# 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 80.00GiB [root@slave1 ~]# btrfs filesystem show Label: 'mybtrfs' uuid: fb856243-5be8-4599-b43f-f645fc5ba9dc Total devices 2 FS bytes used 112.00KiB devid 1 size 60.00GiB used 2.03GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc Btrfs v3.16.2 [root@slave1 ~]# blkid /dev/sdb /dev/sdc /dev/sdb: LABEL="mybtrfs" UUID="fb856243-5be8-4599-b43f-f645fc5ba9dc" UUID_SUB="86580f9c-6bfb-494e-b911-e16e1ca41c77" TYPE="btrfs" /dev/sdc: LABEL="mybtrfs" UUID="fb856243-5be8-4599-b43f-f645fc5ba9dc" UUID_SUB="15ddfda0-3a5b-4531-9bb3-f42f5166df1a" TYPE="btrfs" [root@slave1 ~]# # 可以看到两个设备的UUID相同,但子UUID不 同,说明这两个设备被一起组织成了btrfs
btrfs filesystem show 显示当前系统上的所有btrfs
show [--mounted|--all-devices|<path>|<uuid>|<device>|<label>] sync <path> 强制将该文件系统缓存在内存中的数据都同步到磁盘上去
df <path> [<path>...] 查看一个已经挂载的btrfs磁盘空间使用情况
resize [<devid>:]<size>[gkm]|[<devid>:]max <path> 改变btrfs的空间大小,max 是直接调整为最大
label [<dev>|<mountpoint>] [<newlabel>] 显示或更新该文件系统的卷标
[root@slave1 ~]# btrfs filesystem show --all-device Label: 'mybtrfs' uuid: fb856243-5be8-4599-b43f-f645fc5ba9dc Total devices 2 FS bytes used 112.00KiB devid 1 size 60.00GiB used 2.03GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc Btrfs v3.16.2 [root@slave1 ~]# btrfs filesystem show /dev/sdb failed to open /dev/fd0: No such device or address Label: 'mybtrfs' uuid: fb856243-5be8-4599-b43f-f645fc5ba9dc Total devices 2 FS bytes used 112.00KiB devid 1 size 60.00GiB used 2.03GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc Btrfs v3.16.2
挂载btrfs时启用透明压缩机制:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT 该命令是在CentOS 7上新支持的子选项
btrfs device add [-Kf] <dev> [<dev>...] <path> 新增一个设备进来
-f|--force 强制覆盖给定磁盘上的文件系统
delete <dev> [<dev>...] <path> 移除一个btrfs,该命令会先将数据移动到其它设备上
scan [(--all-devices|-d)|<device> [<device>...]] 扫描磁盘上的所有btrfs文件系统
ready <device> 将某个设备转换为备用状态
stats [-z] <path>|<device> 显示某个设备的I/O统计数据
[root@slave1 ~]# btrfs device add /dev/sdd /mybtrfs [root@slave1 ~]# btrfs filesystem show /mybtrfs Label: 'mybtrfs' uuid: fb856243-5be8-4599-b43f-f645fc5ba9dc Total devices 3 FS bytes used 896.00KiB devid 1 size 60.00GiB used 2.03GiB path /dev/sdb devid 2 size 20.00GiB used 2.01GiB path /dev/sdc devid 3 size 20.00GiB used 0.00 path /dev/sdd Btrfs v3.16.2 [root@slave1 ~]#
当新加进一块磁盘来以后,原有数据并不会平摊存储到新硬盘里。如果希望文件系统里的数据能平衡均匀的存储在磁盘设备上,这时可以使用 btrfs balance 功能来实现均衡操作。
btrfs balance start [options] <path> 启用balance功能
-d[<filters>] 修改数据的组织机制
-m[<filters>] 修改元数据的组织机制
-s[<filters>] 修改系统的组织机制
例如:btrfs balance start -mconvert=raid5 /mydata 修改该设备的元数据组织机制为RAID5
pause <path> 暂停balance
cancel <path> 取消或暂停balance
resume <path> 继续balance
status [-v] <path> 显示balance状态信息
[root@slave1 ~]# btrfs balance status /mybtrfs No balance found on '/mybtrfs' [root@slave1 ~]# btrfs balance start /mybtrfs Done, had to relocate 6 out of 6 chunks [root@slave1 ~]# btrfs balance status /mybtrfs No balance found on '/mybtrfs' [root@slave1 ~]#
btrfs-convert -r /dev/sdc 回滚(降级)文件系统类型
btrfs文件系统还支持子卷,如果将子卷分开挂载(只挂载子卷)的话,需要指定子卷名或者子卷ID。
btrfs subvolume <subcommand> [<args>]
SUBCOMMAND:
create [-i <qgroupid>] <name> 创建一个子卷
delete [options] <subvolume> [<subvolume>...] 删除一个子卷
list [options] [-G <value>] [-C <value>] [--sort=rootid,gen,ogen,path] <path> 列出所有子卷,指明卷上的所有子卷
snapshot [-r] <source> <dest>|<name> 创建一个快照卷
get-default <path> 查看默认子卷是谁
set-default <id> <path> 设置默认子卷
show <path> 查看给定子卷的详细信息
例如:btrfs subvolume create /mybtrfs/sub_btrfs
挂载卷时,如果挂载的是顶级卷,则其所有子卷都会被挂载。也可以只单独挂载某个子卷。
mount -o subvol=sub_btrfs /dev/sdb /mnt 指定将子卷sub_btrfs挂载到/mnt下(要指定子卷名和其对应的完整设备名)
mount -o subvolid=... /dev/sdb /mnt 挂载子卷时也可以指定子卷ID
创建子卷的快照卷
btrfs subvolume snapshot /mybtrfs/sub_btrfs /mybtrfs/sub_snapshot 子卷的快照和子卷在同一个父卷下
在btrfs文件系统下,还可以对单个文件进行快照。
cp --reflink grub2.cfg grub2.cfg_snapshot 快照文件和原文件最好在同一个子卷下
在btrfs文件系统下,拆除某块硬盘:
btrfs balance start -dconvert=single /mybtrfs # 不转换前是拆不掉的
btrfs balance start -mconvert=raid1 /mybtrfs
btrfs device delete /dev/sdd /mybtrfs
将ext4文件系统转换为btrfs文件系统
umount # 转换前一定要先卸载
fsck -f # 强制进行检查
btrfs-convert /dev/sdd1 # 转换后的btrfs文件系统可能没有Label
btrfs-convert -r /dev/sdd1 # 将btrfs文件系统降级回去