Linux上的新一代文件系统-Btrfs实践

原创
2019/02/12 13:16
阅读数 2.8K

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 还能够方便的管理多个物理设备,不必再使用传统的卷管理软件。
  • 其它特性。包括一些比较先进的技术,能够显著提高文件系统的时间 / 空间性能,包括延迟分配,小文件的存储优化,目录索引等。

参考:

安装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 存储上的镜像区分并修复损坏的数据.

Warning: 运行 scrub 会阻止系统待机, 详见 这个讨论.
  • 手动启动

启动一个(后台运行的)包含 / 目录的文件系统在线检查任务:

# 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 日志中。

使用问题

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部