Btrfs - btrfs

Btrfs 是一种基于 COW 原理的本地文件系统。COW 表示数据在修改后存储到不同的块,而不是覆盖现有数据,从而降低数据损坏的风险。与其他文件系统不同,Btrfs 基于范围,这意味着它将数据存储在内存的连续区域中。

除了基本的文件系统功能外,Btrfs 还提供 RAID 和卷管理、池、快照、校验和、压缩和其他功能。

要使用 Btrfs,请确保您的机器上安装了 btrfs-progs

术语

Btrfs 文件系统可以具有子卷,这些子卷是文件系统主树的命名二进制子树,具有自己的独立文件和目录层次结构。Btrfs 快照是一种特殊类型的子卷,它捕获另一个子卷的特定状态。快照可以是读写或只读的。

btrfs 驱动程序在 Incus 中

Incus 中的 btrfs 驱动程序每个实例、镜像和快照使用一个子卷。创建新实体(例如,启动新实例)时,它会创建一个 Btrfs 快照。

Btrfs 本身不支持存储块设备。因此,当将 Btrfs 用于虚拟机时,Incus 会在磁盘上创建一个大文件来存储虚拟机。这种方法效率不高,并且在创建快照时可能会导致问题。

Btrfs 可用作嵌套 Incus 环境中容器内的存储后端。在这种情况下,父容器本身必须使用 Btrfs。但是,请注意,嵌套 Incus 设置不会继承父级的 Btrfs 配额(请参阅下面配额)。

配额

Btrfs 通过 qgroups 支持存储配额。Btrfs qgroups 是分层的,但新的子卷不会自动添加到其父级子卷的 qgroups 中。这意味着用户可以轻松地逃避任何设置的配额。因此,如果需要严格的配额,您应该考虑使用其他存储驱动程序(例如,带有 refquota 的 ZFS 或带有 Btrfs 的 LVM)。

使用配额时,必须考虑到 Btrfs 范围是不可变的。写入块时,它们最终会进入新的范围。旧范围将保留,直到其所有数据被取消引用或重写。这意味着即使子卷中当前文件使用的总空间小于配额,也可能达到配额。

注意

在 Btrfs 上使用虚拟机时,最常看到此问题,这是因为在 Btrfs 子卷之上使用原始磁盘映像文件导致随机 I/O。

因此,您永远不要将 Btrfs 存储池与虚拟机一起使用。

如果您确实需要将 Btrfs 存储池与虚拟机一起使用,请将实例根磁盘的 size.state 属性设置为根磁盘大小的两倍。此配置允许磁盘映像文件中的所有块被重写,而不会达到 qgroup 配额。 btrfs.mount_options=compress-force 存储池选项也可以避免这种情况,因为启用压缩的副作用是减少最大范围大小,以便块重写不会导致那么多存储被双重跟踪。但是,这是一个存储池选项,因此它会影响池中的所有卷。

配置选项

以下配置选项可用于使用 btrfs 驱动程序的存储池以及这些池中的存储卷。

存储池配置

类型

默认

描述

btrfs.mount_options

字符串

user_subvol_rm_allowed

块设备的挂载选项

大小

字符串

自动(可用磁盘空间的 20%,>= 5 GiB 且 <= 30 GiB)

创建基于循环设备的存储池时存储池的大小(以字节为单位,支持后缀,可以增加以扩展存储池)

字符串

-

现有块设备、循环文件或 Btrfs 子卷的路径

source.wipe

布尔值

false

在创建存储池之前擦除source中指定的块设备

提示

除了这些配置之外,您还可以为存储卷配置设置默认值。请参阅为存储卷配置默认值

存储卷配置

类型

条件

默认

描述

security.shared

布尔值

自定义块卷

volume.security.shared相同或false

启用跨多个实例共享卷

security.shifted

布尔值

自定义卷

volume.security.shifted相同或false

启用 ID 偏移覆盖(允许多个隔离的实例附加)

security.unmapped

布尔值

自定义卷

volume.security.unmapped相同或false

禁用卷的 ID 映射

大小

字符串

合适的驱动程序

volume.size相同

存储卷的大小/配额

snapshots.expiry

字符串

自定义卷

volume.snapshots.expiry相同

控制何时删除快照(期望类似于1M 2H 3d 4w 5m 6y的表达式)

snapshots.pattern

字符串

自定义卷

volume.snapshots.pattern相同或snap%d

表示快照名称的 Pongo2 模板字符串(用于计划快照和未命名快照)[1]

snapshots.schedule

字符串

自定义卷

volume.snapshots.schedule相同

Cron 表达式(<minute> <hour> <dom> <month> <dow>),一个以逗号分隔的计划别名列表(@hourly@daily@midnight@weekly@monthly@annually@yearly)或为空以禁用自动快照(默认值)

存储桶配置

要为本地存储池驱动程序启用存储桶并允许应用程序通过 S3 协议访问这些桶,您必须配置core.storage_buckets_address服务器设置。

类型

条件

默认

描述

大小

字符串

合适的驱动程序

volume.size相同

存储桶的大小/配额