BTRFS

Warning
BTRFS集成目前在{pve}中是一个技术预览

BTRFS 是一个现代的写时复制文件系统,由 Linux 内核原生支持,实现了如快照、内建 RAID 以及通过数据和元数据的校验和进行自我修复的功能。从 {pve} 7.0 开始,BTRFS 被引入作为根文件系统的可选项。

BTRFS的一般优势
  • 主系统设置几乎与传统基于ext4的设置相同。

  • 快照

  • 文件系统级别的数据压缩

  • 写时复制克隆

  • RAID0、RAID1和RAID10

  • 数据防损坏保护

  • 自愈

  • 原生支持的Linux内核

  • …​

注意事项
  • RAID 5/6级别是实验性的并且危险的

作为根文件系统的安装

当您使用{pve}安装程序进行安装时,可以选择BTRFS作为根文件系统。您需要在安装时选择RAID类型:

RAID0

也被称为“条带化”。这种卷的容量是所有磁盘容量的总和。但是RAID0没有增加任何冗余,因此单个驱动器的故障会导致卷不可用。

RAID1

也被称为“镜像”。数据会被一模一样地写入到所有磁盘中。这种模式至少需要两块相同大小的磁盘。其结果容量等同于单个磁盘的容量。

RAID10

RAID0和RAID1的组合。至少需要4个磁盘。

安装程序会自动分区磁盘,并在 /var/lib/pve/local-btrfs 创建一个额外的子卷。为了能够使用 {pve} 工具,安装程序会在 /etc/pve/storage.cfg 中创建以下配置条目:

dir: local
	path /var/lib/vz
	content iso,vztmpl,backup
	disable

btrfs: local-btrfs
	path /var/lib/pve/local-btrfs
	content iso,vztmpl,backup,images,rootdir

这显式地禁用了默认的`local`存储,以支持在额外的子卷上的BTRFS特定存储条目。

btrfs`命令用于配置和管理BTRFS文件系统,在安装后,以下命令列出所有额外的子卷:

# btrfs subvolume list /
ID 256 gen 6 top level 5 path var/lib/pve/local-btrfs

BTRFS 管理

这一部分为您提供了一些常见任务的使用示例。

创建一个BTRFS文件系统

要创建BTRFS文件系统,使用`mkfs.btrfs`命令。-d`和-m`参数分别用于设置元数据和数据的配置文件。可以使用可选的`-L`参数来设置标签。

通常,支持以下模式:singleraid0raid1raid10

在单个磁盘`/dev/sdb`上创建一个标签为`My-Storage`的BTRFS文件系统:

# mkfs.btrfs -m single -d single -L My-Storage /dev/sdb

或者在两个分区`/dev/sdb1`和`/dev/sdc1`上创建一个RAID1:

 # mkfs.btrfs -m raid1 -d raid1 -L My-Storage /dev/sdb1 /dev/sdc1

挂载BTRFS文件系统

新的文件系统随后可以手动挂载,例如:

# mkdir /my-storage
# mount /dev/sdb /my-storage

BTRFS也可以像任何其他挂载点一样被添加到`/etc/fstab`中,从而在启动时自动挂载。建议避免使用块设备路径,而是使用`mkfs.btrfs`命令打印的`UUID`值,尤其是在BTRFS设置中有多于一个磁盘时。

例如:

文件 `/etc/fstab
# ...其他挂载点因简略而省略

# using the UUID from the mkfs.btrfs output is highly recommended
UUID=e2c0c3ff-2114-4f54-b767-3a203e49f6f3 /my-storage btrfs defaults 0 0
Tip
如果你不再拥有UUID,你可以使用`blkid`工具列出所有块设备的属性。

之后,你可以通过执行以下操作来触发第一次挂载:

mount /my-storage

在下次重启后,系统将会在启动时自动完成这项操作。

将BTRFS文件系统添加到{pve}

您可以通过网络界面将一个现有的BTRFS文件系统添加到{pve},或者使用命令行界面,例如:

pvesm add btrfs my-storage --path /my-storage

创建一个子卷

创建一个子卷将其链接到BTRFS文件系统中的一个路径,在那里它将显示为一个普通目录。

# btrfs subvolume create /some/path

之后 /some/path 将像一个普通目录一样工作。

删除子卷

与通过`rmdir`删除的目录不同,子卷在用`btrfs`命令删除时不需要为空。

# btrfs subvolume delete /some/path

创建一个子卷的快照

BTRFS实际上并不区分快照和普通子卷,所以进行快照实际上也可以被视为创建一个子卷的任意副本。按照惯例,{pve}在创建客户磁盘或子卷的快照时会使用只读标志,但这个标志后来也可以更改。

# btrfs subvolume snapshot -r /some/path /a/new/path

这将在`/a/new/path`的位置创建一个对`/some/path`子卷的只读"克隆"。对`/some/path`的任何未来修改在修改之前都会使被修改的数据被复制。

如果省略了只读(-r)选项,两个子卷都将是可写的。

启用压缩

默认情况下,BTRFS不会压缩数据。要启用压缩,可以添加`compress`挂载选项。请注意,已经写入的数据在事后不会被压缩。

默认情况下,rootfs 将如下列在 /etc/fstab 文件中:

UUID=<uuid of your root file system> / btrfs defaults 0 1

您可以简单地将 compress=zstdcompress=lzocompress=zlib 追加到上面的 defaults 中,如下所示:

UUID=<uuid of your root file system> / btrfs defaults,compress=zstd 0 1

这个更改将在重启后生效。

检查空间使用情况

经典的`df`工具可能会对于一些BTRFS设置输出令人困惑的数值。为了获得更好的估算,请使用`btrfs filesystem usage /PATH`命令,例如:

# btrfs fi usage /my-storage