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 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 替换为底层传输媒体:loop
、rdma
、tcp
或 fc
。将 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 替换为底层传输媒体: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 必须唯一。
示例:
>
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-connect
和 man 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
然后启用
服务:>
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
创建新对象。
启动
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)>
ls
o- 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/nvme0n1
Parameter path is now '/dev/nvme0n1'.启用先前创建的名称空间:
(nvmetcli)>
cd ..
(nvmetcli)>
enable
The Namespace has been enabled.显示创建的名称空间:
(nvmetcli)>
cd ..
(nvmetcli)>
ls
o- 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=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
列出创建的所有对象:
(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使目标可通过 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
将子系统链接到该端口:
(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-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 的要求,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,请执行以下步骤:
使用主机系统的 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 的基本介绍: