ZFS - zfs

ZFS 结合了物理卷管理和文件系统。ZFS 安装可以跨越一系列存储设备,并且可扩展性很强,允许您立即添加磁盘以扩展存储池中的可用空间。

ZFS 是一个基于块的文件系统,它使用校验和来验证、确认和纠正每次操作,从而防止数据损坏。为了以足够的速度运行,此机制需要一个具有大量 RAM 的强大环境。

此外,ZFS 还提供了快照和复制、RAID 管理、写时复制克隆、压缩和其他功能。

要使用 ZFS,请确保您的机器上安装了 zfsutils-linux

术语

ZFS 根据物理存储设备创建逻辑单元。这些逻辑单元称为 *ZFS 池* 或 *zpools*。每个 zpool 然后被划分为多个 *数据集*。这些数据集可以是不同类型

  • *ZFS 文件系统* 可以看作是一个分区或一个已挂载的文件系统。

  • *ZFS 卷* 代表一个块设备。

  • *ZFS 快照* 捕获 *ZFS 文件系统或 ZFS 卷的特定状态。ZFS 快照是只读的。

  • *ZFS 克隆* 是 ZFS 快照的可写副本。

zfs Incus 中的驱动程序

Incus 中的 zfs 驱动程序使用ZFS 文件系统和 ZFS 卷用于镜像和自定义存储卷,以及 ZFS 快照和克隆来从镜像创建实例以及实例和自定义卷快照。默认情况下,Incus 在创建 ZFS 池时启用压缩。

Incus 假设它对 ZFS 池和数据集拥有完全控制权。因此,您不应该维护任何数据集或不在 Incus 拥有的 ZFS 池或数据集中的文件系统实体,因为 Incus 可能会删除它们。

由于 ZFS 中写时复制的工作方式,父级ZFS 文件系统无法在所有子级消失之前被删除。因此,Incus 会自动重命名所有已删除但仍在引用的对象。这些对象将保存在随机的 deleted/ 路径下,直到所有引用都消失,并且该对象可以安全删除。请注意,此方法可能会影响恢复快照。请参阅下面的 限制

Incus 会在 ZFS 0.8 或更高版本上自动为所有新创建的池启用修剪支持。这通过允许控制器更好地重用块来延长 SSD 的寿命,并且还允许在使用循环回退的 ZFS 池时释放根文件系统上的空间。如果您运行的是 ZFS 版本低于 0.8,并且想要启用修剪,请升级到至少 0.8 版。然后使用以下命令确保将来自动为 ZFS 池启用修剪,并修剪所有当前未使用的空间

zpool upgrade ZPOOL-NAME
zpool set autotrim=on ZPOOL-NAME
zpool trim ZPOOL-NAME

限制

zfs 驱动程序有以下限制

从旧快照恢复

ZFS 不支持从除最新快照之外的快照恢复。但是,您可以从旧快照创建新实例。此方法可以帮助您确认特定快照是否包含您需要的内容。确定正确的快照后,您可以 删除较新的快照,这样您需要的快照就是最新的快照,您可以恢复它。

或者,您可以将 Incus 配置为在恢复期间自动丢弃较新的快照。为此,请设置卷的 zfs.remove_snapshots 配置(或存储池上的相应 volume.zfs.remove_snapshots 配置,以适用于池中的所有卷)。

但是,请注意,如果 zfs.clone_copy 设置为 true,则实例副本也会使用 ZFS 快照。在这种情况下,您无法将实例恢复到最后一次副本之前拍摄的快照,除非您也删除所有后代。如果这不是一种选择,您可以将想要的快照复制到一个新实例中,然后删除旧实例。但是,您会丢失实例可能具有的任何其他快照。

观察 I/O 配额

I/O 配额不太可能影响ZFS 文件系统太多。这是因为 ZFS 是 Solaris 模块的移植(使用 SPL),而不是使用 Linux VFS API 的本机 Linux 文件系统,而 Linux VFS API 是应用 I/O 限制的地方。

