17.1 概览 #
NVM Express (NVMe) 是有关访问非易失性存储(通常是 SSD 磁盘)的接口标准。与 SATA 相比,NVMe 支持的速度要高得多,并且延迟更低。
NVMe over Fabric 是用于通过不同网络结构访问 NVMe 存储的体系结构。这些网络结构有 RDMA、TCP 或基于光纤通道的 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 替换为底层传输媒体: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 over Fabric 目标 #
识别 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 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
然后启用
服务:>
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
创建新对象。
启动
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
命令各功能的更多细节,请参考 nvme nvme-help
。
以下链接提供了 NVMe 和 NVMe over Fabric 的简介: