Hitachi NAS 平台文件服务 OpenStack 驱动

驱动版本 3.0

Hitachi NAS 平台存储要求

此 Hitachi NAS 平台文件服务 OpenStack 驱动程序支持 Hitachi NAS 平台 (HNAS) 型号 3080、3090、4040、4060、4080 和 4100,以及 NAS OS 12.2 或更高版本。在配置驱动程序之前,请确保 HNAS 至少具有

  • 1 个存储池(span)已配置。

  • 1 个 EVS 已配置。

  • 1 个文件系统在此 EVS 中,创建时未使用复制目标选项,并且应处于已挂载状态。建议禁用自动扩展,因为调度器在创建共享时会使用文件系统报告的当前可用空间。

  • 1 个具有“supervisor”权限级别的管理用户已配置。

  • Hitachi NAS 管理界面应可从 manila-share 节点访问。

此外,如果驱动程序将创建 CIFS 共享,则必须先在 HNAS 中配置 LDAP 服务器或域,以提供用户和组。

支持的操作

以下操作在此版本的 Hitachi NAS 平台文件服务 OpenStack 驱动程序中受支持

  • 创建和删除 CIFS 和 NFS 共享;

  • 扩展和缩小共享;

  • 管理共享规则(允许/拒绝访问);

  • 允许和拒绝共享访问;

    • IP 访问类型支持 NFS 共享;

    • User 访问类型支持 CIFS 共享;

    • NFS 和 CIFS 共享都支持 RWRO 访问级别;

  • 管理和取消管理共享;

  • 创建和删除快照;

  • 从快照创建共享。

驱动程序配置

本文档包含 Hitachi NAS 平台文件服务 OpenStack 驱动程序的安装和用户指南。虽然提到了共享文件系统服务操作和 HNAS 命令,但两者都不在此文档的范围内。请参阅各自的指南以获取详细信息。

在配置驱动程序之前,请确保运行 manila-share 服务的节点可以访问 HNAS 管理端口,并且计算和网络节点可以访问数据端口(EVS IP 或聚合)。

驱动程序配置可以总结为以下步骤

  1. manila.conf 中配置 HNAS 参数;

  2. 准备网络,确保所有 OpenStack-HNAS 连接(如上所述);

  3. 配置/创建共享类型;

  4. 重新启动服务;

  5. 配置 OpenStack 网络。

步骤 1 - HNAS 参数配置

需要在 /etc/manila/manila.conf 的 [DEFAULT] 部分中配置以下参数

选项

描述

enabled_share_backends

用于指定后端的章节名称。例如:enabled_share_backends = hnas1

enabled_share_protocols

指定允许用于共享创建的协议列表。此驱动程序版本支持 NFS 和/或 CIFS。

需要在 /etc/manila/manila.conf 的 [backend] 部分中配置以下参数

选项

描述

share_backend_name

后端的名称。

share_driver

Python 模块路径。对于此驱动程序 必须是manila.share.drivers.hitachi.hnas.driver.HitachiHNASDriver

driver_handles_share_servers

驱动程序工作模式。对于此驱动程序 必须是False

hitachi_hnas_ip

用于 manila-share 节点与 HNAS 通信的 HNAS 管理界面 IP。

hitachi_hnas_user

此字段用于向 HNAS 提供用户凭据。提供的管理用户必须具有“supervisor”权限级别。

hitachi_hnas_password

此字段用于向 HNAS 提供密码凭据。必须设置 hitachi_hnas_password 或 hitachi_hnas_ssh_private_key 中的一个。

hitachi_hnas_ssh_private_key

使用 RSA/DSA 私钥路径设置此参数,以允许驱动程序连接到 HNAS。

hitachi_hnas_evs_id

此后端分配到的 EVS 的 ID(可以使用 CLI “evs list” 或 HNAS 界面中的 EVS 管理列出 ID)。

hitachi_hnas_evs_ip

用于挂载共享的 EVS IP(可以使用 CLI “evs list” 或 HNAS 界面中的 EVS 管理列出)。

hitachi_hnas_file_system_name

位于指定 EVS 中的 HNAS 中的文件系统名称。

hitachi_hnas_cluster_admin_ip0*

如果 HNAS 处于多农场(一个 SMU 管理多个 HNAS)配置中,请将此参数设置为集群管理节点的 IP。

hitachi_hnas_stalled_job_timeout*

tree-clone-job 命令用于创建快照和从快照创建共享。此参数设置等待作业完成的超时时间(秒)。默认值为 30 秒。

hitachi_hnas_driver_helper*

驱动程序助手模块的 Python 路径。对于此驱动程序,应使用(默认值):manila.share.drivers.hitachi.hnas.ssh.HNASSSHBackend

