Btrfs是Linux上的新一代文件系统(正在开发中),具有容量扩展、数据一致、多磁盘管理、快照、配额、发送等特性,通过采用B+树存储结构,对较大文件和超小文件具有较好的支持,通过校验码保障数据一致性,支持软件RAID功能,对“大数据时代”所面临的存储问题提供了更好的支持工具。
总体来说,btrfs与zfs非常类似。最近linux 5.0内核可能出现zfs不兼容的api,如果不能予以修正,将导致zfs无法升级到5.0的linux kernel。本来一直在用ZFS,但是最近我的存储系统出现了zpool丢失的情况,研究一下btrfs作为分布式存储的节点文件的备选。
btrfs的特性
Btrfs具有与ZFS类似的高级特性,包括:
- 扩展性 (scalability)。btrfs 最重要的设计目标是应对大型机器对文件系统的扩展性要求。 Extent,B-Tree 和动态 inode 创建等特性保证了 btrfs 在大型机器上仍有卓越的表现,其整体性能而不会随着系统容量的增加而降低。
- 数据一致性 (data integrity) 。系统面临不可预料的硬件故障,Btrfs 采用 COW 事务技术来保证文件系统的一致性。 btrfs 还支持 checksum,避免了 silent corrupt 的出现。而传统文件系统则无法做到这一点。
- 多设备管理。 Btrfs 支持创建快照 (snapshot)和克隆 (clone) 。 btrfs 还能够方便的管理多个物理设备,不必再使用传统的卷管理软件。
- 其它特性。包括一些比较先进的技术,能够显著提高文件系统的时间 / 空间性能,包括延迟分配,小文件的存储优化,目录索引等。
参考:
- Linux上的新一代文件系统-Btrfs简介
- Linux上的新一代文件系统-Btrfs使用
- Btrfs管理指南,https://btrfs.wiki.kernel.org/index.php/SysadminGuide
- Btrfs官方文档,https://btrfs.wiki.kernel.org/index.php/Main_Page
- Btrfs源码,https://github.com/kdave/btrfs-progs
安装Btrfs
这里以Ubuntu 18.04LTS安装btrfs相关的工具为例,其它Linux系统参考相应的文档。
sudo apt install btrfs-progs btrfs-tools
主要参数如下:
usage: btrfs [--help] [--version] <group> [<group>...] <command> [<args>]
Command groups:
subvolume manage subvolumes: create, delete, list, etc
filesystem overall filesystem tasks and information
balance balance data across devices, or change block groups using filters
device manage and query devices in the filesystem
scrub verify checksums of data and metadata
rescue toolbox for specific rescue operations
inspect-internal query various internal information
property modify properties of filesystem objects
quota manage filesystem quota settings
qgroup manage quota groups
replace replace a device in the filesystem
Commands:
check Check structural integrity of a filesystem (unmounted).
restore Try to restore files from a damaged filesystem (unmounted)
send Send the subvolume(s) to stdout.
receive Receive subvolumes from a stream
help Display help information
version Display btrfs-progs version
For an overview of a given command use 'btrfs command --help'
or 'btrfs [command...] --help --full' to print all available options.
Any command name can be shortened as far as it stays unambiguous,
however it is recommended to use full command names in scripts.
All command groups have their manual page named 'btrfs-<group>'.
转换ZFS为Btrfs系统
我的机器上原来有两个盘,已经作为zfs系统,需要将其转换为btrfs,原来的磁盘会被全部抹去、数据会全部丢失。
因为zfs的存储池zpool已经挂载到glusterfs网络存储系统上,需要将其卸载。首先查看gluster的卷信息。
sudo gluster volume status
然后,使用gluster remove-brick卸载掉该节点的brick。
执行下面的命令,将会对zpool全部卸载。
sudo zpool export zpool
创建btrfs文件系统
将物理磁盘/dev/sda和/dev/sdb做成raid0模式的btrfs系统。执行:
sudo mkfs.btrfs -L bfs -d raid0 /dev/sda /dev/sdb
输出如下:
btrfs-progs v4.15.1
See http://btrfs.wiki.kernel.org for more information.
/dev/sdb appears to contain an existing filesystem (btrfs).
ERROR: use the -f option to force overwrite of /dev/sdb
supermap@podc01:~$ sudo mkfs.btrfs -L bfs -d raid0 /dev/sdb /dev/sda -f
btrfs-progs v4.15.1
See http://btrfs.wiki.kernel.org for more information.
Label: bfs
UUID: fe330ce7-c658-4559-95e6-d91db384af92
Node size: 16384
Sector size: 4096
Filesystem size: 18.19TiB
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 9.10TiB /dev/sdb
2 9.10TiB /dev/sda
挂载到系统
mkdir /bpool
mount -t btrfs /dev/sda /bpool
这里挂载的第一个设备,但是只需要挂载第一个,其它的自动加载,而且会显示两个设备的总和容量。
查看btrfs磁盘设备信息:
supermap@podc01:~$ sudo btrfs device usage /bpool
/dev/sda, ID: 1
Device size: 9.10TiB
Device slack: 0.00B
Data,RAID0: 1.00GiB
Metadata,RAID1: 1.00GiB
System,RAID1: 8.00MiB
Unallocated: 9.09TiB
/dev/sdb, ID: 2
Device size: 9.10TiB
Device slack: 0.00B
Data,RAID0: 1.00GiB
Metadata,RAID1: 1.00GiB
System,RAID1: 8.00MiB
Unallocated: 9.09TiB
文件系统信息:
supermap@podc01:~$ sudo btrfs filesystem usage /bpool
Overall:
Device size: 18.19TiB
Device allocated: 4.02GiB
Device unallocated: 18.19TiB
Device missing: 0.00B
Used: 1.00MiB
Free (estimated): 18.19TiB (min: 9.09TiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 16.00MiB (used: 0.00B)
Data,RAID0: Size:2.00GiB, Used:768.00KiB
/dev/sda 1.00GiB
/dev/sdb 1.00GiB
Metadata,RAID1: Size:1.00GiB, Used:112.00KiB
/dev/sda 1.00GiB
/dev/sdb 1.00GiB
System,RAID1: Size:8.00MiB, Used:16.00KiB
/dev/sda 8.00MiB
/dev/sdb 8.00MiB
Unallocated:
/dev/sda 9.09TiB
/dev/sdb 9.09TiB
系统磁盘信息:
supermap@podc01:~$ df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 16G 0 16G 0% /dev
tmpfs 3.2G 2.8M 3.2G 1% /run
/dev/nvme0n1p1 1.9T 62G 1.7T 4% /
tmpfs 16G 63M 16G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 16G 0 16G 0% /sys/fs/cgroup
tmpfs 3.2G 16K 3.2G 1% /run/user/121
...
10.1.1.201:/gvzr00 53T 4.3T 49T 9% /home/supermap/gvzr00
/dev/loop16 91M 91M 0 100% /snap/core/6350
tmpfs 3.2G 36K 3.2G 1% /run/user/1000
/dev/sda 19T 17M 19T 1% /bpool
其中的bpool为挂载的btrfs存储卷。
重新分配大小
btrfsctl -r 300M /bpool
当设备的空间快被使用完的时候,用户可以使用 btrfs-vol 命令为文件系统添加新的磁盘设备,从而增加存储空间。下面的命令向 /btrfsdisk 文件系统增加一个设备/sdc
btrfs-vol -a /dev/sdc /bpool
SSD 支持
用户可以使用 mount 参数打开 btrfs 针对 SSD 的优化。命令如下:
mount – t btrfs – o SSD /dev/sda5 /btrfsdisk
开启压缩功能
用户可以使用 mount 参数打开压缩功能。命令如下:
mount – t btrfs – o compress /dev/sda5 /btrfsdisk
检查修复-Scrub
Btrfs Wiki 术语表中写到 scrub 是一种 "在线文件系统检查工具".它读取文件系统中的文件和元数据,并使用校验值和 RAID 存储上的镜像区分并修复损坏的数据.
-
手动启动
启动一个(后台运行的)包含 /
目录的文件系统在线检查任务:
# btrfs scrub start /
检查该任务的运行状态:
# btrfs scrub status /
-
通过服务或者定时器启动
btrfs-progs 软件包带有 btrfs-scrub@.timer
系统单元,用来每月运行 scrub 命令.通过添加挂载点的参数来启用它,例如btrfs-scrub@-.timer
(/
) 或者 btrfs-scrub@home.timer
(/home
).
也可以通过启动 btrfs-scrub@.service
来手动运行 scrub (使用同样的挂载点参数) ,相对于 # btrfs scrub
这么做的优点是会记录在 Systemd 日志中。
使用问题
- raid1的磁盘故障无法恢复、数据丢失,参考:Btrfs磁盘故障、无法卸载与重置