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

17 NVMe-oF

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

17.1 概述

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

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

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

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

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

17.2 设置 NVMe-oF 主机

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

17.2.1 安装命令行客户端

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

> sudo zypper in nvme-cli

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

17.2.2 发现 NVMe-oF 目标

要列出 NVMe-oF 目标上的可用 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-oF 目标

识别 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-oF 目标”)。例如,如果您按如下所示使用 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 本机多路径。

17.3 设置 NVMe-oF 目标

17.3.1 安装命令行客户端

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

> sudo zypper in nvmetcli

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

17.3.2 配置步骤

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

配置存储在树型结构中。使用 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-oF over TCP 引导

根据 NVM Express® Boot Specification 1.0 的要求,SLES 支持通过 NVMe-oF over TCP 引导。

可以对 UEFI 预引导环境进行配置,以尝试与远程存储服务器建立 NVMe-oF over TCP 连接,并使用这些连接进行引导。预引导环境会创建一个 ACPI 表(即 NVMe 引导固件表 [NBFT]),来存储用于引导的 NVMe-oF 的配置信息。操作系统会在稍后的引导阶段使用此表来设置网络和 NVMe-oF 连接,以访问根文件系统。

17.5.1 系统要求

要通过 NVMe-oF over TCP 引导系统,则必须满足以下要求:

  • SLES15 SP6 或更高版本。

  • 支持 NVMe-oF over TCP 的 SAN 存储阵列

  • 配有支持通过 NVMe-oF over TCP 引导的 BIOS 的主机系统。请咨询硬件供应商了解是否支持此功能。目前只有 UEFI 平台支持通过 NVMe-oF over TCP 引导。

17.5.2 安装

要通过 NVMe-oF over TCP 安装 SLES,请执行以下步骤:

  1. 使用主机系统的 UEFI 设置菜单配置要在引导时建立的 NVMe-oF 连接。通常,您需要配置网络(本地 IP 地址、网关等)和 NVMe-oF 目标(远程 IP 地址、子系统 NQN 或发现 NQN)。请参见硬件文档获取配置说明。硬件供应商可能会提供集中和远程管理 BIOS 配置的方法。请与硬件供应商联系以获取更多信息。

  2. 部署指南中所述准备安装。

  3. 使用任何支持的安装方法启动系统安装。您无需使用任何特定的引导参数在 NVMe-oF over TCP 上启用安装。

  4. 如果 BIOS 配置正确,YaST 中的磁盘分区对话框将显示由 BIOS 中配置的子系统导出的 NVMe 名称空间。它们将显示为 NVMe 设备,其中字符串 tcp 表示设备通过 TCP 传输连接。在这些名称空间上安装操作系统(特别是 EFI 引导分区和根文件系统)。

  5. 完成安装。

安装后,系统应该会自动通过 NVMe-oF over TCP 引导。如果系统没有引导,请检查 BIOS 设置中是否正确设置了引导优先级。

用于引导的网络接口名为 nbft0nbft1,依此类推。要获取有关 NVMe-oF 引导的信息,请运行以下命令:

# nvme nbft show

17.6 更多信息

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

下面的链接提供了 NVMe 和 NVMe-oF 的基本介绍: