17.1 概述 #
NVM Express® (NVMe®) 是有关访问非易失性存储设备(通常是 SSD 磁盘)的接口标准。与 SATA 相比,NVMe 支持的速度要高得多,并且延迟更低。
NVMe-oF™ 是用于通过不同网络结构访问 NVMe 存储设备的体系结构。这些网络结构包括 RDMA、TCP 或基于光纤通道的 NVMe (FC-NVMe) 等。NVMe-oF 的作用类似于 iSCSI。为提高容错能力,NVMe-oF 内置了多路径支持。NVMe-oF 多路径并非基于传统的 DM 多路径运作。
NVMe 主机是指连接到 NVMe 目标的计算机。NVMe 目标是指共享其 NVMe 块设备的计算机。
SUSE Linux Enterprise Server 15 SP7 支持 NVMe,提供了可用于 NVMe 块存储以及 NVMe-oF 目标和主机的内核模块。
要查看您的硬件是否有任何特殊注意事项,请参见第 17.4 节 “特殊硬件配置”。
17.2 设置 NVMe-oF 主机 #
要使用 NVMe-oF,必须采用支持的联网方法提供目标。支持的方法包括基于光纤通道的 NVMe、TCP 和 RDMA。以下几节介绍如何将主机连接到 NVMe 目标。
17.2.1 安装命令行客户端 #
        要使用 NVMe-oF,需要安装 nvme 命令行工具。请使用 zypper 安装该工具:
      
>sudozypper in nvme-cli
        使用 nvme --help 可列出所有可用的子命令。我们提供了 nvme 子命令的手册页。执行 man
        nvme-SUBCOMMAND 可查阅相关的手册页。例如,要查看 discover 子命令的手册页,请执行 man nvme-discover。
      
17.2.2 发现 NVMe-oF 目标 #
要列出 NVMe-oF 目标上的可用 NVMe 子系统,您需要有发现控制器地址和服务 ID。
>sudonvme discover -t TRANSPORT -a DISCOVERY_CONTROLLER_ADDRESS -s SERVICE_ID
        将 TRANSPORT 替换为底层传输媒体:loop、rdma、tcp 或 fc。将 DISCOVERY_CONTROLLER_ADDRESS 替换为发现控制器的地址。对于 RDMA 和 TCP,此地址应是 IPv4 地址。将 SERVICE_ID 替换为传输服务 ID。如果服务基于 IP(例如 RDMA 或 TCP),则服务 ID 指定端口号。对于光纤通道,不需要提供服务 ID。
      
NVMe 主机只会看到它们有权连接的子系统。
示例:
>sudonvme discover -t tcp -a 10.0.0.3 -s 4420
对于 FC,其示例如下所示:
>sudonvme 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 命令来连接它。
      
>sudonvme connect -t transport -a DISCOVERY_CONTROLLER_ADDRESS -s SERVICE_ID -n SUBSYSTEM_NQN
        将 TRANSPORT 替换为底层传输媒体:loop、rdma、tcp 或 fc。将 DISCOVERY_CONTROLLER_ADDRESS 替换为发现控制器的地址。对于 RDMA 和 TCP,此地址应是 IPv4 地址。将 SERVICE_ID 替换为传输服务 ID。如果服务基于 IP(例如 RDMA 或 TCP),则此 ID 指定端口号。将 SUBSYSTEM_NQN 替换为发现命令找到的所需子系统的 NVMe 限定名称。NQN 是 NVMe 限定名称 (NVMe Qualified Name) 的缩写。NQN 必须唯一。
      
示例:
>sudonvme connect -t tcp -a 10.0.0.3 -s 4420 -n nqn.2014-08.com.example:nvme:nvm-subsystem-sn-d78432
对于 FC,其示例如下所示:
>sudonvme 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-connect 和 man nvme-connect-all。
      
        如果发生路径丢失,NVMe 子系统会尝试重新连接一段时间,该时间由 nvme connect 命令的 ctrl-loss-tmo 选项定义。在这段时间(默认值为 600s)过后,将去除该路径并通知块层(文件系统)的上层。默认情况下,随后会以只读模式挂载文件系统,这种行为通常不符合预期。因此,建议设置 ctrl-loss-tmo 选项,使 NVMe 子系统无限制地持续尝试重新连接。为此,请运行以下命令:
      
>sudonvme connect --ctrl-loss-tmo=-1
        要使 NVMe over Fabric 子系统在引导时可用,请在主机上创建一个 /etc/nvme/discovery.conf 文件,并在其中包含传递给 discover 命令的参数(请参见第 17.2.2 节 “发现 NVMe-oF 目标”)。例如,如果您按如下所示使用 discover 命令:
      
>sudonvme 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
然后启用 服务:
>sudosystemctl 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 安装该工具:
      
>sudozypper 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 创建新对象。
      
