跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 储存管理指南 / 网络存储 / NVMe over Fabric
适用范围 SUSE Linux Enterprise Server 15 SP5

17 NVMe over Fabric

本章介绍如何设置 NVMe over Fabric 主机和目标。

17.1 概览

NVM Express (NVMe) 是有关访问非易失性存储(通常是 SSD 磁盘)的接口标准。与 SATA 相比,NVMe 支持的速度要高得多,并且延迟更低。

NVMe over Fabric 是用于通过不同网络结构访问 NVMe 存储的体系结构。这些网络结构有 RDMATCP基于光纤通道的 NVMe (FC-NVMe) 等。NVMe over Fabric 的作用类似于 iSCSI。为提高容错能力,NVMe over Fabric 内置了多路径支持。NVMe over Fabric 多路径不是基于传统的 DM 多路径。

NVMe 主机是指连接到 NVMe 目标的计算机。NVMe 目标是指共享其 NVMe 块设备的计算机。

SUSE Linux Enterprise Server 15 SP5 支持 NVMe。提供了可用于 NVMe 块存储以及 NVMe over Fabric 目标和主机的内核模块。

要查看您的硬件是否有任何特殊注意事项,请参见第 17.4 节 “特殊硬件配置”

17.2 设置 NVMe over Fabric 主机

要使用 NVMe over Fabric,必须在目标上使用支持的联网方法。支持的方法包括基于光纤通道的 NVMe、TCP 和 RDMA。以下几节介绍如何将主机连接到 NVMe 目标。

17.2.1 安装命令行客户端

要使用 NVMe over Fabric,需要安装 nvme 命令行工具。请使用 zypper 安装该工具:

> sudo zypper in nvme-cli

使用 nvme --help 可列出所有可用的子命令。我们提供了 nvme 子命令的手册页。执行 man nvme-SUBCOMMAND 可查阅相关的手册页。例如,要查看 discover 子命令的手册页,请执行 man nvme-discover

17.2.2 发现 NVMe over Fabric 目标

要列出 NVMe over Fabric 目标上的可用 NVMe 子系统,您需要有发现控制器地址和服务 ID。

> sudo nvme discover -t TRANSPORT -a DISCOVERY_CONTROLLER_ADDRESS -s SERVICE_ID

TRANSPORT 替换为底层传输媒体:looprdmatcpfc。将 DISCOVERY_CONTROLLER_ADDRESS 替换为发现控制器的地址。对于 RDMA 和 TCP,此地址应是 IPv4 地址。将 SERVICE_ID 替换为传输服务 ID。如果服务基于 IP(例如 RDMA 或 TCP),则服务 ID 指定端口号。对于光纤通道,不需要提供服务 ID。

NVMe 主机只会看到它们有权连接的子系统。

示例:

> sudo nvme discover -t tcp -a 10.0.0.3 -s 4420

对于 FC,其示例如下所示:

> sudo nvme discover --transport=fc \
                --traddr=nn-0x201700a09890f5bf:pn-0x201900a09890f5bf \
                --host-traddr=nn-0x200000109b579ef6:pn-0x100000109b579ef6

有关细节,请参见man nvme-discover

17.2.3 连接 NVMe over Fabric 目标

识别 NVMe 子系统后,便可以使用 nvme connect 命令来连接它。

> sudo nvme connect -t transport -a DISCOVERY_CONTROLLER_ADDRESS -s SERVICE_ID -n SUBSYSTEM_NQN

TRANSPORT 替换为底层传输媒体:looprdmatcpfc。将 DISCOVERY_CONTROLLER_ADDRESS 替换为发现控制器的地址。对于 RDMA 和 TCP,此地址应是 IPv4 地址。将 SERVICE_ID 替换为传输服务 ID。如果服务基于 IP(例如 RDMA 或 TCP),则此 ID 指定端口号。将 SUBSYSTEM_NQN 替换为发现命令找到的所需子系统的 NVMe 限定名称。NQNNVMe 限定名称 (NVMe Qualified Name) 的缩写。NQN 必须唯一。

示例:

> sudo nvme connect -t tcp -a 10.0.0.3 -s 4420 -n nqn.2014-08.com.example:nvme:nvm-subsystem-sn-d78432

对于 FC,其示例如下所示:

