4. FC与FC-NVMe协议接入
在Pure Storage FlashArray上,FC(Fibre Channel)与FC-NVMe是两种都跑在光纤通道物理链路上的块存储接入方式。它们共享同样的HBA、SFP光模块、交换机端口和Zone机制,但上层协议栈、寻址对象和队列模型完全不同。理解这些差异,是决定“现有FC环境要不要迁移到FC-NVMe”以及“如何在同一台阵列上并行提供两种服务”的前提。
一、协议栈与寻址对象的本质差异
传统FC承载的是SCSI命令集,即FCP(Fibre Channel Protocol)。主机侧由HBA驱动、SCSI中间层、多路径驱动(Windows MPIO、Linux dm-multipath)共同工作;阵列侧把卷(Volume)以LUN的形式映射给主机WWN,主机通过“Target WWPN + LUN ID”定位一个逻辑单元。寻址是“先找到目标端口,再在目标端口下找LUN号”。
FC-NVMe(NVMe over Fibre Channel)把NVMe命令直接封装进FC帧,不再经过SCSI翻译层。它取消了LUN概念,改为“子系统NQN + 命名空间ID(NSID)”。主机通过NVMe控制器(Controller)与阵列的NVMe子系统建立队列,每个I/O走独立的提交队列(SQ)与完成队列(CQ),支持多队列并行。寻址变成“先发现子系统NQN,再连接控制器,最后访问命名空间”。
这一差异带来的直接结果是:FC-NVMe的I/O路径更短、命令深度更大、延迟更低,尤其在随机小I/O和高并发场景下优势明显;而FC-SCSI的兼容性更广,几乎所有操作系统和虚拟化平台都能直接识别。
二、FlashArray上的端口配置与Zone划分
FlashArray的FC端口默认同时支持FC-SCSI和FC-NVMe两种协议,无需为NVMe单独购买端口。在阵列Web管理界面进入 Settings → Network → Fibre Channel,可以看到每个FC端口的WWPN、当前速率和协议状态。关键参数是端口的“NVMe”开关:开启后该端口即可响应NVMe发现请求;关闭则只处理FCP。生产环境中建议先确认主机HBA和交换机固件支持NVMe,再逐端口开启,避免影响已有FC-SCSI业务。
Zone划分方面,FC-NVMe沿用标准FC Zoning,但需要额外注意两点。第一,NVMe发现控制器(Discovery Controller)使用固定的NQN nqn.2014-08.org.nvmexpress.discovery,主机需要能访问到阵列的发现服务,因此Zone中必须包含阵列的NVMe发现端口。第二,NVMe子系统NQN通常与阵列的某个FC端口绑定,Zone成员应包含主机HBA WWPN和阵列目标WWPN,与FC-SCSI的Zone结构一致,但建议为NVMe单独建立Zone,便于故障隔离和权限控制。
一个典型的双控FlashArray FC-NVMe Zone配置示例如下(示例参数,实际以现场WWPN为准):
# 交换机Zone配置示例(Brocade风格)
zonecreate "ZONE_HOST01_NVME_CTRL0", "10:00:00:00:c9:2b:1a:01; 52:4a:93:7b:2c:00:11"
zonecreate "ZONE_HOST01_NVME_CTRL1", "10:00:00:00:c9:2b:1a:01; 52:4a:93:7b:2c:00:12"
cfgadd "CFG_PROD", "ZONE_HOST01_NVME_CTRL0"
cfgadd "CFG_PROD", "ZONE_HOST01_NVME_CTRL1"
cfgenable "CFG_PROD"
其中 10:00:00:00:c9:2b:1a:01 是主机HBA端口WWPN,52:4a:93:7b:2c:00:11 和 ...:00:12 分别是FlashArray控制器0和控制器1的FC端口WWPN。两个Zone分别对应两条独立路径,为多路径提供基础。
三、LUN映射与命名空间映射的差异
在FlashArray上,FC-SCSI的卷映射通过 Host 对象完成:把主机WWN加入Host,再把Volume连接到该Host,阵列自动分配LUN ID。主机侧看到的是 /dev/sdX 或Windows磁盘,多路径驱动根据LUN ID聚合路径。
FC-NVMe的映射逻辑不同。FlashArray把Volume作为NVMe命名空间暴露给主机,主机通过 nvme connect 命令连接子系统。映射时不再分配LUN ID,而是由阵列分配NSID。主机侧看到的是 /dev/nvmeXnY 设备。多路径由NVMe原生多路径(Linux内核5.0+)或厂商多路径驱动处理,路径聚合基于控制器ID而非LUN。
在FlashArray GUI中,NVMe映射的入口在 Storage → Volumes → Connect,选择Host时可以看到该Host是否已启用NVMe。如果Host对象中同时包含FC-SCSI和FC-NVMe的WWN/NQN,阵列会同时提供两种访问方式,但建议生产环境按业务类型分开Host,避免路径管理混乱。
四、Windows/Linux主机多路径接入与验证
Linux主机(以RHEL 8为例):首先确认内核支持NVMe over FC,加载模块 nvme-fc 和 nvme-fabrics。然后通过发现控制器获取子系统NQN:
# 发现NVMe子系统
nvme discover -t fc -a nn-0x524a937b2c0011:pn-0x524a937b2c0011
# 连接子系统(示例NQN)
nvme connect -t fc -a nn-0x524a937b2c0011:pn-0x524a937b2c0011 \
-w nqn.2010-06.com.purestorage:flasharray.abc123 \
-n nqn.2010-06.com.purestorage:flasharray.abc123
# 查看已连接控制器与命名空间
nvme list
nvme list-subsys
执行 nvme list 后应看到类似 /dev/nvme0n1 的设备,容量与FlashArray上Volume一致。多路径验证使用 nvme list-subsys,输出中应显示同一子系统的多个控制器路径,状态为 live。如果只有一条路径,检查Zone是否包含两个控制器端口,以及主机是否执行了两次 nvme connect(分别指向控制器0和控制器1)。
Windows主机:需要安装Pure Storage提供的NVMe over FC驱动或使用Windows Server 2019+原生NVMe-oF支持。在设备管理器中确认NVMe控制器出现,使用 Get-NvmeSubsystem 和 Get-NvmeController 查看子系统与控制器状态。多路径通过Windows MPIO的NVMe支持或Pure Storage多路径扩展实现,在MPIO管理器中应看到至少两条到同一命名空间的路径,状态为Active/Optimized。
五、验证与常见判断依据
无论FC-SCSI还是FC-NVMe,验证的核心都是“路径数量、路径状态、I/O是否可读写”。FC-SCSI侧用 multipath -ll 查看dm设备,正常应显示两条或以上路径,且 path_grouping_policy 为 multibus 或 failover。FC-NVMe侧用 nvme list-subsys 查看控制器状态,正常应显示多个 live 控制器。
一个实用的判断表如下:
| 检查项 | FC-SCSI 正常表现 | FC-NVMe 正常表现 |
|---|---|---|
| 设备节点 | /dev/sdX 或 /dev/mapper/mpathX | /dev/nvmeXnY |
| 路径查看命令 | multipath -ll | nvme list-subsys |
| 路径状态 | active ready running | live |
| 路径数量 | ≥2(双控双端口) | ≥2(双控制器) |
| 读写验证 | dd 或 fio 可正常读写 | dd 或 fio 可正常读写 |
nvme list 无输出,优先检查:1)交换机Zone是否包含发现控制器;2)主机是否加载 nvme-fc 模块;3)FlashArray端口NVMe开关是否开启;4)主机NQN是否已加入FlashArray的Host对象。最后需要强调,FC-NVMe并不是FC-SCSI的简单替代。在FlashArray上,两者可以共存于同一端口、同一交换机、同一主机。实际迁移时,建议先在一台测试主机上启用NVMe,验证多路径和性能,再逐步扩展到生产集群。对于已有大量FC-SCSI LUN映射的环境,不必一次性切换,可以按业务系统分批迁移,利用FlashArray的Host对象同时提供两种协议访问,降低迁移风险。