ZFS 中的功能支持

某些功能,例如使用 idmaps 或委托 ZFS 数据集,需要 ZFS 2.2 或更高版本,因此目前还没有得到广泛支持。

配额

ZFS 提供了两种不同的配额属性:quotarefquotaquota 限制了数据集的总大小,包括其快照和克隆。 refquota 仅限制数据集中的数据大小,不包括其快照和克隆。

默认情况下,Incus 在您为存储卷设置配额时使用 quota 属性。如果您想使用 refquota 属性,请为该卷设置 zfs.use_refquota 配置(或在存储池上设置相应的 volume.zfs.use_refquota 配置,用于池中的所有卷)。

您还可以设置 zfs.use_reserve_space(或 volume.zfs.use_reserve_space)配置,以便与 quotarefquota 一起使用 ZFS reservationrefreservation

配置选项

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

存储池配置

类型

默认值

描述

size

string

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

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

source

string

-

现有块设备、循环文件或 ZFS 数据集/池的路径。多个块设备应以 , 分隔。列出块设备时,您也可以在它们前面加上 vdev 类型。要指定 vdev 类型,请在 vdev 类型和块设备之间使用 = 符号(例如,mirror=/dev/sda,/dev/sdb)。仅支持 stripemirrorraidz1raidz2 vdev 类型。

source.wipe

bool

false

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

zfs.clone_copy

string

true

是否使用 ZFS 轻量级克隆而不是完整数据集副本(布尔值),或 rebase 以基于初始映像进行复制

zfs.export

bool

true

在执行卸载操作时禁用 zpool 导出

zfs.pool_name

string

池的名称

zpool 的名称

提示

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

存储卷配置

类型

条件

默认值

描述

block.filesystem

string

具有内容类型 filesystem 的基于块的卷(zfs.block_mode 已启用)

volume.block.filesystem 相同

存储卷的文件系统:btrfsext4xfs(如果未设置,则为 ext4

block.mount_options

string

具有内容类型 filesystem 的基于块的卷(zfs.block_mode 已启用)

volume.block.mount_options 相同

基于块的文件系统卷的挂载选项

security.shared

bool

自定义块卷

volume.security.sharedfalse 相同

启用跨多个实例共享卷

security.shifted

bool

自定义卷

volume.security.shiftedfalse 相同

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

security.unmapped

bool

自定义卷

volume.security.unmappedfalse 相同

禁用卷的 ID 映射

size

string

volume.size 相同

存储卷的大小/配额

snapshots.expiry

string

自定义卷

volume.snapshots.expiry 相同

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

snapshots.pattern

string

自定义卷

volume.snapshots.patternsnap%d 相同

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

snapshots.schedule

string

自定义卷

snapshots.schedule 相同

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

zfs.blocksize

string

volume.zfs.blocksize 相同

ZFS 块的大小,范围为 512 到 16 MiB(必须为 2 的幂) - 对于块卷,即使设置了更高的值,最大值也将为 128 KiB

zfs.block_mode

bool

volume.zfs.block_mode 相同

是否使用格式化的 zvol 而不是数据集zfs.block_mode 只能为自定义存储卷设置;使用 volume.zfs.block_mode 为池中的所有存储卷启用 ZFS 块模式,包括实例卷)

zfs.delegate

bool

ZFS 2.2 或更高版本

volume.zfs.delegate 相同

控制是否将 ZFS 数据集及其下方的任何内容委派给使用它的容器。允许在容器中使用 zfs 命令。

zfs.remove_snapshots

bool

volume.zfs.remove_snapshotsfalse 相同

根据需要删除快照

zfs.use_refquota

bool

volume.zfs.use_refquotafalse 相同

使用 refquota 而不是 quota 来设置空间

zfs.reserve_space

bool

volume.zfs.reserve_spacefalse 相同

使用 reservation/refreservation 以及 quota/refquota

存储桶配置

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

类型

条件

默认值

描述

size

string

合适的驱动程序

volume.size 相同

存储桶的大小/配额