几分钟能了解BTRFS吗?

所谓BTRFS,就是Bocchi The Rock FileSystem!

安装相关组件

1
sudo apt install btrfs-progs

创建普通文件系统

1
sudo mkfs.btrfs -L MyDisk /dev/sdxy

创建RAID文件系统

1
sudo mkfs.btrfs -f -d raid1 -m raid1 /dev/sdc1 /dev/sdd2
  • -f: 强制执行,即无视指定分区上现存的文件系统。
  • -d raid1: 指定数据块存储模式。具体请参考官方手册RAID功能介绍。
  • -m raid1: 指定Metadata块存储模式。具体请参考官方手册RAID功能介绍。

在后面指定跨盘卷使用到的块设备即可。

设置卷名

1
sudo btrfs filesystem label /dev/sdc1 MyData

子卷(Subvolume)

创建子卷:

1
2
# 假设主卷已经挂载到/mnt/mydata
sudo btrfs subvolume create /mnt/mydata/@mysubvol

命令行挂载子卷:

1
sudo mount -o subvol=@mysubvol UUID=abcd1234-5678-90ab-cdef-1234567890ab /some/place/

访问子卷内容:

1
2
3
4
5
6
# 可以挂载后访问:
sudo mount -o subvol=... UUID=... /some/place/
cd /some/place/

# 当然还可以直接从卷根挂载点访问
cd /mnt/mydata/@mysubvol

快速问答

Q: 子卷是啥?

A: 就理解成BTRFS文件系统下,一个可以独立挂载,独立快照,独立操作的子文件夹吧。(尽管内部实现显然不是这样)

Q: 为啥子卷名称前面有个@符号?

A: 似乎是约定俗成,换成其他符号也行,不用也行。参阅Re: btrfs subvolume naming scheme.

Q: fstab中如何使用子卷?

A: 看下文。

挂载(fstab)

BTRFS文件系统的挂载和其他文件系统别无二致。

在使用块设备挂载RAID卷时,只需要指定其中一个块设备,就可以完成挂载。

不过,在/etc/fstab中设置挂载点,尤其是跨盘卷时,建议使用UUID进行挂载。

查看UUID:

1
2
3
4
5
6
7
8
# Recommended
sudo btrfs filesystem show

# OR
sudo blkid

# OR
ls -lha /dev/disk/by-uuid/

注意我们需要的是整个BTRFS卷的UUID,在RAID中不是某个单一块设备的PARTUUID

接着编辑/etc/fstab:

最简单的:

1
UUID=abcd1234-5678-90ab-cdef-1234567890ab /mnt/mydata btrfs defaults 0 0

RAID也是一样:

1
UUID=abcd1234-5678-90ab-cdef-1234567890ab /mnt/mydata btrfs defaults 0 0

挂载子卷(注意这里使用的UUID仍然是主卷的UUID,不要与PARTUUID混淆):

1
UUID=abcd1234-5678-90ab-cdef-1234567890ab /media/mysubvol/ btrfs defaults,subvol=@mysubvol 0 0

我喜欢的外挂硬盘挂载选项,可以在硬盘缺失时自动跳过检查:

1
UUID=abcd1234-5678-90ab-cdef-1234567890ab /media/mysubvol/ btrfs defaults,subvol=@mysubvol,nofail,x-systemd.automount,x-systemd.device-timeout=3 0 0

查看磁盘空间占用

需要注意,系统的du命令输出中,BTRFS的空间统计信息并不总是准确的。

1
sudo btrfs filesystem df /mnt/mydata

全盘检错

BTRFS的一大特色就是自动化的错误检测。

在BTRFS的Checksum Tree里,保存着整个文件系统中包括Metadata块与数据块的Checksum,而在每次读取这些数据时,BTRFS会自动进行校验,进而发现硬盘数据存在的错误。

不过,有时我们还希望主动执行检查,校验硬盘上的数据是否发生了损坏。那么我们可以这么做:

1
sudo btrfs scrub start /mnt/mydata

上面一条命令将会启动一个后台检查任务,检查整个文件系统存在的错误。对于RAID系统,检查会在多块磁盘上并行进行。

如果发现了数据错误且配置了RAID等数据冗余,BTRFS将会自动尝试从好数据中恢复损坏的数据。如果只是想查错,不希望BTRFS自动纠错,可以用-r参数指定只读模式运行。

开始检查后,可以用以下命令读取检查进度与报告:

1
sudo btrfs scrub status /mnt/mydata

查询读写错误发生次数

1
sudo btrfs device stats /mnt/mydata