hitachi_hnas_allow_cifs_snapshot_while_mounted*

默认情况下,当共享具有连接的客户端时,不允许获取 CIFS 快照,因为无法保证所有文件的即时副本。可以将此参数设置为 True 以允许在共享具有连接的客户端时获取快照。 警告:将此参数设置为 True 可能会导致 CIFS 共享上的不一致快照。默认值为 False

* 非必需参数。

以下是有效 HNAS 驱动程序配置的示例

[DEFAULT]``
...
enabled_share_backends = hitachi1
enabled_share_protocols = CIFS,NFS
...

[hitachi1]
share_backend_name = HITACHI1
share_driver = manila.share.drivers.hitachi.hnas.driver.HitachiHNASDriver
driver_handles_share_servers = False
hitachi_hnas_ip = 172.24.44.15
hitachi_hnas_user = supervisor
hitachi_hnas_password = supervisor
hitachi_hnas_evs_id = 1
hitachi_hnas_evs_ip = 10.0.1.20
hitachi_hnas_file_system_name = FS-Manila

步骤 2 - 准备网络

在 Hitachi NAS 平台文件服务 OpenStack 驱动程序使用的驱动程序模式中,driver_handles_share_servers (DHSS) 为 False,驱动程序不处理网络配置,而是由管理员配置。必须能够从 manila-share 节点通过管理网络访问 HNAS 管理界面,同时通过数据接口(EVS IP 或聚合)从 OpenStack Cloud 访问所选 EVS 数据接口,例如通过 neutron flat 网络。以下是示例配置的逐步说明

Manila-Share 节点
eth0:管理网络,可以 ping HNAS 管理界面。
eth1:数据网络,可以 ping HNAS EVS IP(数据接口)。如果计划使用共享迁移,则只需要此接口。
网络节点和计算节点
eth0:管理网络,可以 ping HNAS 管理界面。
eth1:数据网络,可以 ping HNAS EVS IP(数据接口)。

下图表示描述的场景

../_images/hds_network.jpg

网络节点 上运行

$ sudo ifconfig eth1 0
$ sudo ovs-vsctl add-br br-eth1
$ sudo ovs-vsctl add-port br-eth1 eth1
$ sudo ifconfig eth1 up

编辑 /etc/neutron/plugins/ml2/ml2_conf.ini(默认目录),将以下设置更改为各自标签中的如下内容

[ml2]
type_drivers = flat,vlan,vxlan,gre
mechanism_drivers = openvswitch

[ml2_type_flat]
flat_networks = physnet1,physnet2

[ml2_type_vlan]
network_vlan_ranges = physnet1:1000:1500,physnet2:2000:2500

[ovs]
bridge_mappings = physnet1:br-ex,physnet2:br-eth1

如果计算节点中存在,您可能需要在计算节点中的另一个文件中重复上述最后一行,该文件位于:/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini

为租户网络配置 HNAS 路由。请确保已启用多租户,并为每个 EVS 配置路由。使用 HNAS 控制台中的“route-net-add”命令,其中 network 参数应为租户的专用网络,而 gateway 参数应为 flat 网络网关,并且“console-context –evs”参数应为正在使用的 EVS 的 ID,如下例所示

$ console-context --evs 3 route-net-add --gateway 192.168.1.1 10.0.0.0/24

步骤 3 - 共享类型配置

共享文件系统服务要求共享类型包含 driver_handles_share_servers 额外规范。这可确保共享将在支持请求的 driver_handles_share_servers 功能的后端上创建。对于 Hitachi NAS 平台文件服务 OpenStack 驱动程序,必须将其设置为 False。

$ manila type-create hitachi False

此外,驱动程序还报告以下常见功能,可以在共享类型中指定

功能

描述

thin_provisioning = True

HNAS 上的所有共享始终采用稀疏配置。因此,如果设置了它,则该值 必须是True

dedupe = True/False

HNAS 支持其文件系统上的重复数据删除,并且如果文件系统上启用了重复数据删除,驱动程序将报告 dedupe=True。要使用它,请转到 HNAS 并启用文件系统上的功能。

要在共享类型中指定常见功能,请使用 type-key 命令,例如

$ manila type-key hitachi set dedupe=True

步骤 4 - 重新启动服务

重新启动所有共享文件系统服务(manila-share、manila-scheduler 和 manila-api)和 neutron 服务(neutron-*)。此步骤特定于您的环境。如果您正在使用 devstack,则必须登录到屏幕 (screen -r),停止该过程 (Ctrl^C),然后再次运行它。如果您正在使用 RHEL 等发行版,则可以使用 systemd 命令(例如 systemctl restart manila-api)来重新启动服务。

步骤 5 - 配置 OpenStack 网络

在 Neutron Controller 中,必须创建网络、子网并将此子网接口添加到路由器

为给定的租户(demo)创建网络,提供 DEMO_ID(可以使用 keystone tenant-list 获取),网络的名称以及虚拟网络实现的物理网络的名称以及虚拟网络实现的物理机制的类型

$ neutron net-create --tenant-id <DEMO_ID> hnas_network
--provider:physical_network=physnet2 --provider:network_type=flat

为同一租户(demo)创建子网,提供 DEMO_ID(可以使用 keystone tenant-list 获取),此子网的网关 IP、子网的名称、之前步骤中创建的网络 ID(可以使用 neutron net-list 获取)以及子网的 CIDR

$ neutron subnet-create --tenant-id <DEMO_ID> --gateway <GATEWAY>
--name hnas_subnet <NETWORK_ID> <SUBNET_CIDR>

最后,将子网接口添加到路由器,提供路由器 ID 和之前步骤中创建的子网 ID(可以使用 neutron subnet-list 获取)

$ neutron router-interface-add <ROUTER_ID> <SUBNET_ID>

管理和取消管理共享

Manila 具有管理和取消管理共享的能力。如果存储中存在共享但不在 OpenStack 中,您可以管理该共享并将其用作 manila 共享。Hitachi NAS 平台文件服务 OpenStack 驱动程序使用虚拟卷 (V-VOL) 创建共享。只有具有配额限制的 V-VOL 才能由驱动程序使用,此外,它们必须在 ‘/shares/’ 目录中创建或移动,并导出(作为 NFS 或 CIFS 共享)。取消管理操作只会取消共享与 OpenStack 的关联,保留共享中的所有数据。

管理 共享,请使用

$ manila manage [--name <name>] [--description <description>]
[--share_type <share_type>] [--driver_options [<key=value> [<key=value> ...]]]
<service_host> <protocol> <export_path>

其中

参数

描述

service_host

Manila 主机、后端和共享名称。例如 ubuntu@hitachi1#HITACHI1。可以使用命令 manila pool-list(仅限管理员)列出可用的主机。

协议

当前支持 NFS 或 CIFS 协议。

export_path

共享的导出路径。例如:172.24.44.31:/shares/some_share_id

取消管理 共享,请使用

$ manila unmanage <share_id>

其中

参数

描述

share_id

要取消管理的 Manila 共享 ID。可以使用 manila list 获取此列表。

附加说明

  • HNAS 对 EVS、文件系统、虚拟卷和并发 SSC 连接的数量有一些限制。请查看您的系统的手册规范。

  • 共享和快照采用稀疏配置。它仅向 manila 报告 HNAS 中实际使用的空间。此外,快照最初不会占用 HNAS 中的任何空间,它仅存储共享和快照之间的差异,因此当共享数据发生更改时,它才会增长。

  • 管理员应管理租户的配额(manila quota-update)以控制后端的用法。

  • 默认情况下,当共享已挂载时,禁用 CIFS 快照,因为它使用 tree-clone 创建快照,并且不能保证当源目录树发生更改时所有文件的即时副本。此外,将权限更改为 只读 不会影响已挂载的共享。因此,如果您的源目录在拍摄快照时可以保持静态,请启用它。当前,它仅影响 CIFS 协议。有关更多信息,请使用 man tree-clone 查看 HNAS 中的 tree-clone 功能。

manila.share.drivers.hitachi.hnas.driver 模块

class HitachiHNASDriver(*args, **kwargs)

基类: ShareDriver

Manila HNAS 驱动程序实现。

驱动程序版本

1.0.0 - Initial Version.
2.0.0 - Refactoring, bugfixes, implemented Share Shrink and
        Update Access.
3.0.0 - New driver location, implemented support for CIFS protocol.
3.1.0 - Added admin network export location support.
4.0.0 - Added mountable snapshots, revert-to-snapshot and
        manage snapshots features support.
create_share(context, share, share_server=None)

创建共享。

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

  • share – 将创建的共享。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

返回值:

返回包含文件系统中共享路径与 EVS IP 组合的字典列表。

NFS 示例

[

{

‘path’: ‘172.24.44.10:/shares/id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘192.168.0.10:/shares/id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

CIFS 示例

[

{

‘path’: ‘\172.24.44.10id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘\192.168.0.10id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

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

从快照创建新的共享。

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

  • share – 关于新共享的信息。

  • snapshot – 关于将复制到新共享的快照的信息。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

返回值:

返回包含文件系统中共享路径与 EVS IP 组合的字典列表。

NFS 示例

[

{

‘path’: ‘172.24.44.10:/shares/id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘192.168.0.10:/shares/id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

CIFS 示例

[

{

‘path’: ‘\172.24.44.10id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘\192.168.0.10id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

create_snapshot(context, snapshot, share_server=None)

创建快照。

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

  • snapshot – 将创建的快照。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

delete_share(context, share, share_server=None)

删除共享。

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

  • share – 将删除的共享。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

delete_snapshot(context, snapshot, share_server=None)

删除快照。

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

  • snapshot – 将删除的快照。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

ensure_share(context, share, share_server=None)

确保共享已导出。

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

  • share – 将检查的共享。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

返回值:

返回包含文件系统中共享路径与 EVS IP 组合的字典列表。

NFS 示例

[

{

‘path’: ‘172.24.44.10:/shares/id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘192.168.0.10:/shares/id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

CIFS 示例

[

{

‘path’: ‘\172.24.44.10id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘\192.168.0.10id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

ensure_snapshot(context, snapshot, share_server=None)

确保快照已导出。

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

  • snapshot – 将检查的快照。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

返回值:

返回包含文件系统中快照路径与 EVS IP 组合的字典列表,或者如果 mount_snapshot_support 为 False,则返回 None。

NFS 示例

[

{

‘path’: ‘172.24.44.10:/snapshots/id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘192.168.0.10:/snapshots/id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

CIFS 示例

[

{

‘path’: ‘\172.24.44.10id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘\192.168.0.10id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

extend_share(share, new_size, share_server=None)

扩展共享到新大小。

参数:
  • share – 将扩展的共享。

  • new_size – 共享的新大小。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

get_network_allocations_number()

跟踪 allocations_number 在 DHSS = true 中。

当使用设置 driver_handles_share_server = false 时,不需要跟踪 allocations_number,因为我们不处理网络内容。

manage_existing(share, driver_options)

管理后端上存在的共享。

参数:
  • share – 将要管理的共享。

  • driver_options – 空字典或包含 ‘volume_id’ 选项的字典。

返回值:

返回一个字典,包含已管理共享的大小以及包含其导出位置的字典列表。

NFS 示例

{

‘size’: 10, ‘export_locations’: [

{

‘path’: ‘172.24.44.10:/shares/id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘192.168.0.10:/shares/id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

}

CIFS 示例

{

‘size’: 10, ‘export_locations’: [

{

‘path’: ‘\172.24.44.10id’, ‘metadata’: {}, ‘is_admin_only’: False

},

{

‘path’: ‘\192.168.0.10id’, ‘metadata’: {}, ‘is_admin_only’: True

}

]

}

manage_existing_snapshot(snapshot, driver_options)

管理仅存在于 HNAS 中的快照。

要管理的快照应位于路径 /snapshots/SHARE_ID/SNAPSHOT_ID。此外,应提供快照的大小,如 –driver_options size=<size>。 :param snapshot: 将要管理的快照。 :param driver_options: 仅期望一个键 ‘size’。必须提供该键才能管理快照。

返回值:

返回一个字典,包含已管理快照的大小

revert_to_snapshot(context, snapshot, share_access_rules, snapshot_access_rules, share_server=None)

将共享恢复到给定的快照。

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

  • snapshot – 要恢复到的快照。

  • share_access_rules – 受影响共享的所有访问规则列表。此驱动程序未使用。

  • snapshot_access_rules – 受影响快照的所有访问规则列表。此驱动程序未使用。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

shrink_share(share, new_size, share_server=None)

将共享缩小到新大小。

参数:
  • share – 将要缩小的共享。

  • new_size – 共享的新大小。

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。

snapshot_update_access(context, snapshot, access_rules, add_rules, delete_rules, share_server=None)

更新给定快照的访问规则。

驱动程序应在此方法中支持 2 种不同的情况:1. 错误恢复 - ‘access_rules’ 包含所有访问规则,‘add_rules’ 和 ‘delete_rules’ 应为空。驱动程序应清除任何现有的访问规则并应用给定快照的所有访问规则。此恢复在驱动程序启动时进行。

2. 添加/删除多个访问规则 - ‘access_rules’ 包含所有访问规则,‘add_rules’ 和 ‘delete_rules’ 包含应添加/删除的规则。驱动程序可以忽略 ‘access_rules’ 中的规则,并仅应用 ‘add_rules’ 和 ‘delete_rules’ 中的规则。所有快照规则应为只读。

参数:
  • context – 当前上下文

  • snapshot – 包含快照数据的快照模型。

  • access_rules – 给定快照的所有访问规则

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

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

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

unmanage(share)

取消管理共享。

参数:

share – 将要取消管理的共享。

unmanage_snapshot(snapshot)

取消管理共享快照

参数:

snapshot – 将要取消管理的快照。

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

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

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

  • share – 将要更新其访问规则的共享。

  • access_rules – 给定共享的所有访问规则。

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

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

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

  • share_server – 包含共享服务器信息的结构。此驱动程序未使用。