几分钟能了解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 | # 假设主卷已经挂载到/mnt/mydata |
命令行挂载子卷:
1 | sudo mount -o subvol=@mysubvol UUID=abcd1234-5678-90ab-cdef-1234567890ab /some/place/ |
访问子卷内容:
1 | # 可以挂载后访问: |
快速问答
Q: 子卷是啥?
A: 就理解成BTRFS文件系统下,一个可以独立挂载,独立快照,独立操作的子文件夹吧。(尽管内部实现显然不是这样)
Q: 为啥子卷名称前面有个@符号?
A: 似乎是约定俗成,换成其他符号也行,不用也行。参阅Re: btrfs subvolume naming scheme.
Q: fstab中如何使用子卷?
A: 看下文。
挂载(fstab)
BTRFS文件系统的挂载和其他文件系统别无二致。
在使用块设备挂载RAID卷时,只需要指定其中一个块设备,就可以完成挂载。
不过,在/etc/fstab
中设置挂载点,尤其是跨盘卷时,建议使用UUID进行挂载。
查看UUID:
1 | # Recommended |
注意我们需要的是整个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 |