配置 Ubuntu 26.04 以使用 NVMe-oF 和 ONTAP 存储
Ubuntu 26.04 和非对称命名空间访问 (ANA) 支持 NVMe over Fabrics (NVMe-oF),包括 NVMe over Fibre Channel (NVMe/FC) 和其他传输。在 NVMe-oF 环境中,ANA 相当于 iSCSI 和 FC 环境中的 ALUA 多路径,并使用内核内 NVMe 多路径实现。
了解如何为 Ubuntu 26.04 配置 NVMe over Fabrics (NVMe-oF) 主机。有关更多支持和功能信息,请参阅 "Ubuntu ONTAP 支持和功能"。
搭载 Ubuntu 26.04 的 NVMe-oF 存在以下已知限制:
-
目前,Ubuntu 26.04 with ONTAP 不支持使用 NVMe-oF 协议的 SAN 启动。
有关支持的配置的更多详细信息,请参见"互操作性表工具"。
步骤 1:安装 Ubuntu 和 NVMe 软件并验证您的配置
要为 NVMe-oF 配置主机,您需要安装主机和 NVMe 软件包,启用多路径,并验证主机 NQN 配置。
-
在服务器上安装 Ubuntu 26.04。安装完成后,确认您正在运行指定的 Ubuntu 26.04 内核:
uname -rUbuntu 内核版本示例:
7.0.0-27-generic
-
安装
NVMe-CLI软件包:apt list | grep nvme下面的例子展示了 `nvme-cli`软件包版本:
nvme-cli/resolute,now 2.16-1 amd64
-
在 Ubuntu 26.04 主机上,检查
/etc/nvme/hostnqn处的 hostnqn 字符串:cat /etc/nvme/hostnqn下面的例子展示了 `hostnqn`价值:
nqn.2014-08.org.nvmexpress:uuid:4c4cxxxx-0050-xxxx-8035-c2cxxxxa5933
-
在 ONTAP 系统上,验证
hostnqn字符串是否与/etc/nvme/hostnqn中的hostnqn字符串在 ONTAP 存储系统上对应的子系统一致:vserver nvme subsystem host show -vserver vs_106_fc_nvme显示示例
Vserver Subsystem Host NQN ----------- --------------- ---------------------------------------------------------- vs_106_fc_nvme ub_106 nqn.2014-08.org.nvmexpress:uuid:4c4cxxxx-0050-xxxx-8035-c2c04f4a5933
如果 `hostnqn`字符串不匹配,请使用 `vserver modify`命令在相应的 ONTAP 存储系统子系统上更新 `hostnqn`字符串,使其与主机上 `/etc/nvme/hostnqn`中的 `hostnqn`字符串一致。
步骤 2:配置 NVMe/FC 和 NVMe/TCP
为 Broadcom/Emulex 或 Marvell/Qlogic 适配器配置 NVMe/FC,或使用手动发现和连接操作配置 NVMe/TCP。
为Broadcom/Emulex适配器配置NVMe/FC。
-
确认您使用的是受支持的适配器型号:
-
显示模型名称:
cat /sys/class/scsi_host/host*/modelname您应看到以下输出:
LPe36002-M64 LPe36002-M64
-
显示模型描述:
cat /sys/class/scsi_host/host*/modeldesc您应该看到类似以下示例的输出:
Emulex LPe36002-M64 2-Port 64Gb Fibre Channel Adapter Emulex LPe36002-M64 2-Port 64Gb Fibre Channel Adapter
-
-
验证您使用的是推荐的 Broadcom
lpfc固件和收件箱驱动程序:-
显示固件版本:
cat /sys/class/scsi_host/host*/fwrev该命令返回固件版本:
14.4.393.25, sli-4:6:d 14.4.393.25, sli-4:6:d
-
显示收件箱驱动程序版本:
cat /sys/module/lpfc/version以下示例显示了驱动程序版本:
0:14.4.0.13
+ 有关支持的适配器驱动程序和固件版本的最新列表,请参见"互操作性表工具"。
-
-
请验证
lpfc_enable_fc4_type设置为3:cat /sys/module/lpfc/parameters/lpfc_enable_fc4_type -
验证是否可以查看启动程序端口:
cat /sys/class/fc_host/host*/<port_name>您应该看到类似如下的输出:
0x100000109bf0447b 0x100000109bf0447c
-
验证启动程序端口是否联机:
cat /sys/class/fc_host/host*/port_state您应看到以下输出:
Online Online
-
验证NVMe/FC启动程序端口是否已启用且目标端口是否可见:
cat /sys/class/scsi_host/host*/nvme_info显示示例输出
NVME Initiator Enabled XRI Dist lpfc0 Total 6144 IO 5894 ELS 250 NVME LPORT lpfc0 WWPN x100000109bf0447b WWNN x200000109bf0447b DID x022600 ONLINE NVME RPORT WWPN x200fd039eaa8138b WWNN x200ad039eaa8138b DID x021006 TARGET DISCSRVC ONLINE NVME Statistics LS: Xmt 0000000187 Cmpl 0000000187 Abort 00000000 LS XMIT: Err 00000000 CMPL: xb 00000000 Err 00000000 Total FCP Cmpl 0000000014096514 Issue 000000001407fcd6 OutIO fffffffffffe97c2 abort 00000048 noxri 00000000 nondlp 0000001c qdepth 00000000 wqerr 00000000 err 00000000 FCP CMPL: xb 00000048 Err 00000077 NVME Initiator Enabled XRI Dist lpfc1 Total 6144 IO 5894 ELS 250 NVME LPORT lpfc1 WWPN x100000109bf0447c WWNN x200000109bf0447c DID x022300 ONLINE NVME RPORT WWPN x2010d039eaa8138b WWNN x200ad039eaa8138b DID x021106 TARGET DISCSRVC ONLINE NVME Statistics LS: Xmt 0000000187 Cmpl 0000000187 Abort 00000000 LS XMIT: Err 00000000 CMPL: xb 00000000 Err 00000000 Total FCP Cmpl 00000000140970ed Issue 00000000140813da OutIO fffffffffffea2ed abort 00000047 noxri 00000000 nondlp 0000002b qdepth 00000000 wqerr 00000000 err 00000000 FCP CMPL: xb 00000047 Err 00000075
为Marvell/QLogic适配器配置NVMe/FC。
-
验证您使用的适配器驱动程序和固件版本是否受支持:
cat /sys/class/fc_host/host*/symbolic_name以下示例显示了驱动程序和固件版本:
QLE2872 FW: v9.15.17 DVR: v10.02.09.100-k QLE2872 FW: v9.15.17 DVR: v10.02.09.100-k
-
请验证
ql2xnvmeenable已设置。这样、Marvell适配器便可用作NVMe/FC启动程序:cat /sys/module/qla2xxx/parameters/ql2xnvmeenable预期输出为1。
NVMe/TCP 不支持自动连接操作。相反,您可以通过手动执行 NVMe/TCP `connect`或 `connect-all`操作来发现 NVMe/TCP 子系统和命名空间。
-
检查发起方端口是否能够通过受支持的 NVMe/TCP LIF 获取发现日志页数据:
nvme discover -t tcp -w <host-traddr> -a <traddr>显示示例
# nvme discover -t tcp -w 192.168.167.150 -a 192.168.167.155 Discovery Log Number of Records 8, Generation counter 10 =====Discovery Log Entry 0====== trtype: tcp adrfam: ipv4 subtype: current discovery subsystem treq: not specified portid: 4 trsvcid: 8009 subnqn: nqn.1992-08.com.netapp:sn.9b7d42b764ff11efb8fed039eabac370:discovery traddr: 192.168.167.156 eflags: explicit discovery connections, duplicate discovery information sectype: none =====Discovery Log Entry 1====== trtype: tcp adrfam: ipv4 subtype: current discovery subsystem treq: not specified portid: 2 trsvcid: 8009 subnqn: nqn.1992-08.com.netapp:sn.9b7d42b764ff11efb8fed039eabac370:discovery traddr: 192.168.166.156 eflags: explicit discovery connections, duplicate discovery information sectype: none =====Discovery Log Entry 2====== trtype: tcp adrfam: ipv4 subtype: current discovery subsystem treq: not specified portid: 3 trsvcid: 8009 subnqn: nqn.1992-08.com.netapp:sn.9b7d42b764ff11efb8fed039eabac370:discovery traddr: 192.168.167.155 eflags: explicit discovery connections, duplicate discovery information sectype: none =====Discovery Log Entry 3====== trtype: tcp adrfam: ipv4 subtype: current discovery subsystem treq: not specified portid: 1 trsvcid: 8009 subnqn: nqn.1992-08.com.netapp:sn.9b7d42b764ff11efb8fed039eabac370:discovery traddr: 192.168.166.155 eflags: explicit discovery connections, duplicate discovery information sectype: none =====Discovery Log Entry 4====== trtype: tcp adrfam: ipv4 subtype: nvme subsystem treq: not specified portid: 4 trsvcid: 4420 subnqn: nqn.1992-08.com.netapp:sn.9b7d42b764ff11efb8fed039eabac370:subsystem.ubuntu_26.04_tcp_211 traddr: 192.168.167.156 eflags: none sectype: none =====Discovery Log Entry 5====== trtype: tcp adrfam: ipv4 subtype: nvme subsystem treq: not specified portid: 2 trsvcid: 4420 subnqn: nqn.1992-08.com.netapp:sn.9b7d42b764ff11efb8fed039eabac370:subsystem.ubuntu_26.04_tcp_211 traddr: 192.168.166.156 eflags: none sectype: none =====Discovery Log Entry 6====== trtype: tcp adrfam: ipv4 subtype: nvme subsystem treq: not specified portid: 3 trsvcid: 4420 subnqn: nqn.1992-08.com.netapp:sn.9b7d42b764ff11efb8fed039eabac370:subsystem.ubuntu_26.04_tcp_211 traddr: 192.168.167.155 eflags: none sectype: none =====Discovery Log Entry 7====== trtype: tcp adrfam: ipv4 subtype: nvme subsystem treq: not specified portid: 1 trsvcid: 4420 subnqn: nqn.1992-08.com.netapp:sn.9b7d42b764ff11efb8fed039eabac370:subsystem.ubuntu_26.04_tcp_211 traddr: 192.168.166.155 eflags: none sectype: none
-
验证其他 NVMe/TCP 启动器-目标 LIF 组合是否可以成功检索发现日志页面数据:
nvme discover -t tcp -w <host-traddr> -a <traddr>显示示例输出
#nvme discover -t tcp -w 192.168.167.150 -a 192.168.167.155 #nvme discover -t tcp -w 192.168.167.150 -a 192.168.167.156 #nvme discover -t tcp -w 192.168.166.150 -a 192.168.166.155 #nvme discover -t tcp -w 192.168.166.150 -a 192.168.166.156
-
运行
nvme connect-all在节点中所有受支持的NVMe/TCP启动程序-目标SIP上运行命令:nvme connect-all -t tcp -w <host-traddr> -a <traddr>显示示例
#nvme connect-all -t tcp -w 192.168.167.150 -a 192.168.167.155 #nvme connect-all -t tcp -w 192.168.167.150 -a 192.168.167.156 #nvme connect-all -t tcp -w 192.168.166.150 -a 192.168.166.155 #nvme connect-all -t tcp -w 192.168.166.150 -a 192.168.166.156
NVMe/TCP 的 ctrl_loss_tmo 超时默认设置已关闭。这意味着重试次数没有限制(无限期重试),在使用 `nvme connect`或 `nvme connect-all`命令时无需手动配置特定的 ctrl_loss_tmo 超时持续时间(选项 -l)。采用此默认行为,NVMe/TCP 控制器在发生路径故障时不会遇到超时,并保持无限期连接。
步骤 3:(可选)修改 udev 规则中的 iopolicy
从 Ubuntu 26.04 开始,NVMe-oF 的默认 iopolicy 设置为 queue-depth。您可以通过修改 udev 规则将 iopolicy 更改为 round-robin。
-
使用 root 权限在文本编辑器中打开 udev 规则文件:
/usr/lib/udev/rules.d/71-nvmf-netapp.rules您应看到以下输出:
vi /usr/lib/udev/rules.d/71-nvmf-netapp.rules
-
找到为NetApp ONTAP控制器设置 iopolicy 的行,如下例所示:
ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="queue-depth" -
修改规则,使队列深度变为循环:
ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="round-robin" -
重新加载udev规则并应用更改:
udevadm control --reloadudevadm trigger --subsystem-match=nvme-subsystem -
验证子系统的当前 iopolicy:
cat /sys/class/nvme-subsystem/<subsystem>/iopolicy您应看到以下输出:
round-robin
|
|
新的 iopolicy 会自动应用于匹配的NetApp ONTAP控制器设备。您无需重启。 |
步骤 4:(可选)为 NVMe/FC 启用 1MB I/O
ONTAP在识别控制器数据中报告最大数据传输大小 (MDTS) 为 8。这意味着最大 I/O 请求大小可达 1MB。要向 Broadcom NVMe/FC 主机发出 1MB 大小的 I/O 请求,您应该增加 `lpfc`的价值 `lpfc_sg_seg_cnt`参数从默认值 64 更改为 256。
|
|
这些步骤不适用于逻辑NVMe/FC主机。 |
-
将 `lpfc_sg_seg_cnt`参数设置为256:
cat /etc/modprobe.d/lpfc.conf您应该会看到类似于以下示例的输出:
options lpfc lpfc_sg_seg_cnt=256
-
运行 `dracut -f`命令并重新启动主机。
-
验证的值是否 `lpfc_sg_seg_cnt`为256:
cat /sys/module/lpfc/parameters/lpfc_sg_seg_cnt
步骤 5:验证 NVMe 启动服务
这 `nvmefc-boot-connections.service`和 `nvmf-autoconnect.service`NVMe/FC 中包含的启动服务 `nvme-cli`系统启动时,软件包会自动启用。
启动完成后,验证 `nvmefc-boot-connections.service`和 `nvmf-autoconnect.service`启动服务已启用。
-
验证是否 `nvmf-autoconnect.service`已启用:
systemctl status nvmf-autoconnect.service显示示例输出
nvmf-autoconnect.service - Connect NVMe-oF subsystems automatically during boot Loaded: loaded (/usr/lib/systemd/system/nvmf-autoconnect.service; enabled; preset: enabled) Active: inactive (dead) since Tue 2026-07-07 08:20:42 UTC; 1 week 6 days ago Invocation: fdc6a9313f584a27af26dc76f3e467c8 Main PID: 15938 (code=exited, status=0/SUCCESS) Mem peak: 2M CPU: 24ms Jul 07 08:20:42 SR630-13-203 systemd[1]: Starting nvmf-autoconnect.service - Connect NVMe-oF subsystems automatically during boot... Jul 07 08:20:42 SR630-13-203 systemd[1]: nvmf-autoconnect.service: Deactivated successfully. Jul 07 08:20:42 SR630-13-203 systemd[1]: Finished nvmf-autoconnect.service - Connect NVMe-oF subsystems automatically during boot. -
验证是否 `nvmefc-boot-connections.service`已启用:
systemctl status nvmefc-boot-connections.service显示示例输出
nvmefc-boot-connections.service - Auto-connect to subsystems on FC-NVME devices found during boot Loaded: loaded (/usr/lib/systemd/system/nvmefc-boot-connections.service; enabled; preset: enabled) Active: inactive (dead) since Tue 2026-07-07 08:18:38 UTC; 1 week 6 days ago Invocation: 6f0a5c2d278b461bae223d4450ec6c51 Main PID: 5137 (code=exited, status=0/SUCCESS) Mem peak: 2M CPU: 19ms Jul 07 08:18:38 SR630-13-203 systemd[1]: Starting nvmefc-boot-connections.service - Auto-connect to subsystems on FC-NVME devices found du> Jul 07 08:18:38 SR630-13-203 systemd[1]: nvmefc-boot-connections.service: Deactivated successfully. Jul 07 08:18:38 SR630-13-203 systemd[1]: Finished nvmefc-boot-connections.service - Auto-connect to subsystems on FC-NVME devices found du>
步骤 6:验证多路径配置
验证内核NVMe多路径状态、ANA状态和ONTAP命名空间是否适用于NVMe-oF配置。
-
验证是否已启用内核NVMe多路径:
cat /sys/module/nvme_core/parameters/multipath预期输出为"Y"。
-
验证相应的ONTAP命名空间的 NVMe-oF 设置(例如,将型号设置为NetApp ONTAP Controller,并将负载均衡 iopolicy 设置为 queue-depth)是否正确反映在主机上:
-
显示子系统:
cat /sys/class/nvme-subsystem/nvme-subsys*/model您应看到以下输出:
NetApp ONTAP Controller NetApp ONTAP Controller
-
显示策略:
cat /sys/class/nvme-subsystem/nvme-subsys*/iopolicy您应看到以下输出:
queue-depth queue-depth
-
-
验证是否已在主机上创建并正确发现命名空间:
nvme list显示示例输出
Node SN Model --------------------------------------------------------- /dev/nvme0n1 81CZ5BQuUNfGAAAAAAAB NetApp ONTAP Controller Namespace Usage Format FW Rev ----------------------------------------------------------- 1 21.47 GB / 21.47 GB 4 KiB + 0 B FFFFFFFF
-
验证每个路径的控制器状态是否为活动状态且是否具有正确的ANA状态:
NVMe/FCnvme list-subsys /dev/nvme0n1以下示例输出显示了使用 NVMe/FC 的 AFF、FAS、ASA 或 ASA r2 系统在双节点 ONTAP 控制器上托管的命名空间。
显示 AFF、FAS 和 ASA 示例输出
nvme-subsys5 - NQN=nqn.1992-08.com.netapp:sn.f7565b15a66911ef9668d039ea951c46:subsystem.nvme1 hostnqn=nqn.2014-08.org.nvmexpress:uuid:4c4c4544-0056-5410-8048-c7c04f425633 \ +- nvme126 fc traddr=nn-0x2036d039ea951c45:pn-0x2038d039ea951c45,host_traddr=nn-0x2000f4c7aa0cd7c3:pn-0x2100f4c7aa0cd7c3 live optimized +- nvme176 fc traddr=nn-0x2036d039ea951c45:pn-0x2037d039ea951c45,host_traddr=nn-0x2000f4c7aa0cd7c2:pn-0x2100f4c7aa0cd7c2 live optimized +- nvme5 fc traddr=nn-0x2036d039ea951c45:pn-0x2039d039ea951c45,host_traddr=nn-0x2000f4c7aa0cd7c2:pn-0x2100f4c7aa0cd7c2 live non-optimized +- nvme71 fc traddr=nn-0x2036d039ea951c45:pn-0x203ad039ea951c45,host_traddr=nn-0x2000f4c7aa0cd7c3:pn-0x2100f4c7aa0cd7c3 live non-optimized显示 ASA r2 示例输出
nvme-subsys96 - NQN=nqn.1992-08.om.netapp:sn.b351b2b6777b11f0b3c2d039ea5cfc91:subsystem.nvme24 hostnqn=nqn.2014-08.org.nvmexpress:uuid:d3b581b4-c975-11e6-8425-0894ef31a074 \ +- nvme203 fc traddr=nn-0x2011d039ea5cfc90:pn-0x2015d039ea5cfc90,host_traddr=nn-0x200000109bdacc76:pn-0x100000109bdacc76 live optimized +- nvme25 fc traddr=nn-0x2011d039ea5cfc90:pn-0x2014d039ea5cfc90,host_traddr=nn-0x200000109bdacc75:pn-0x100000109bdacc75 live optimized +- nvme30 fc traddr=nn-0x2011d039ea5cfc90:pn-0x2012d039ea5cfc90,host_traddr=nn-0x200000109bdacc75:pn-0x100000109bdacc75 live optimized +- nvme32 fc traddr=nn-0x2011d039ea5cfc90:pn-0x2013d039ea5cfc90,host_traddr=nn-0x200000109bdacc76:pn-0x100000109bdacc76 live optimizedNVMe/TCPnvme list-subsys /dev/nvme1n1以下示例输出显示了使用 NVMe/TCP 的 AFF、FAS、ASA 或 ASA r2 系统在双节点 ONTAP 控制器上托管的命名空间。
显示 AFF、FAS 和 ASA 示例输出
nvme-subsys4 - NQN=nqn.1992-08.com.netapp:sn.64e65e6caae711ef9668d039ea951c46:subsystem.nvme4 hostnqn=nqn.2014-08.org.nvmexpress:uuid:4c4c4544-0035-5910-804b-c2c04f444d33 \ +- nvme102 tcp traddr=192.168.21.20,trsvcid=4420,host_traddr=192.168.21.1,src_addr=192.168.21.1 live non-optimized +- nvme151 tcp traddr=192.168.21.21,trsvcid=4420,host_traddr=192.168.21.1,src_addr=192.168.21.1 live optimized +- nvme4 tcp traddr=192.168.20.20,trsvcid=4420,host_traddr=192.168.20.1,src_addr=192.168.20.1 live non-optimized +- nvme53 tcp traddr=192.168.20.21,trsvcid=4420,host_traddr=192.168.20.1,src_addr=192.168.20.1 live optimized显示 ASA r2 示例输出
nvme-subsys9 - NQN=nqn.1992-08.com.netapp:sn.9927e165694211f0b4f4d039eab31e9d:subsystem.nvme10 hostnqn=nqn.2014-08.org.nvmexpress:uuid:4c4cxxxx-0035-xxxx-804b-b7cxxxx44d33 \ +- nvme105 tcp traddr=192.168.39.10,trsvcid=4420,host_traddr=192.168.39.20,src_addr=192.168.39.20 live optimized +- nvme153 tcp traddr=192.168.39.11,trsvcid=4420,host_traddr=192.168.39.20,src_addr=192.168.39.20 live optimized +- nvme57 tcp traddr=192.168.38.11,trsvcid=4420,host_traddr=192.168.38.20,src_addr=192.168.38.20 live optimized +- nvme9 tcp traddr=192.168.38.10,trsvcid=4420,host_traddr=192.168.38.20,src_addr=192.168.38.20 live optimized -
验证NetApp插件是否为每个ONTAP 命名空间设备显示正确的值:
列nvme netapp ontapdevices -o column显示示例输出
Device Vserver Namespace Path NSID UUID Size ------------- ------------- ----------------------- ---- -------------------------------------- --------- /dev/nvme0n1 vs_211_tcp /vol/tcpvol1/ns1 1 1cc7bc78-8d7b-4d8e-a3c4-750f9461a6e9 21.47GB
JSONnvme netapp ontapdevices -o json显示示例输出
{ "ONTAPdevices" : [ { "Device":"/dev/nvme0n9", "Vserver":"vs_211_tcp", "Namespace_Path":"/vol/tcpvol9/ns9", "NSID":9, "UUID":"99640dd9-8463-4c12-8282-b525b39fc10b", "Size":"21.47GB", "LBA_Data_Size":4096, "Namespace_Size":5242880 } ] }
第 7 步:查看已知问题
对于带有 ONTAP 版本的 Ubuntu 26.04 的 NVMe-oF 主机配置,没有已知问题。