CephFS 驱动

CephFS 驱动允许 manila 导出由 Ceph 的文件系统 (CephFS) 支持的共享文件系统,使用 Ceph 网络协议或 NFS 协议。客户端需要本地 Ceph 客户端或 NFS 客户端才能挂载文件系统。

当客户端使用本地 Ceph 协议访问 CephFS 时,访问控制通过 Ceph 的 cephx 身份验证系统进行控制。如果用户请求对 ID 的共享访问权限,Ceph 会创建一个相应的 Ceph 身份验证 ID 和密钥(如果它们尚不存在),并授权该 ID 访问共享。然后,客户端可以使用该 ID 和密钥挂载共享。要了解有关配置 Ceph 客户端以访问使用此驱动程序创建的共享的更多信息,请参阅 Ceph 文档

当客户端通过 NFS 访问 CephFS 时,NFS-Ganesha 服务器(或 CephFS NFS 服务)会调解对 CephFS 的访问。该驱动程序通过管理 NFS-Ganesha 服务器的导出,从而启用访问控制。

支持的操作

以下操作支持 CephFS 后端

  • 创建、删除、更新和列出共享

  • 允许/拒绝访问共享

    • 仅支持 cephx 访问类型用于 CephFS 本地协议。

    • 仅支持 ip 访问类型用于 NFS 协议。

    • read-onlyread-write 访问级别受支持。

  • 扩展/缩小共享

  • 管理/取消管理共享

  • 管理/取消管理共享快照

  • 创建、删除、更新和列出快照

  • 创建、删除、更新和列出共享组

  • 删除和列出共享组快照

重要提示

共享组快照创建不再受主流 CephFS 支持。此功能已从 manila W 版本中删除。

先决条件

重要提示

由 CephFS 支持的 manila 共享的质量仅与底层文件系统一样好。在配置 Ceph 集群时要小心,并参考 Ceph 文档 中有关 CephFS 使用的最新指南。

Ceph 测试矩阵

随着 Ceph 和 Manila 的不断发展,测试和支持两个项目都支持的发布组合至关重要。但是,社区带宽不足以涵盖所有这些组合。为了简单起见,我们专注于测试(因此支持)当前的 Ceph 活动发布版本。请查看 Ceph 活动发布版本的列表 此处

以下是 Ceph 发布版本与此项目测试的当前状态。诸如 devstack-plugin-cephtripleo 等相邻组件也添加到下表中。这些项目的贡献者可以确定哪些版本的 ceph 已通过 manila 测试和支持,但此处呈现其状态是为了方便访问。

OpenStack 发布版本

Manila

devstack-plugin-ceph

2024.1 (“Caracal”)

Reef

Reef

2024.2 (“Dalmatian”)

Reef

Reef

2025.1 (“Epoxy”)

Squid

Squid

2025.2 (“Flamingo”)

Squid

Squid

此外,预计可用于 manila 的 Ceph 客户端版本与 Ceph 服务器版本对齐。强烈建议不要混合服务器和客户端版本。

在使用的 NFS Ganesha 驱动程序的情况下,也建议使用与所选 Ceph 版本对齐的版本。

通用先决条件

  • 配置了文件系统的 Ceph 集群(请参阅 创建 ceph 文件系统,了解如何创建文件系统。)

  • 在运行 manila-share 服务的服务器上安装了 python3-radospython3-ceph-argparse 包。

  • Ceph 集群的公共网络与运行 manila-share 服务的服务器之间的网络连接。

对于 CephFS 本地共享

对于 CephFS NFS 共享

CephFS 驱动程序有通过 NFS 配置和导出 CephFS 共享的两种方式。两种方式都涉及用户空间 NFS 服务,NFS-Ganesha。

从 Ceph Quincy 版本开始,支持创建和管理基于 NFS-Ganesha 的“ceph nfs”服务。该服务可以集群化,即它可以有一个或多个活动 NFS 服务协同工作以提供高可用性。您还可以选择部署一个入口服务,以使用 ceph 的管理命令原生地前端此集群。这样做可以简化 NFS 服务以安全地提供 CephFS 共享的管理,并提供可能在生产环境中高度期望的活动/活动高可用性配置。请 遵循 ceph 文档 以获取部署具有必要配置的集群的说明。使用 NFS 集群时,CephFS 驱动程序使用 Ceph mgr API 创建和操作导出,并在创建和删除共享访问规则时创建和操作导出。

CephFS 驱动程序还可以与 Manila 的内置 NFS-Ganesha 驱动程序一起工作,以与独立的、独立的 NFS-Ganesha 服务进行交互,该服务不由 Ceph 编排。与在 Ceph 管理下时不同,NFS 服务器的高可用性必须由外部管理。通常,部署者使用 Pacemaker/Corosync 为此类独立的 NFS-Ganesha 服务提供活动/被动可用性。请参阅 NFS-Ganesha 文档 以获取更多信息。CephFS 驱动程序可以配置为将 NFS 恢复数据存储在 RADOS 池中,以便在服务因故障/停机而关闭和重新启动时促进服务器的恢复。

从 OpenStack Manila Antelope (2023.1) 版本开始,我们建议使用 ceph 编排器部署的 NFS 服务。从 Caracal (2024.1) 版本开始,使用独立的 NFS-Ganesha 服务已被弃用,并且支持将在未来的版本中删除。

CephFS 驱动程序在设置导出时不会指定 NFS 协议版本。这是为了允许部署者直接在 NFS-Ganesha 配置中配置适当的 NFS 协议版本。NFS-Ganesha 默认配置启用 NFS 版本 3 和版本 4.x。请注意,NFS 版本之间在协议级别上存在许多差异。许多部署者仅启用 NFS 版本 4.1(及更高版本)以利用锁定、安全性和端口管理方面的增强功能。请注意,并非所有客户端都支持最新版本的 NFS。

NFS 的先决条件是

  • 客户端上安装了 NFS 客户端。

  • Ceph 集群的公共网络与 NFS-Ganesha 服务之间的网络连接。

  • NFS-Ganesha 服务与挂载 manila 共享的客户端之间的网络连接。

  • 适当的防火墙规则,以允许客户端和 NFS-Ganesha 服务之间的端口访问。

如果您正在部署独立的 NFS-Ganesha 服务,我们建议使用最新版本的 NFS-Ganesha。服务器必须部署 NFS-Ganesha 版本 3.5 或更高版本。

授权驱动程序与 Ceph 通信

Ceph manila 身份所需的权限已从 Wallaby 版本更改。配置的 Ceph manila 身份不再需要任何 MDS 权限。MON 和 OSD 权限也可以减少。但是,现在需要新的 MGR 权限。如果未授予,驱动程序将无法与 Ceph 集群通信。

重要提示

Wallaby(或更高版本)版本中的驱动程序与 Wallaby 之前的版本中的驱动程序相比,需要具有不同的一组 Ceph 权限的 Ceph 身份。

升级到 Wallaby 时,您还需要更新驱动程序使用的 Ceph 身份的权限(请参阅 Ceph 用户权限文档)。例如,已经使用 client.manila Ceph 身份的本地驱动程序,发出命令 ceph auth caps client.manila mon ‘allow r’ mgr ‘allow rw’

如果您正在使用 Ceph 本地 CephFS 或使用 Ceph 管理命令部署的 NFS 服务部署 CephFS 驱动程序,则应将身份验证 ID 设置如下

ceph auth get-or-create client.manila -o manila.keyring \
  mgr 'allow rw' \
  mon 'allow r'

如果您正在使用独立的 NFS-Ganesha 服务部署 CephFS NFS 驱动程序,我们使用一个特定的池来存储导出(可通过配置选项“ganesha_rados_store_pool_name”配置)。client.manila ceph 用户需要权限才能访问此池。因此,应将身份验证 ID 设置如下

ceph auth get-or-create client.manila -o manila.keyring \
  osd 'allow rw pool=<ganesha_rados_store_pool_name>" \
  mgr 'allow rw' \
  mon 'allow r'

manila.keyring 以及您的 ceph.conf 文件,然后需要放置在运行 manila-share 服务的服务器上。

重要提示

为了与 Ceph 后端通信,CephFS 驱动程序实例(表示为 manila.conf 中的后端驱动程序部分)需要其自己的 Ceph 身份验证 ID,该 ID 不被在同一控制器节点上运行的其他 CephFS 驱动程序实例使用。

在运行 manila-share 服务的服务器上,您可以将 ceph.confmanila.keyring 文件放在 /etc/ceph 目录中。为 manila-share 进程和 manila.keyring 文件设置相同的所有者。将以下部分添加到 ceph.conf 文件中。

[client.manila]
client mount uid = 0
client mount gid = 0
log file = /opt/stack/logs/ceph-client.manila.log
admin socket = /opt/stack/status/stack/ceph-$name.$pid.asok
keyring = /etc/ceph/manila.keyring

建议修改 Ceph 客户端的 admin socket 文件和日志文件位置,以便它们与 manila 服务的 pid 文件和日志文件分别位于同一位置。

启用 Ceph 后端的快照支持

从 Ceph Nautilus 开始,在 Ceph 上创建的所有新文件系统默认情况下都启用快照。如果您已升级 Ceph 集群并希望在现有文件系统上启用快照,则可以执行以下操作

ceph fs set {fs_name} allow_new_snaps true

在 manila.conf 中配置 CephFS 后端

配置 CephFS 本地共享后端在 manila.conf 中

将 CephFS 添加到 enabled_share_protocols(在 manila api 层强制执行)。在此示例中,我们保留 NFS 和 CIFS 启用状态,尽管如果您只想使用 CephFS 后端,可以删除这些。

enabled_share_protocols = NFS,CIFS,CEPHFS

创建一个部分,以定义 CephFS 本地后端

[cephfsnative1]
driver_handles_share_servers = False
share_backend_name = CEPHFSNATIVE1
share_driver = manila.share.drivers.cephfs.driver.CephFSDriver
cephfs_conf_path = /etc/ceph/ceph.conf
cephfs_protocol_helper_type = CEPHFS
cephfs_auth_id = manila
cephfs_cluster_name = ceph
cephfs_filesystem_name = cephfs

driver-handles-share-servers 设置为 False,因为驱动程序不管理 share-servers 的生命周期。为了使驱动程序后端通过本地 Ceph 协议公开共享,将 cephfs_protocol_helper_type 设置为 CEPHFS

然后,编辑 enabled_share_backends 以指向驱动程序的后端部分,使用部分名称。在此示例中,我们还包括另一个后端(“generic1”),您将包括配置的任何其他后端。

最后,编辑 cephfs_filesystem_name,使用您想要使用的 Ceph 文件系统(也称为 CephFS 卷)的名称。如果您在集群中拥有多个 Ceph 文件系统,则需要设置此选项。

重要提示

对于 Native CephFS 共享,底层的 cephfs_filesystem_name 对最终用户通过 __mount_options 元数据可见。请确保将 __mount_options 元数据键添加到仅管理员可修改的元数据键列表(admin_only_metadata),如 其他配置选项页面 中所述。

enabled_share_backends = generic1, cephfsnative1

配置 CephFS NFS 共享后端在 manila.conf 中

注意

在配置 Manila CephFS 驱动程序以使用 NFS 之前,您必须安装并配置 NFS-Ganesha。如果您正在使用 ceph 编排器创建 NFS-Ganesha 服务并与 ceph 一起管理它,请参阅 Ceph 文档,了解如何设置此服务。如果您正在使用独立部署的独立的 NFS-Ganesha 服务,请参阅 NFS-Ganesha 设置指南

如果尚未添加,请将 NFS 添加到 enabled_share_protocols

enabled_share_protocols = NFS,CIFS,CEPHFS

创建一个部分,以定义 CephFS NFS 共享后端。以下是使用 ceph 编排器部署的 NFS 服务的示例

[cephfsnfs1]
driver_handles_share_servers = False
share_backend_name = CEPHFSNFS1
share_driver = manila.share.drivers.cephfs.driver.CephFSDriver
cephfs_protocol_helper_type = NFS
cephfs_conf_path = /etc/ceph/ceph.conf
cephfs_auth_id = manila
cephfs_cluster_name = ceph
cephfs_filesystem_name = cephfs
cephfs_nfs_cluster_id = mycephfsnfscluster

以下是使用独立部署的独立的 NFS-Ganesha 服务的示例

[cephfsnfs1]
driver_handles_share_servers = False
share_backend_name = CEPHFSNFS1
share_driver = manila.share.drivers.cephfs.driver.CephFSDriver
cephfs_protocol_helper_type = NFS
cephfs_conf_path = /etc/ceph/ceph.conf
cephfs_auth_id = manila
cephfs_cluster_name = ceph
cephfs_filesystem_name = cephfs
cephfs_ganesha_server_is_remote= False
cephfs_ganesha_server_ip = 172.24.4.3
ganesha_rados_store_enable = True
ganesha_rados_store_pool_name = cephfs_data

在上述驱动程序后端部分中设置以下选项

  • driver-handles-share-servers 设置为 False,因为驱动程序不管理 share-servers 的生命周期。

  • cephfs_protocol_helper_type 设置为 NFS,以允许通过 NFS 协议访问 CephFS 支持的共享。

  • ceph_auth_id 设置为在 授权驱动程序与 Ceph 通信 中创建的 ceph 身份验证 ID。

  • cephfs_nfs_cluster_id - 使用 ceph 编排器部署的集群 NFS 服务时,使用此选项。将其设置为使用 ceph 编排器创建的集群的名称。

  • cephfs_ganesha_server_is_remote - 使用此选项与独立的 NFS-Ganesha 服务配合使用。如果 NFS-ganesha 服务器与 manila-share 服务位于同一位置,则将其设置为 False。如果 NFS-Ganesha 服务器是远程的,则将选项设置为 True,并设置其他选项,例如 cephfs_ganesha_server_ipcephfs_ganesha_server_usernamecephfs_ganesha_server_password(或 cephfs_ganesha_path_to_private_key),以允许驱动程序通过 SSH 管理 NFS-Ganesha 导出条目。

  • cephfs_ganesha_server_ip - 使用此选项与独立的 NFS-Ganesha 服务配合使用。将其设置为 ganesha 服务器的 IP 地址。即使 ganesha 服务器与 manila-share 服务位于同一位置,也建议设置此选项。

  • ganesha_rados_store_enable - 使用此选项与独立的 NFS-Ganesha 服务配合使用。将其设置为 True 或 False。将此选项设置为 True 允许 NFS Ganesha 将导出及其导出计数器存储在 Ceph RADOS 对象中。我们建议将其设置为 True 并使用 RADOS 对象,因为它对于存储配置的高可用性 NFS-Ganesha 部署非常有用,并且可以在已经可用的分布式存储系统中有效地存储配置。

  • ganesha_rados_store_pool_name - 使用此选项与独立的 NFS-Ganesha 服务配合使用。将其设置为您为与 NFS-Ganesha 一起使用而创建的 RADOS 存储池的名称。仅在同时将 ganesha_rados_store_enable 选项设置为 True 时才设置此选项。如果您想使用后端 CephFS 的 RADOS 存储池,那么使用 CephFS 的数据存储池比使用其元数据存储池更可取。

编辑 enabled_share_backends 以指向驱动程序的后端部分,使用部分名称 cephfsnfs1

最后,编辑 cephfs_filesystem_name,使用您想要使用的 Ceph 文件系统(也称为 CephFS 卷)的名称。如果您在集群中拥有多个 Ceph 文件系统,则需要设置此选项。

enabled_share_backends = generic1, cephfsnfs1

空间考虑因素

CephFS 驱动程序向 manila 报告 Ceph 集群中可用的总容量和空闲容量,以允许配置。所有 CephFS 共享都是稀疏配置的,即空共享不会消耗集群中的任何重要空间。CephFS 驱动程序不允许通过 manila 控制过度订阅。因此,只要有空闲空间,配置将继续进行,最终这可能会导致 Ceph 集群过度配置,并且如果共享被填充到容量,您可能会耗尽空间。建议使用 Ceph 的监控工具来监控空间使用情况,并在需要时添加更多存储,以满足配置的 manila 共享的空间需求。您可以使用驱动程序配置选项 reserved_share_percentage 来防止 manila 填满 Ceph 集群,并允许现有共享增长。

创建共享

创建 CephFS 原生共享

默认共享类型可能将 driver_handles_share_servers 设置为 True。配置适合 CephFS 原生共享的共享类型

openstack share type create cephfsnativetype false
openstack share type set cephfsnativetype --extra-specs vendor_name=Ceph storage_protocol=CEPHFS

然后创建共享,

openstack share create --share-type cephfsnativetype --name cephnativeshare1 cephfs 1

注意共享的导出位置

openstack share export location list cephnativeshare1

共享的导出位置包含 Ceph 监控器 (mon) 地址和端口,以及要挂载的路径。其格式为,{mon ip addr:port}[,{mon ip addr:port}]:{path to be mounted}

创建 CephFS NFS 共享

配置适合 CephFS NFS 共享的共享类型

openstack share type create cephfsnfstype false
openstack share type set cephfsnfstype --extra-specs vendor_name=Ceph storage_protocol=NFS

然后创建共享

openstack share create --share-type cephfsnfstype --name cephnfsshare1 nfs 1

注意共享的导出位置

openstack share export location list cephnfsshare1

共享的导出位置包含 NFS-Ganesha 服务器的 IP 地址和要挂载的路径。其格式为,{NFS-Ganesha server address}:{path to be mounted}

管理现有共享和快照

从 2024.2 (Dalmatian) 版本开始,可以将已经存在于 Ceph 存储中的 CephFS 原生和 NFS 共享(子卷)纳入 manila 的管理。与原始方法相比,工作流程会略有不同

  • 应使用 share adoption process,但子卷的名称必须作为 export path 参数提供,以便驱动程序可以适当地找到子卷并对其进行管理。

  • 子卷的 subvolume_mode 不会被 manila 覆盖。

  • 子卷不会在 Ceph 存储中重命名,并且在管理操作结束时,它们的名称将被保留。

  • 如果子卷的当前分配大小 (bytes_quota) 设置为无限大,请确保在 driver_options 参数中指定一个新的 size。驱动程序将尝试使用提供的尺寸调整共享大小,如果尺寸不够,则会失败。

  • 在管理 CephFS 快照时,CephFS 驱动程序将考虑父共享的大小,并将其作为快照的配额进行计算。

允许访问共享

允许访问 CephFS 原生共享

允许 Ceph auth ID alice 使用 cephx 访问类型访问共享。

openstack share access create cephnativeshare1 cephx alice

注意访问状态以及 alice 的访问/密钥。

openstack share access list cephnativeshare1

允许访问 CephFS NFS 共享

允许来宾使用 ip 访问类型访问共享。

openstack share access create cephnfsshare1 ip 172.24.4.225

挂载 CephFS 共享

注意

cephfs 文件系统名称将在 __mount_options 共享的元数据中可用。

使用 FUSE 客户端挂载 CephFS 原生共享

使用授权 ID alice 的密钥创建 keyring 文件,alice.keyring,如下所示

[client.alice]
        key = AQA8+ANW/4ZWNRAAOtWJMFPEihBA1unFImJczA==

使用来自共享导出位置的 mon IP 地址,创建配置文件,ceph.conf,如下所示

[client]
        client quota = true
        mon host = 192.168.1.7:6789, 192.168.1.8:6789, 192.168.1.9:6789

最后,挂载文件系统,替换您刚刚创建的 keyring 和配置文件的文件名,并替换共享导出位置中的要挂载的路径

sudo ceph-fuse ~/mnt \
--id=alice \
--conf=./ceph.conf \
--keyring=./alice.keyring \
--client-mountpoint=/volumes/_nogroup/4c55ad20-9c55-4a5e-9233-8ac64566b98c

使用 Kernel 客户端挂载 CephFS 原生共享

如果您在客户端主机上安装了 ceph-common 包,则可以使用内核客户端挂载 CephFS 共享。

重要提示

如果您选择使用内核客户端而不是 FUSE 客户端,则在内核版本早于 4.17 且 Ceph 版本早于 mimic 的版本中,manila 设置的共享大小限制可能无法遵守。请参阅 quota limitations documentation 以了解 CephFS 配额。

挂载命令如下

mount -t ceph {mon1 ip addr}:6789,{mon2 ip addr}:6789,{mon3 ip addr}:6789:/ \
    {mount-point} -o name={access-id},secret={access-key}

根据我们之前的示例,这将是

mount -t ceph 192.168.1.7:6789, 192.168.1.8:6789, 192.168.1.9:6789:/ \
    /volumes/_nogroup/4c55ad20-9c55-4a5e-9233-8ac64566b98c \
    -o name=alice,secret='AQA8+ANW/4ZWNRAAOtWJMFPEihBA1unFImJczA=='

使用 NFS 客户端挂载 CephFS NFS 共享

在来宾中,使用 NFS 客户端和了解共享的导出位置挂载共享。

sudo mount -t nfs 172.24.4.3:/volumes/_nogroup/6732900b-32c1-4816-a529-4d6d3f15811e /mnt/nfs/

已知限制

  • CephFS 驱动程序实例,表示为 manila.conf 中的后端驱动程序部分,需要一个唯一的 Ceph auth ID 用于后端 Ceph 文件系统。使用非唯一的 Ceph auth ID 将导致驱动程序无意中驱逐使用相同的 Ceph auth ID 连接到后端的其他 CephFS 客户端。

  • 快照是只读的。用户可以从挂载的共享中的 .snap/{manila-snapshot-id}_{unknown-id} 文件夹中读取快照的内容。

安全

使用 CephFS 原生共享后端的安全性

由于来宾需要直接访问 Ceph 的公共网络,因此 CephFS 原生共享后端仅适用于可以信任来宾的私有云。

配置参考

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

配置选项 = 默认值

描述

[DEFAULT]

cephfs_auth_id = manila

(字符串) 要使用的 ceph auth 身份的名称。

cephfs_cluster_name = ceph

(字符串) 要使用的集群的名称(如果不是默认值“ceph”)。

cephfs_conf_path = /etc/ceph/ceph.conf

(字符串) ceph.conf 文件的完整路径。

cephfs_protocol_helper_type = CEPHFS

(字符串) 要使用的协议助手类型。默认值为 CEPHFS。

cephfs_ganesha_server_is_remote = False

(布尔值) NFS-Ganesha 服务器是否远离驱动程序。

cephfs_ganesha_server_ip = None

(字符串) NFS-Ganesha 服务器的 IP 地址。

cephfs_protocol_helper_type = CEPHFS

(字符串) 要使用的协议助手类型。默认值为 CEPHFS。

cephfs_ganesha_server_username = root

(字符串) 在远程 NFS-Ganesha 服务器主机上进行身份验证的用户名。

cephfs_ganesha_path_to_private_key = None

(字符串) 驱动程序主机私有 SSH 密钥文件的路径。

cephfs_ganesha_server_password = None

(字符串) 作为远程 Ganesha 服务器主机中用户的密码。如果配置了“cephfs_ganesha_path_to_private_key”,则不需要此项。

cephfs_ganesha_export_ips = []

(字符串) 导出共享的 IP 列表。如果未提供,则将使用“cephfs_ganesha_server_ip”的值来构造共享导出位置。

cephfs_volume_mode = 755

(字符串) CephFS 卷、快照和快照组的读/写/执行权限模式,以八进制表示,如 Linux “chmod” 或 “umask” 命令中所示。

cephfs_filesystem_name = None

(字符串) 要使用的文件系统名称(如果有多个文件系统在集群中)。

cephfs_ensure_all_shares_salt = manila_cephfs_reef_caracal

(字符串) 提供一个唯一的字符串值,以使驱动程序在启动期间确保其创建的所有共享。确保将重新导出共享,除非在 CephFS 上进行了管理修改,否则此操作不总是必需的。

cephfs_nfs_cluster_id = None

(字符串) 要使用的 NFS 集群的 ID。

The manila.share.drivers.cephfs.driver Module

class AllocationCapacityCache(duration)

基类: object

CephFS 文件系统的分配容量缓存。

缓存有效性由一个非线程安全的秒表测量。

get_data()
is_expired()
update_data(cached_allocated_capacity)
class CephFSDriver(*args, **kwargs)

Bases: ExecuteMixin, GaneshaMixin, ShareDriver

Ceph 文件系统驱动程序。

property ceph_mon_version
check_for_setup_error()

如果未满足先决条件,则返回错误。

create_share(context, share, share_server=None)

创建 CephFS 卷。

参数:
  • context – 一个RequestContext。

  • share – 一个Share。

  • share_server – 对于 CephFS 原生,始终为 None。

返回值:

导出位置字典。

create_share_from_snapshot(context, share, snapshot, share_server=None, parent_share=None)

从快照创建 CephFS 子卷

create_share_group(context, sg_dict, share_server=None)

创建共享组。

参数:
  • context

  • share_group_dict – 共享组详细信息 EXAMPLE:{ ‘status’: ‘creating’, ‘project_id’: ‘13c0be6290934bd98596cfa004650049’, ‘user_id’: ‘a0314a441ca842019b0952224aa39192’, ‘description’: None, ‘deleted’: ‘False’, ‘created_at’: datetime.datetime(2015, 8, 10, 15, 14, 6), ‘updated_at’: None, ‘source_share_group_snapshot_id’: ‘some_fake_uuid’, ‘share_group_type_id’: ‘some_fake_uuid’, ‘host’: ‘hostname@backend_name’, ‘share_network_id’: None, ‘share_server_id’: None, ‘deleted_at’: None, ‘share_types’: [<models.ShareGroupShareTypeMapping>], ‘id’: ‘some_fake_uuid’, ‘name’: None }

返回值:

(share_group_model_update, share_update_list) share_group_model_update - 一个包含要在数据库中更新的 SG 的任何值的字典。此值可能为 None。

create_share_group_snapshot(context, snap_dict, share_server=None)

创建共享组快照。

参数:
  • context

  • snap_dict

    共享组快照详情 示例:.. code

    {
    'status': 'available',
    'project_id': '13c0be6290934bd98596cfa004650049',
    'user_id': 'a0314a441ca842019b0952224aa39192',
    'description': None,
    'deleted': '0',
    'created_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
    'updated_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
    'share_group_id': 'some_fake_uuid',
    'share_group_snapshot_members': [
        {
         'status': 'available',
         'share_type_id': 'some_fake_uuid',
         'user_id': 'a0314a441ca842019b0952224aa39192',
         'deleted': 'False',
         'created_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
         'share': <models.Share>,
         'updated_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
         'share_proto': 'NFS',
         'share_name': 'share_some_fake_uuid',
         'name': 'share-snapshot-some_fake_uuid',
         'project_id': '13c0be6290934bd98596cfa004650049',
         'share_group_snapshot_id': 'some_fake_uuid',
         'deleted_at': None,
         'share_id': 'some_fake_uuid',
         'id': 'some_fake_uuid',
         'size': 1,
         'provider_location': None,
        }
    ],
    'deleted_at': None,
    'id': 'some_fake_uuid',
    'name': None
    }
    

返回值:

(share_group_snapshot_update, member_update_list) share_group_snapshot_update - 一个字典,包含要更新数据库中 CGSnapshot 的任何值。此值可能为 None。

member_update_list - 一个字典列表,包含共享组快照的每个成员的条目。每个字典应包含要更新数据库中 ShareGroupSnapshotMember 的值。此列表可能为空或 None。

create_snapshot(context, snapshot, share_server=None)

用于创建快照。

参数:
  • context – 当前上下文

  • snapshot – 快照模型。可以通过 snapshot[‘share’] 检索共享模型。

  • share_server – 共享服务器模型或 None。

返回值:

None 或包含导出位置列表的字典,如果可以挂载快照。

delete_share(context, share, share_server=None)

用于删除共享。

delete_share_group(context, sg_dict, share_server=None)

删除共享组

参数:
  • context – 请求上下文

  • share_group_dict

    共享组详情 示例:.. code

    {
    'status': 'creating',
    'project_id': '13c0be6290934bd98596cfa004650049',
    'user_id': 'a0314a441ca842019b0952224aa39192',
    'description': None,
    'deleted': 'False',
    'created_at': datetime.datetime(2015, 8, 10, 15, 14, 6),
    'updated_at': None,
    'source_share_group_snapshot_id': 'some_fake_uuid',
    'share_share_group_type_id': 'some_fake_uuid',
    'host': 'hostname@backend_name',
    'deleted_at': None,
    'shares': [<models.Share>], # The new shares being created
    'share_types': [<models.ShareGroupShareTypeMapping>],
    'id': 'some_fake_uuid',
    'name': None
    }
    

返回值:

share_group_model_update share_group_model_update - 一个字典,包含要更新数据库中组的任何值。此值可能为 None。

delete_share_group_snapshot(context, snap_dict, share_server=None)

删除共享组快照

参数:
  • context

  • snap_dict

    共享组快照详情 示例:.. code

    {
    'status': 'available',
    'project_id': '13c0be6290934bd98596cfa004650049',
    'user_id': 'a0314a441ca842019b0952224aa39192',
    'description': None,
    'deleted': '0',
    'created_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
    'updated_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
    'share_group_id': 'some_fake_uuid',
    'share_group_snapshot_members': [
        {
         'status': 'available',
         'share_type_id': 'some_fake_uuid',
         'share_id': 'some_fake_uuid',
         'user_id': 'a0314a441ca842019b0952224aa39192',
         'deleted': 'False',
         'created_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
         'share': <models.Share>,
         'updated_at': datetime.datetime(2015, 8, 10, 0, 5, 58),
         'share_proto': 'NFS',
         'share_name':'share_some_fake_uuid',
         'name': 'share-snapshot-some_fake_uuid',
         'project_id': '13c0be6290934bd98596cfa004650049',
         'share_group_snapshot_id': 'some_fake_uuid',
         'deleted_at': None,
         'id': 'some_fake_uuid',
         'size': 1,
         'provider_location': 'fake_provider_location_value',
        }
    ],
    'deleted_at': None,
    'id': 'f6aa3b59-57eb-421e-965c-4e182538e36a',
    'name': None
    }
    

返回值:

(share_group_snapshot_update, member_update_list) share_group_snapshot_update - 一个字典,包含要更新数据库中 ShareGroupSnapshot 的任何值。此值可能为 None。

delete_snapshot(context, snapshot, share_server=None)

用于删除快照。

参数:
  • context – 当前上下文

  • snapshot – 快照模型。可以通过 snapshot[‘share’] 检索共享模型。

  • share_server – 共享服务器模型或 None。

do_setup(context)

共享驱动程序启动时执行的任何初始化。

ensure_shares(context, shares)

确保共享已导出。

驱动程序可以使用此方法更新后端上存储的共享的项目和用户信息(如果它们发生更改)。为此,应返回一个共享字典。此外,驱动程序可以尝试对每个共享应用“reapply_access_rules”(布尔值)。如果此属性存在且设置为 True,则共享管理器服务将使用服务数据库中的所有访问规则调用“update_access”。 :shares: 用于更新的所有共享的列表。 :returns: None 或更新字典,格式如下。

示例

{
    '09960614-8574-4e03-89cf-7cf267b0bd08': {
        'export_locations': [{...}, {...}],
        'status': 'error',
        'reapply_access_rules': False,
    },

    '28f6eabb-4342-486a-a7f4-45688f0c0295': {
        'export_locations': [{...}, {...}],
        'status': 'available',
        'reapply_access_rules': True,
    },

}
extend_share(share, new_size, share_server=None)

扩展现有共享的大小。

参数:
  • share – 共享模型

  • new_size – 共享的新大小(new_size > share[‘size’])

  • share_server – 可选 – 共享服务器模型

get_backend_info(context)

获取驱动程序和阵列配置参数。

驱动程序可以使用此方法获取特殊配置信息并返回以进行评估。共享管理器服务使用此评估在服务启动期间调用“ensure_shares”。

返回值:

包含驱动程序特定信息的字典。

示例

{
     'version': '2.23'
     'port': '80',
     'logicalportip': '1.1.1.1',
      ...
}

get_configured_ip_versions()

获取允许的 IP 版本。

支持的版本以列表形式返回,可能的值为:[4],[6] 或 [4, 6]

断言 ipv6_implemented = True 的驱动程序必须覆盖此方法。 如果返回的列表中包含 4,则由此驱动程序创建的共享必须具有 IPv4 导出位置。 如果列表包含 6,则由此驱动程序创建的共享必须具有 IPv6 导出位置。

驱动程序应检查其存储控制器是否实际启用了并正确配置了 IPv4/IPv6。

get_optional_share_creation_data(share, share_server=None)

获取要在共享中设置的附加属性。

返回值:

要在共享中设置的元数据。

get_share_status(share, share_server=None)

返回共享的当前状态。

参数:
  • share – 一个 manila 共享。

  • share_server – 一个 manila 共享服务器(当前不支持)。

返回值:

manila 共享状态。

manage_existing(share, driver_options)

将现有共享置于 Manila 管理之下。

如果提供的共享无效,则引发 ManageInvalidShare 异常,说明失败原因。

如果提供的共享不在可以管理的状态,例如在后端上复制,则驱动程序必须引发 ManageInvalidShare 异常并提供适当的消息。

共享具有 share_type,驱动程序可以检查该类型并将其与引用的后端共享的属性进行比较。如果它们不兼容,则引发 ManageExistingShareTypeMismatch,说明失败原因。

当正在管理的共享类型具有设置为 False 的 driver_handles_share_servers 额外规范时,调用此方法。

参数:
  • share – 共享模型

  • driver_options – 管理员提供的驱动程序特定选项。

返回值:

share_update 字典,其中包含必需的键“size”,该键应包含共享的大小。

manage_existing_snapshot(snapshot, driver_options)

将现有的快照置于 Manila 管理之下。

如果提供的快照无效,则引发 ManageInvalidShareSnapshot 异常,说明失败原因。

当正在管理的快照属于具有设置为 False 的 driver_handles_share_servers 额外规范的 share type 时,调用此方法。

参数:

snapshot – 包含 ShareSnapshot 数据的 ShareSnapshotInstance 模型。

示例:

{ ‘id’: <实例 id>, ‘snapshot_id’: < 快照 id>, ‘provider_location’: <位置>, … }

参数:

driver_options – 管理员提供的可选驱动程序特定选项。

示例

{
'key': 'value',
...
}
返回值:

model_update 字典,其中包含必需的键“size”,该键应包含共享快照的大小,以及包含导出位置列表的键“export_locations”(如果可以挂载快照)。

property rados_client
setup_default_ceph_cmd_target()
shrink_share(share, new_size, share_server=None)

缩小现有共享的大小。

如果共享上的已用空间大于 new_size,驱动程序应引发 ShareShrinkingPossibleDataLoss 异常:raise ShareShrinkingPossibleDataLoss(share_id=share[‘id’])

参数:
  • share – 共享模型

  • new_size – 共享的新大小(new_size < share[‘size’])

  • share_server – 可选 – 共享服务器模型

:raises ShareShrinkingPossibleDataLoss, NotImplementedError

transfer_accept(context, share, new_user, new_project, access_rules=None, share_server=None)

如果存储在后端上,则更新后端项目和用户信息。

参数:
  • context – 请求的 ‘context.RequestContext’ 对象。

  • share – 共享实例模型。

  • access_rules – 给定共享的访问规则列表。

  • new_user – 共享将使用新的用户 ID 更新。

  • new_project – 共享将使用新的项目 ID 更新。

  • share_server – 给定共享的共享服务器。

update_access(context, share, access_rules, add_rules, delete_rules, update_rules, share_server=None)

更新给定共享的访问规则。

access_rules 包含需要应用于共享的所有访问规则。如果驱动程序可以进行批量访问规则更新,则可以安全地忽略 add_rulesdelete_rules 参数。

如果驱动程序无法进行批量访问规则更改,则可以依赖于 add_rules 中存在新规则,并且 delete_rules 中存在需要删除的规则。

delete_rules 中的规则从未应用时,驱动程序不得引发异常,也不应尝试将规则设置为“error”状态。

add_rulesdelete_rules 可以是空列表,在这种情况下,驱动程序应确保 access_rules 中存在的规则与后端上的规则相同。强制执行此情况的一种情况是当更改所有现有规则的访问级别时(共享迁移和可读副本)。

驱动程序必须注意共享副本的此调用。当在副本之一上调用“update_access”时,该调用可能会传播到属于该共享的所有副本,尤其是在添加或删除单个规则时。如果特定的访问规则在给定副本的上下文中对驱动程序没有意义,则驱动程序应小心报告正确的行为,并采取有意义的措施。例如,如果在属于“可读”类型复制的副本上请求 R/W 访问权限;驱动程序可以添加 R/O 访问权限而不是 R/W 访问权限。请注意,引发异常导致副本和共享本身的 access_rules_status 变为“out_of_sync”。驱动程序可以在 create_replicapromote_replica 调用上提供的有效访问规则上同步。

参数:
  • context – 当前上下文

  • share – 包含共享数据的共享模型。

  • access_rules – 给定共享的访问规则列表

  • add_rules – 空列表或应添加的访问规则列表。access_rules 已经包含这些规则。

  • delete_rules – 空列表或应删除的访问规则列表。access_rules 不包含这些规则。

  • update_rules – 空列表或应更新的访问规则列表。access_rules 已经包含这些规则。

  • share_server – None 或共享服务器模型

返回值:

None,或包含格式为

{

‘09960614-8574-4e03-89cf-7cf267b0bd08’: {

‘access_key’: ‘alice31493e5441b8171d2310d80e37e’, ‘state’: ‘error’,

},

’28f6eabb-4342-486a-a7f4-45688f0c0295’: {

‘access_key’: ‘bob0078aa042d5a7325480fd13228b’, ‘state’: ‘active’,

},

}

的更新字典。顶层键是需要更新的访问规则的 ‘access_id’ 字段。access_key``s 授予访问权限的实体的凭据(字符串)。 ``access_rules 参数中的任何规则都可以更新。

重要提示

在此方法中引发异常将强制所有处于“applying”和“denying”状态的规则变为“error”。

可以显式通过此返回参数将访问规则设置为“error”状态,或者因为在此方法中引发了异常。这样的访问规则将不再发送到驱动程序后续的访问规则更新中。但是,当用户拒绝该规则时,驱动程序将被要求拒绝代表该规则的客户端的访问权限。我们期望在驱动程序上出错的规则永远不会存在于后端。因此,请勿使删除请求失败。

此外,驱动程序可能会收到请求以添加规则,该规则已经存在于后端。当共享管理器服务在驱动程序提交访问规则更改时停止工作时,可能会发生这种情况。由于我们无法确定在中断之前驱动程序是否已成功应用该规则,因此我们将所有“applying”转换规则视为新规则并重复该请求。

property volname
class NFSClusterProtocolHelper(execute, config_object, **kwargs)

基类: NFSProtocolHelperMixin, NASHelperBase

check_for_setup_error()

如果未满足先决条件,则返回错误。

get_backend_info(context)
property nfs_clusterid
reapply_rules_while_ensuring_shares = True
supported_access_levels = ('rw', 'ro')
supported_access_types = ('ip',)
update_access(context, share, access_rules, add_rules, delete_rules, update_rules, share_server=None, sub_name=None)

更新共享的访问规则。

为每个共享创建一个导出。通过 Ceph NFS 动态更新导出来修改共享的访问规则。

class NFSProtocolHelper(execute, config_object, **kwargs)

基类: NFSProtocolHelperMixin, GaneshaNASHelper2

check_for_setup_error()

如果未满足先决条件,则返回错误。

get_backend_info(context)
reapply_rules_while_ensuring_shares = True
shared_data = {}
supported_protocols = ('NFS',)
class NFSProtocolHelperMixin

基类: object

get_configured_ip_versions()
get_export_locations(share, subvolume_path)
get_optional_share_creation_data(share, share_server=None)
class NativeProtocolHelper(execute, config, **kwargs)

基类: NASHelperBase

CephFS 本机协议的辅助类

check_for_setup_error()

如果未满足先决条件,则返回错误。

get_backend_info(context)
get_configured_ip_versions()
get_export_locations(share, subvolume_path)
get_mon_addrs()
get_optional_share_creation_data(share, share_server=None)
reapply_rules_while_ensuring_shares = False
supported_access_levels = ('rw', 'ro')
supported_access_types = ('cephx',)
update_access(context, share, access_rules, add_rules, delete_rules, update_rules, share_server=None, sub_name=None)

更新共享的访问规则。

exception RadosError

基础: Exception

与 librados 的 Ceph 通信时出错

rados_command(rados_client, prefix=None, args=None, json_obj=False, target=None, inbuf=None)

ceph_argparse.json_command 的更安全包装器

引发错误异常,而不是依赖调用者检查返回值。

错误异常可能由以下原因引起:* 超时 * 实际的合法错误 * 格式错误的 JSON 输出

return: 如果 json_obj 为 True,则返回 Ceph 的解码 JSON 对象,

如果返回空字符串,则返回 None。如果 json 为 False,则返回解码字符串(Ceph 命令返回的数据)

setup_json_command()
setup_rados()