> sudo nvme connect --transport=fc \
             --traddr=nn-0x201700a09890f5bf:pn-0x201900a09890f5bf \
             --host-traddr=nn-0x200000109b579ef6:pn-0x100000109b579ef6 \
             --nqn=nqn.2014-08.org.nvmexpress:uuid:1a9e23dd-466e-45ca-9f43-a29aaf47cb21

或者,使用 nvme connect-all 连接到发现的所有名称空间。有关高级用法,请参见 man nvme-connectman nvme-connect-all

如果发生路径丢失,NVMe 子系统会尝试重新连接一段时间,该时间由 nvme connect 命令的 ctrl-loss-tmo 选项定义。在这段时间(默认值为 600s)过后,将去除该路径并通知块层(文件系统)的上层。默认情况下,随后会以只读模式挂载文件系统,这种行为通常不符合预期。因此,建议设置 ctrl-loss-tmo 选项,使 NVMe 子系统无限制地持续尝试重新连接。为此,请运行以下命令:

> sudo nvme connect --ctrl-loss-tmo=-1

要使 NVMe over Fabric 子系统在引导时可用,请在主机上创建一个 /etc/nvme/discovery.conf 文件,并在其中包含传递给 discover 命令的参数(请参见第 17.2.2 节 “发现 NVMe over Fabric 目标”)。例如,如果您按如下所示使用 discover 命令:

> sudo nvme discover -t tcp -a 10.0.0.3 -s 4420

请将 discover 命令的参数添加到 /etc/nvme/discovery.conf 文件中:

echo "-t tcp -a 10.0.0.3 -s 4420" | sudo tee -a /etc/nvme/discovery.conf

然后启用 nvmf-autoconnect 服务:

> sudo systemctl enable nvmf-autoconnect.service

17.2.4 多路径

NVMe 本机多路径默认处于启用状态。如果在控制器标识设置中设置了 CMIC 选项,则 NVMe 堆栈默认会将 NVMe 驱动器识别为多路径设备。

要管理多路径,您可以使用以下命令:

管理多路径
nvme list-subsys

打印多路径设备的布局。

multipath -ll

命令 有兼容模式,可显示 NVMe 多路径设备。请记住,您需要启用 enable_foreign 选项才能使用该命令。有关细节,请参见第 18.13 节 “其他选项”

nvme-core.multipath=N

当作为引导参数添加该选项时,将禁用 NVMe 本机多路径。

注意
注意:在多路径设置中使用 iostat

iostat 命令可能不会显示 nvme list-subsys 列出的所有控制器。默认情况下,iostat 会过滤掉所有没有 I/O 的块设备。要使 iostat 显示所有设备,请使用:

iostat -p ALL

17.3 设置 NVMe over Fabric 目标

17.3.1 安装命令行客户端

要配置 NVMe over Fabric 目标,需要安装 nvmetcli 命令行工具。请使用 zypper 安装该工具:

> sudo zypper in nvmetcli

nvmetcli 上提供了 http://git.infradead.org/users/hch/nvmetcli.git/blob_plain/HEAD:/Documentation/nvmetcli.txt 的最新文档。

17.3.2 配置步骤

下面的过程举例说明如何设置 NVMe over Fabric 目标。

配置存储在树型结构中。使用 cd 命令可导航。使用 ls 可列出对象。您可以使用 create 创建新对象。

  1. 启动 nvmetcli 交互外壳:

    > sudo nvmetcli
  2. 创建新端口:

    (nvmetcli)> cd ports
    (nvmetcli)> create 1
    (nvmetcli)> ls 1/
    o- 1
      o- referrals
      o- subsystems
  3. 创建 NVMe 子系统:

    (nvmetcli)> cd /subsystems
    (nvmetcli)> create nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82
    (nvmetcli)> cd nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82/
    (nvmetcli)> ls
    o- nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82
      o- allowed_hosts
      o- namespaces
  4. 创建新的名称空间,并在其中设置 NVMe 设备:

    (nvmetcli)> cd namespaces
    (nvmetcli)> create 1
    (nvmetcli)> cd 1
    (nvmetcli)> set device path=/dev/nvme0n1
    Parameter path is now '/dev/nvme0n1'.
  5. 启用先前创建的名称空间:

    (nvmetcli)> cd ..
    (nvmetcli)> enable
    The Namespace has been enabled.
  6. 显示创建的名称空间:

    (nvmetcli)> cd ..
    (nvmetcli)> ls
    o- nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82
      o- allowed_hosts
      o- namespaces
        o- 1
  7. 允许所有主机使用该子系统。只有在安全环境中才可这样做。

    (nvmetcli)> set attr allow_any_host=1
    Parameter allow_any_host is now '1'.

    或者,可以只允许特定的主机建立连接:

    (nvmetcli)> cd nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82/allowed_hosts/
    (nvmetcli)> create hostnqn
  8. 列出创建的所有对象:

    (nvmetcli)> cd /
    (nvmetcli)> ls
    o- /
      o- hosts
      o- ports
      | o- 1
      |   o- referrals
      |   o- subsystems
      o- subsystems
        o- nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82
          o- allowed_hosts
          o- namespaces
            o- 1
  9. 使目标可通过 TCP 使用。为 RDMA 使用 trtype=rdma

    (nvmetcli)> cd ports/1/
    (nvmetcli)> set addr adrfam=ipv4 trtype=tcp traddr=10.0.0.3 trsvcid=4420
    Parameter trtype is now 'tcp'.
    Parameter adrfam is now 'ipv4'.
    Parameter trsvcid is now '4420'.
    Parameter traddr is now '10.0.0.3'.

    或者,使目标可通过光纤通道使用:

    (nvmetcli)> cd ports/1/
    (nvmetcli)> set addr adrfam=fc trtype=fc traddr=nn-0x1000000044001123:pn-0x2000000055001123 trsvcid=none
  10. 将子系统链接到该端口:

    (nvmetcli)> cd /ports/1/subsystems
    (nvmetcli)> create nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82

    现在,可以使用 dmesg 校验该端口是否已启用:

    # dmesg
            ...
    [  257.872084] nvmet_tcp: enabling port 1 (10.0.0.3:4420)

17.3.3 备份和恢复目标配置

可使用以下命令在 JSON 文件中保存目标配置:

> sudo nvmetcli
(nvmetcli)> saveconfig nvme-target-backup.json

要恢复配置,请使用:

(nvmetcli)> restore nvme-target-backup.json

您还可以擦除当前配置:

(nvmetcli)> clear

17.4 特殊硬件配置

17.4.1 概览

有些硬件需要特殊的配置才能正常工作。请浏览以下章节的标题,确定您是否使用了所提到的设备或供应商。

17.4.2 Broadcom

如果您在使用 Broadcom Emulex LightPulse Fibre Channel SCSI 驱动程序,请在 lpfc 模块的目标和主机中添加内核配置参数:

> sudo echo "options lpfc lpfc_enable_fc4_type=3" > /etc/modprobe.d/lpfc.conf

确保 Broadcom 适配器固件的版本至少为 11.4.204.33。另外确保已安装最新版本的 nvme-clinvmetcli 和内核。

要启用光纤通道端口作为 NVMe 目标,需要额外配置一个模块参数:lpfc_enable_nvmet= COMMA_SEPARATED_WWPNS。请输入带有前置 0x 的 WWPN,例如 lpfc_enable_nvmet=0x2000000055001122,0x2000000055003344。系统只会为目标模式配置列出的 WWPN。可将光纤通道端口配置为目标发起端。

17.4.3 Marvell

QLE269x 和 QLE27xx 适配器上都支持 FC-NVMe。Marvell® QLogic® QLA2xxx 光纤通道驱动程序中默认会启用 FC-NVMe 支持。

要确认 NVMe 是否已启用,请运行以下命令:

> cat /sys/module/qla2xxx/parameters/ql2xnvmeenable

如果显示 1,则表示 NVMe 已启用,显示 0 表示 NVMe 已禁用。

然后,检查以下命令的输出,确保 Marvell 适配器固件的版本不低于 8.08.204:

> cat /sys/class/scsi_host/host0/fw_version

最后,确保已安装适用于 SUSE Linux Enterprise Server 的最新版 nvme-cliQConvergeConsoleCLI 和内核。例如,您可以运行

# zypper lu && zypper pchk

来检查更新和补丁。

有关安装的更多细节,请参考下列 Marvell 用户指南中的 FC-NVMe 部分:

17.5 更多信息

有关 nvme 命令各功能的更多细节,请参考 nvme nvme-help

以下链接提供了 NVMe 和 NVMe over Fabric 的简介: