Btrfs文件系统快速起步
本文是在CentOS 7上实践部署Btrfs文件系统,实现单磁盘卷管理和RAID功能
安装工具包
RedHat EPEL / CentOS
debian / ubuntu
单磁盘btrfs操作
对于构建分布式文件系统的底层文件系统,不需要构建RAID,可以采用单盘操作。这里的案例是采用 /dev/sda4
主分区作为btrfs
创建磁盘分区 /dev/sda4
使用Btrfs格式化文件系统
此时提示
这是因为这个分区是一个以前删除的包含文件系统的分区(最早这个分区是ext4文件系统分区),所以重新创建同一位置的分区而没有事先擦除过(可以使用 dd if=/dev/zero of=/dev/sda4 bs=512 count=1024
或者使用wipefs
),就会报告上述错误。实际是一种提示你可能划分错分区的告警。如果确定分区没有错误,可以强制创建新文件系统(mkfs.btrfs -f /dev/sda4
),或者使用wipefs
工具来完成旧分区信息擦除。
此时提示
再次执行partprobe
扫描分区,然后重新创建btrfs文件系统就可以成功。可以看到输出提示如下
检查btrfs文件系统
显示输出
挂载btrfs文件系统
挂载btrfs文件系统方法
如果要启用btrfs的压缩功能(默认是
zlib
)
可以使用-o compress=
参数。默认的zlib
压缩方式的压缩比较高,如使用lzo
压缩方式则速度较快且CPU负载较轻。使用压缩模式,特别是lzo
压缩模式,可以提高数据通过性能。注意,btrfs不会压缩已经在应用层压缩过的文件(如视频,音乐,图像等)。
如果内核版本 v4.14+ ,则推荐使用 zstd 压缩算法。
然后添加/etc/fstab
设置如下
注意:根据btrfs官方文档 Compression 目前已经支持3种压缩算法,并且从内核 v.4.14 开始,可以采用 ZSTD 压缩算法,能够获得性能和压缩率的较好平衡。具体对比可以参考 Btrfs Zstd Compression Benchmarks On Linux 4.14
如果没有指定算法,默认的压缩算法是zlib
文件系统故障恢复
如果有一个btrfs文件系统故障,可以通过recovery
挂载参数挂载,此时会尝试seek并找找寻文件系统根的可用副本:
扩容和缩容btrfs文件系统
缩小2G空间
缩小500M空间
扩大1g空间
多磁盘btrfs
Btrfs也支持多块磁盘构建RAID
meta磁盘可以采用单磁盘
-m
表示metadata
如果要构建RAID0模式的metadata磁盘(这样性能更好)
如果要构建冗余的数据磁盘(RAID1)同时构建没有冗余的单metadata磁盘
如果需要构建同时数据冗余的metadata磁盘和数据磁盘,则只要使用
-d raid1
就可以,因为meatdata
磁盘默认就是RAID1
也可以使用RAID10(
-m raid10
或-d raid10
),此时需要至少4快磁盘。不过,对于btrfs,不强制要求磁盘容量一样大小。
增加或删除物理磁盘
可以在线增加磁盘或者删除磁盘,非常方便
然后检查文件系统
此时可以看到/dev/sde
设备虽然被添加,但是还没有被使用。如果使用的是非RAID0
模式,可以使用balance
命令来重新平衡数据和metadata
可以删除掉没有损坏
(intact)的硬盘(但是剔除故障磁盘会比较麻烦,见后述)
剔除故障磁盘
要移除一个故障
(failed)的磁盘,先umount文件系统,
然后挂载成降级模式
这样就可以移除故障的磁盘。
如果构建了RAID的磁盘需要一定数量的磁盘(例如RAID1要求双磁盘,RAID10要求4块磁盘),可需要先添加一块intact
磁盘 - 这里添加一块替换磁盘/dev/sdf
只有确保有足够的intact
设备才可以执行以下的替换命令
更改RAID级别
Btrfs支持在线更改RAID级别,例如最初数据和metadata是RAID0,可以在线更改成RAID1
创建子卷
可以在现有卷下创建子卷
在btrfs中,可以创建卷的子卷,并且可以创建子卷的快照,或者挂载子卷来替换上层的卷
显示输出
此时可以看到在 /data
目录下创建了一个子目录 libvirt
显示输出
注意:这个是子卷,这个
libvirt
子卷的subvolid
是257
检查
/data
的子卷
显示输出
可以创建子卷的子卷
此时显示
此时检查卷
/data
可以看到显示出新的子卷libvirt/images
显示输出
挂载子卷
Btrfs支持直接挂载子卷而不需要挂载父卷
可以使用
subvolid
来挂载子卷
也支持
subvol
来挂载子卷
挂载之后,可以检查文件系统挂载,会发现和ZFS类似的磁盘设备/dev/sda4
挂载模式
设置默认挂载子卷
如果希望子卷 258
subvolid 默认挂载到/data
目录(而不是/dev/sda4
),则使用如下命令
这样就不需要每次都输入-o subvolid=258
参数了
如果要恢复原先的top-level volume作为挂载,则设置subvolid=0
删除子卷
子卷可以在卷路径挂载的时候被删除,例如
删除前检查/data
卷的子卷
显示如下
现在删除子卷 libvirt/images
提示报错
我发现不应该使用挂载的路径作为删除路径,而是应该使用 /data/libvirt/images
即卷路径来删除。
提示报错
这次显示至少表明卷路径是正确的,只是设备繁忙(其实就是还没有umount卷挂载)。所以还是采用先umount
掉卷挂载,然后删除子卷
这次显示输出正确
再检查/data
卷可以看到只有子卷libvirt
了
使用/etc/fstab
挂载btrfs
/etc/fstab
挂载btrfs请参考在btrfs文件系统上部署kvm,下文我们挂载
/data/libvirt
子卷到/var/lib/libvirt
目录,以这个/data/libvirt
作为测试。
挂载
/data/libvirt
子卷(实际操作参考在btrfs文件系统上部署kvm,需要做一些辅助步骤确保数据腾挪到/data/libvirt
子卷)配置
/etc/fstab
挂载
/data
挂载
/var/lib/libvirt
出现报错
但是发现将 /data/libvirt
这个btrfs子卷修改成对应的subvolid
却能够正常挂载
挂载后
仔细检查了一下使用mount
命令的参数-o subvol
,原来这个子卷参数不能包含top-level
的目录,应该使用
而 不是
所以正确的/etc/fstab
应该配制成
快照
Btrfs最有用的功能是在线创建子卷快照,这个功能可以实现系统回滚以及创建一致性的备份。
对于大数据磁盘的备份,一个非常关键的要求就是数据一致性:在备份时间点需要获取整个磁盘的瞬间快照,确保完整的备份包含了这个时间点的所有数据。
在创建快照前,先准备2个测试文件
现在创建一个当前时间点的快照
参考
Last updated