ZFS (on Linux) driver

Manila ZFSonLinux 共享驱动程序使用 ZFS 文件系统来导出 NFS 共享。使用 Linux 版本的 ZFS 编写和测试。

需求

  • 可以通过 exportfs 应用处理的 NFS 守护进程。

  • ZFS 文件系统包,内核或 FUSE 版本。

  • 要由 Manila 使用的 ZFS zpool 应该存在并按预期配置。Manila 不会更改 zpool 配置。

  • 对于根据 manila-share 服务主机 SSH 安装的远程 ZFS 主机。

  • 对于支持复制的 ZFS 主机

    • 彼此之间应该使用无密码 SSH 访问。

    • ZFS 主机应该能够相互访问服务 IP 地址。

支持的共享文件系统和操作

该驱动程序支持 NFS 共享。

支持以下操作

  • 创建共享。

  • 删除共享。

  • 允许共享访问。

    • 仅支持 IP 访问类型。

    • 支持两种访问级别 - RWRO

  • 拒绝共享访问。

  • 将现有的 ZFSOnLinux 共享置于共享文件系统服务之下 (管理共享)

  • 从共享文件系统服务中删除 ZFSOnLinux 共享,而不删除它 (取消管理共享)

  • 创建快照。

  • 删除快照。

  • 将现有的 ZFSOnLinux 快照置于共享文件系统服务之下 (管理快照)

  • 从共享文件系统服务中删除 ZFSOnLinux 快照,而不删除它 (取消管理快照)

  • 从快照创建共享。

  • 扩展共享。

  • 缩小共享。

  • 共享复制 (实验)

    • 支持创建、更新、删除和提升副本操作。

可能性

  • 任何数量的 ZFS zpool 都可以由共享驱动程序使用。

  • 允许为用于共享创建的 ZFS 数据集配置默认选项。

  • 允许使用任何数量的嵌套数据集。

  • 所有共享副本都是只读的,只有激活副本是读写。

  • 所有共享副本都会定期同步,而不是持续同步。状态 in_sync 表示上次同步成功。同步之间的时间范围等于配置全局选项 replica_state_update_interval 的值。

  • 驱动程序可以使用限定的额外规范 zfsonlinux:compression。它可以包含 ZFS 应用支持的任何值。但是,如果通过配置选项将其禁用,值为 compression=off,则将不会使用它。

限制

ZFSonLinux 共享驱动程序具有以下限制

  • 仅支持 NFS 的 IP 访问类型。

  • 仅支持 FLAT 网络。

  • Promote share replica 操作将切换当前 secondary 副本和 active 副本的角色。它不会使多个激活副本可用。

  • 以下项目尚未实现

    • SaMBa 基于共享。

    • Thick provisioning 功能。

已知问题

  • Promote share replica 操作将使成为辅助的 ZFS 文件系统在 NFS 级别上变为只读。在 ZFS 级别,系统将保持挂载状态 - 读写。

后端配置

对于使用 ZFSonLinux 驱动程序的后端,需要在 manila 配置文件中配置以下参数

  • share_driver = manila.share.drivers.zfsonlinux.driver.ZFSonLinuxShareDriver

  • driver_handles_share_servers = False

  • replication_domain = custom_str_value_as_domain_name

    • 如果为空,则将禁用复制。

    • 如果设置,则可以作为与具有相同值的其他后端复制对等方使用。

  • zfs_share_export_ip = <用户可见的 ZFS 主机 IP 地址>

  • zfs_service_ip = <ZFS 主机的服务网络接口的 IP 地址>

  • zfs_zpool_list = zpoolname1,zpoolname2/nested_dataset_for_zpool2

    • 可以是多个 zpool。

    • 可以包含嵌套数据集。

  • zfs_dataset_creation_options = <ZFS 数据集选项列表>

    • readonly、quota、sharenfs 和 sharesmb 选项将被忽略。

  • zfs_dataset_name_prefix = <前缀>

    • 要在每个数据集名称中使用的前缀。

  • zfs_dataset_snapshot_name_prefix = <前缀>

    • 要在每个数据集快照名称中使用的前缀。

  • zfs_use_ssh = <布尔值>

    • 如果 ZFS 位于与 manila-share 服务相同的宿主机上,则设置为 False

    • 如果 manila-share 服务应使用 SSH 进行 ZFS 配置,则设置为 True

  • zfs_ssh_username = <ssh_username>

    • 复制操作需要。

    • 如果将 zfs_use_ssh 设置为 True,则需要 SSH 到 ZFS 主机。

  • zfs_ssh_user_password = <ssh_user_password>

    • ZFS 主机的 zfs_ssh_username 的密码。

    • 仅当 zfs_use_ssh 设置为 True 时使用。

  • zfs_ssh_private_key_path = <私钥 SSH 的路径>

    • 仅当 zfs_use_ssh 设置为 True 时使用。

  • zfs_share_helpers = NFS=manila.share.drivers.zfsonlinux.utils.NFSviaZFSHelper

    • 设置 helpers 的方法与其他各种共享驱动程序类似。

    • 至少应使用一个 helper。

  • zfs_replica_snapshot_prefix = <前缀>

    • 要在通过 update replica 操作创建的数据集快照名称中使用的前缀。

驱动程序选项

ZFS 共享驱动程序配置选项的说明

配置选项 = 默认值

描述

[DEFAULT]

zfs_dataset_creation_options = None

(列表) 如果需要,在此处定义应用于每个数据集创建的选项列表。示例:compression=gzip,dedup=off。请注意,对于辅助副本,选项“readonly”将设置为“on”,对于活动副本将设置为“off”。此外,“quota”将等于共享大小。可选。

zfs_dataset_name_prefix = manila_share_

(字符串) 在每个数据集名称中使用的前缀。可选。

zfs_dataset_snapshot_name_prefix = manila_share_snapshot_

(字符串) 在每个数据集快照名称中使用的前缀。可选。

zfs_migration_snapshot_prefix = tmp_snapshot_for_share_migration_

(字符串) 用于 ZFS 迁移的快照前缀。必需。

zfs_replica_snapshot_prefix = tmp_snapshot_for_replication_

(字符串) 用于 ZFS 复制的快照前缀。必需。

zfs_service_ip = None

(字符串) 要添加到面向管理员的导出位置的 IP。必需。

zfs_share_export_ip = None

(字符串) 要添加到面向用户的导出位置的 IP。必需。

zfs_share_helpers = NFS=manila.share.drivers.zfsonlinux.utils.NFSviaZFSHelper

(列表) 指定 ZFS 存储的共享导出 helpers 列表。它应该如下所示:“FOO_protocol=foo.FooClass,BAR_protocol=bar.BarClass”。必需。

zfs_ssh_private_key_path = None

(字符串) 用于 SSH 到 ZFS 存储主机的 SSH 私钥的路径。不用于复制操作。可选。

zfs_ssh_user_password = None

(字符串) 用于 SSH 到 ZFS 存储主机的用户的密码。不用于复制操作。它们需要无密码 SSH 访问。可选。

zfs_ssh_username = None

(字符串) 将在 2 种情况下使用的 SSH 用户:1) 如果 manila-share 服务位于与 ZFS 存储不同的主机上,则由 manila-share 服务使用。 2) 与执行复制的其他 ZFS 后端一起使用的 manila-share 服务。预计 SSH 将基于密钥,无密码。此用户应该是无密码 sudoer。可选。

zfs_use_ssh = False

(布尔值) 远程 ZFS 存储主机名,应将其用于 SSH。可选。

zfs_zpool_list = None

(列表) 指定允许后端使用的 zpool 列表。可以包含嵌套数据集。示例:没有嵌套数据集:“zpool_name”。带有嵌套数据集:“zpool_name/nested_dataset_name”。必需。