- 启动 - nvmetcli交互外壳:- >- sudo- nvmetcli
- 创建新端口: - (nvmetcli)>- cd ports- (nvmetcli)>- create 1- (nvmetcli)>- ls 1/o- 1 o- referrals o- subsystems
- 创建 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)>- lso- nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82 o- allowed_hosts o- namespaces
- 创建新的名称空间,并在其中设置 NVMe 设备: - (nvmetcli)>- cd namespaces- (nvmetcli)>- create 1- (nvmetcli)>- cd 1- (nvmetcli)>- set device path=/dev/nvme0n1Parameter path is now '/dev/nvme0n1'.
- 启用先前创建的名称空间: - (nvmetcli)>- cd ..- (nvmetcli)>- enableThe Namespace has been enabled.
- 显示创建的名称空间: - (nvmetcli)>- cd ..- (nvmetcli)>- lso- nqn.2014-08.org.nvmexpress:NVMf:uuid:c36f2c23-354d-416c-95de-f2b8ec353a82 o- allowed_hosts o- namespaces o- 1
- 允许所有主机使用该子系统。只有在安全环境中才可这样做。 - (nvmetcli)>- set attr allow_any_host=1Parameter 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
- 列出创建的所有对象: - (nvmetcli)>- cd /- (nvmetcli)>- lso- / 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
- 使目标可通过 TCP 使用。为 RDMA 使用 - trtype=rdma:- (nvmetcli)>- cd ports/1/- (nvmetcli)>- set addr adrfam=ipv4 trtype=tcp traddr=10.0.0.3 trsvcid=4420Parameter 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
- 将子系统链接到该端口: - (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 文件中保存目标配置:
>sudonvmetcli(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 光纤通道 SCSI 驱动程序,请在目标端和主机上为 lpfc 模块添加内核配置参数:
      
>sudoecho "options lpfc lpfc_enable_fc4_type=3" > /etc/modprobe.d/lpfc.conf
确保 Broadcom 适配器固件的版本至少为 11.4.204.33。此外,还要确保安装了最新版 nvme-cli、nvmetcli 和内核。
        要启用光纤通道端口作为 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-cli、QConvergeConsoleCLI 和内核。例如,您可以运行
# zypper lu && zypper pchk来检查更新和补丁。
有关安装的更多细节,请参考下列 Marvell 用户指南中的 FC-NVMe 部分:
17.5 通过 NVMe-oF over TCP 引导 #
根据《NVM Express® Boot Specification 1.0》(NVM Express® 引导规范 1.0) 的要求,SLES 支持通过 TCP 实现 NVMe-oF 引导。
可以对 UEFI 预引导环境进行配置,以尝试与远程存储服务器建立 NVMe-oF over TCP 连接,并使用这些连接进行引导。预引导环境会创建一个 ACPI 表(即 NVMe 引导固件表 [NBFT]),来存储用于引导的 NVMe-oF 的配置信息。操作系统会在稍后的引导阶段使用此表来设置网络和 NVMe-oF 连接,以访问根文件系统。
17.5.1 系统要求 #
要通过 NVMe-oF over TCP 引导系统,则必须满足以下要求:
- SLES15 SP7 或更高版本。 
- 支持 NVMe-oF over TCP 的 SAN 存储阵列 
- 配有支持通过 NVMe-oF over TCP 引导的 BIOS 的主机系统。请咨询硬件供应商了解是否支持此功能。目前只有 UEFI 平台支持通过 NVMe-oF over TCP 引导。 
17.5.2 安装 #
要通过 TCP 基于 NVMe-oF 安装 SLES,请执行以下步骤:
- 使用主机系统的 UEFI 设置菜单配置要在引导时建立的 NVMe-oF 连接。通常,您需要配置网络(本地 IP 地址、网关等)和 NVMe-oF 目标(远程 IP 地址、子系统 NQN 或发现 NQN)。请参见硬件文档获取配置说明。硬件供应商可能会提供集中和远程管理 BIOS 配置的方法。请与硬件供应商联系以获取更多信息。 
- 按部署指南中所述准备安装。 
- 使用任何支持的安装方法启动系统安装。您无需使用任何特定的引导参数在 NVMe-oF over TCP 上启用安装。 
- 如果 BIOS 配置正确,YaST 中的磁盘分区对话框将显示由 BIOS 中配置的子系统导出的 NVMe 名称空间。它们将显示为 NVMe 设备,其中字符串 - tcp表示设备通过 TCP 传输连接。在这些名称空间上安装操作系统(特别是 EFI 引导分区和根文件系统)。
- 完成安装。 
安装后,系统应该会自动通过 NVMe-oF over TCP 引导。如果系统没有引导,请检查 BIOS 设置中是否正确设置了引导优先级。
        用于引导的网络接口名为 nbft0、nbft1,依此类推。要获取有关 NVMe-oF 引导的信息,请运行以下命令:
      
#nvme nbft show
17.6 更多信息 #
      有关 nvme 命令各功能的更多细节,请参考 nvme nvme-help。
    
下面的链接提供了 NVMe 和 NVMe-oF 的基本介绍: