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的兼容性更广,几乎所有操作系统和虚拟化平台都能直接识别。

FC-SCSI 与 FC-NVMe 协议栈与寻址对比 FC-SCSI(FCP) 应用 / 文件系统 SCSI 中间层 + 多路径(MPIO / dm-multipath) FCP 封装(SCSI CDB → FC 帧) FC-2 / FC-1 / FC-0(HBA、SFP、链路) 寻址:Target WWPN + LUN ID 队列模型:单队列为主,命令深度受限于 SCSI 队列深度与 HBA 能力 FC-NVMe 应用 / 文件系统 NVMe 驱动 + 原生多路径(NVMe multipath) NVMe 命令直接封装进 FC 帧 FC-2 / FC-1 / FC-0(同一物理链路) 寻址:子系统 NQN + 命名空间 ID(NSID) 队列模型:多提交/完成队列并行, 命令深度大,延迟更低 对比

二、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 可正常读写
如果FC-NVMe连接后 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对象同时提供两种协议访问,降低迁移风险。