
做存储和服务器这块的同行应该都听过HBA卡但很多人第一次接触时容易把它和网卡、RAID卡搞混。我最早在机房里看见一块插着两根光纤线的PCIe板卡时也以为它就是一块普通网卡后来才发现这玩意儿在SAN存储环境里是个绕不开的角色。今天这篇就把HBA卡掰开揉碎讲清楚包括它是什么、和网卡有什么区别、怎么选、怎么装、出问题怎么查适合刚入行做服务器运维、存储交付的工程师也适合那些被厂商报价单里“HBA卡选配”整得一头雾水的朋友。1. HBA卡是个什么角色为什么存储场景离不开它1.1 HBA卡拆开看名字、接口、芯片HBA全称是Host Bus Adapter主机总线适配器。说人话就是服务器和外部存储设备之间的“翻译官搬运工”。服务器内部数据走PCIe总线存储设备那边走的是光纤通道FC或者SAS协议两边语言不通HBA卡就负责把PCIe总线一侧的数据转换成存储网络一侧的协议帧再送出去。从硬件上看一张典型的FC HBA卡主要由这几部分组成PCIe金手指接口、一颗协议处理芯片、一个或两个光口SFP笼子有的卡上还有散热片高档一点的带独立显存式的小缓存不过HBA卡缓存通常很小它不像RAID卡那样做数据缓存。SAS HBA卡则长得更像一张大号的SATA扩展卡接口通常是内部mini-SAS HD口用SAS线连到硬盘背板或磁盘柜。很多朋友问HBA卡和普通网卡到底哪儿不一样核心差别在处理协议上。普通网卡处理的是以太网帧走的是TCP/IP那套东西最常用的场景是服务器之间的网络互通而FC HBA卡处理的是光纤通道协议走的是SAN存储网络主要解决的是服务器和磁盘阵列之间高带宽、低延迟、高可靠的数据传输。拿日常生活打比方网卡是城市道路所有车都能上但路况复杂FC SAN更像一条专用的高速公路不跟外界车流混在一起虽然建设成本高但跑起来又快又稳。1.2 HBA卡和网卡、RAID卡到底差在哪存储场景里最容易混淆的就是HBA卡、RAID卡和网卡这三类卡。RAID卡全称是Redundant Array of Independent Disks控制器卡它的核心职责是把多块物理硬盘组合成阵列可以做RAID 0/1/5/6/10等还能提供写缓存和掉电保护。HBA卡不做这些运算它更“傻”只是把主机的IO请求原封不动地送到底层磁盘或者把磁盘返回的数据送回主机不参与数据冗余计算。网卡NIC前面说了走的是以太网。不过随着技术演进现在也有iSCSI HBA卡、融合网卡这类跨界产品它们能在以太网上跑存储协议。比如iSCSI HBA卡自带TCP Offload EngineTOE芯片可以把iSCSI协议处理从CPU里解放出来。还有现在热门的NVMe over Fabric本质上也是让存储协议跑在各种高速网络上。三种卡放在一起对比用途就非常清楚类型主要协议典型接口核心职责常见应用场景网卡 NICEthernetRJ45 / SFP / QSFP网络通信业务网络、管理网络HBA卡FC / SAS / iSCSI光口 / mini-SAS主机与存储设备数据传输SAN存储、直连磁盘柜RAID卡SATA / SASmini-SAS HD磁盘阵列组建、数据冗余服务器内置硬盘组阵列所以选型前第一件事先明确你买这张卡回去是干嘛的。如果是接SAN存储阵列FC HBA卡没跑如果是接着外部JBOD磁盘柜做直通模式SAS HBA卡更合适如果只是想扩展几块内置硬盘那大概率RAID卡或者板载SATA控制器就够了别花冤枉钱。2. 决定HBA卡性能与兼容性的核心细节2.1 端口速率、通道数和单双端口怎么选HBA卡最关键的两个参数端口速率和端口数量。FC HBA卡目前主流速率有8Gbps、16Gbps、32Gbps向下兼容。注意这里的Gbps是速率单位不是实际吞吐FC是8b/10b编码32G FC用的是64b/66b所以8G FC实际有效带宽大约在800MB/s上下16G大约在1600MB/s上下。选型的时候不要被“8G”这数字迷惑以为能跑满8GB/s那是两个单位。端口数量常见有单端口和双端口双端口卡可以在同一个服务器上接两条光纤到两台存储控制器配合多路径软件实现冗余和负载均衡。SAS HBA卡主要看通道数量常见的有8口和16口指的是内部SAS通道数速率一般是12Gbps。通道数决定了能直连多少块盘比如一张8口的SAS HBA卡配上expander背板后可以带更多盘但直连模式下通常就是8块。单端口和双端口怎么选我的经验是只要预算允许尽量上双端口。原因不是一个端口坏了有备胎这么简单双端口配合多路径软件比如Linux下的device-mapper-multipath、EMC PowerPath能让存储链路切换时间从分钟级降到秒级甚至毫秒级。第一次给客户做存储接入时图便宜选了单端口卡后来存储控制器重启业务直接断了好几分钟运维电话被打爆。从那以后我所有生产项目都坚持双端口这个钱不能省。2.2 SFP光模块、线缆和WWN那些事FC HBA的口是SFP笼子需要插入光模块也叫SFP收发器再通过光纤跳线连到存储交换机或存储阵列。光模块这块坑非常多首先是兼容性问题。有些不那么知名的光模块插到HBA卡上虽然灯亮着但链路速率可能协商不对或者运行时crc error疯涨。正规做法是用HBA卡厂商认证过的光模块比如Broadcom原Avago/LSI和Marvell原QLogic都有兼容列表。价格确实贵一些但生产环境求稳别为了省百八十块给自己埋雷。WWNWorld Wide Name是HBA卡在FC网络里独一无二的身份标识类似网卡的MAC地址。每个FC HBA卡出厂时固件里就烧录了WWN而且分WWN和WWPNWWN标识整个卡或节点WWPN标识具体的物理端口。配置存储阵列LUN映射时用的就是WWPN——你把哪张卡的哪个口映射给某台服务器存储就看WWPN。所以排查“为什么主机认不到盘”时第一件事就是去HBA卡驱动里确认WWPN有没有被存储端正确配置。2.3 驱动和固件稳定性的隐藏大头HBA卡硬件本身通常很耐用真正影响稳定性的往往是驱动和固件。Linux环境里FC HBA卡驱动常见的有两个QLogic卡的qla2xxx、Emulex卡的lpfc。这两个驱动都进到了内核主线多数情况下加载后就能识别设备。但不同内核版本对固件接口的适配程度不一样遇到莫名其妙的问题第一反应应该是到厂商官网查驱动版本和内核版本支持矩阵。曾经遇到一台服务器升级内核后FC链路反复断连最后发现是新内核和旧固件配合有bug升级了HBA卡固件才消停。固件升级这事要谨慎。HBA卡固件升级一般需要重启生效而且过程中绝对不能断电。我自己的习惯是新卡到货后先检查当前固件版本对照厂商release notes如果有明确修复了已知问题的版本才考虑升级如果设备跑得好好的不去追新。生产环境稳定压倒一切没必要为了“固件最新版”三个字去冒风险。3. 从安装到上场HBA卡部署全流程3.1 物理安装与上电前检查HBA卡物理安装跟装其他PCIe卡没什么大差别但有几个细节值得注意。第一PCIe插槽带宽。FC HBA卡通常是PCIe 3.0 x8或PCIe 4.0 x8接口插到物理x16槽里没问题但如果你插到x1或x4的槽里速率会大打折扣甚至亮卡但流量一大就出问题。最好查一下服务器用户手册确认这个槽位分到的通道数够用。第二散热风道。HBA卡工作时发热量不算小尤其是满速率跑的时候。有些服务器机箱里PCIe槽位附近风道不好卡会过热导致链路不稳定。装的时候尽量避开被其他大板卡完全挡住风道的位置。第三光口防尘塞。不插光模块的时候SFP笼子和光模块上的防尘塞一定要盖好。Fiber口进灰是光信号衰减的常见原因这个后面排查部分会再提。3.2 操作系统识别与驱动加载装好卡、插上光纤后上电进入系统先看系统能不能识别到PCIe设备。Linux下最直接的办法lspci | grep -i fibre能看到类似“Fibre Channel: QLogic Corp. ISP2722-based 16G Fibre Channel to PCIe”这样的输出说明内核已经在PCIe层面识别到卡了。接下来确认驱动是否加载lsmod | grep -E qla2xxx|lpfc驱动加载成功后在/sys/class/fc_host/目录下会看到host0、host1之类的目录。每个目录代表一个FC端口。可以用下面这些命令快速查看端口状态cat /sys/class/fc_host/host0/port_name cat /sys/class/fc_host/host0/port_state cat /sys/class/fc_host/host0/speed cat /sys/class/fc_host/host0/fabric_nameport_state为Online说明链路已协商成功speed会显示实际协商速率比如8 Gbit或16 Gbit。如果port_state是Offline或Linkdown说明光路或者对端有问题下面排查部分会说。Windows下查这个更简单打开设备管理器找到“光纤通道适配器”或“Storage adapters”下面的设备看属性里有没有显示当前速率和WWN信息。不过Windows下很多FC HBA卡需要装厂商提供的管理工具比如QLogic的QConvergeConsoleEmulex的OneCommand Manager这些工具能看到更详细的信息包括光模块的收发光功率。3.3 连接存储阵列并验证链路HBA卡链路Up了并不等于存储数据通路就通还差最后一步——存储端LUN映射。这一步我见过太多人卡壳。流程是这样的先在存储管理界面创建好LUN或者卷然后把LUN映射给对应HBA卡的WWPN。注意这里必须确认WWPN没有写错。我踩过一次两台服务器用的同型号HBA卡厂商给的装箱单上WWN抄反了结果A服务器的盘映到了B服务器上业务起来之后数据直接乱套还好是测试环境。LUN映射完成后主机侧还需要做一次总线扫描。Linux下可以这样echo - - - /sys/class/scsi_host/host0/scan或者用rescan-scsi-bus.sh脚本。扫描完成后用fdisk -l、lsscsi或multipath -ll可以看到新出现的磁盘设备。如果用了多路径软件一定要在扫描前确认multipath配置里已经把该设备的wwid加进去了否则会出现双盘、盘符漂移这些乱象。3.4 批量运维检查的常用思路生产项目里往往不是一两台服务器几十台机器配上HBA卡后逐个上去查会累瘫。我的习惯是写一个简单的巡检脚本用SSH批量抓取关键信息。脚本思路很简单通过ssh执行远程命令抓取HBA卡的port_state、speed、光模块收发光功率、以及驱动的报错计数。FC HBA卡驱动在/sys/class/fc_host/hostX/下有很多状态文件有些厂商驱动还会在/sys/class/scsi_host/目录下暴露统计信息比如link down count、CRC error count。这些数值平时都是0或很低一旦出现持续增长基本就是光路质量问题的前兆。当然批量巡检的关键是事先统一好命令输出格式否则几十台机器的结果五花八门比不查还累。我一般让每台机器输出固定的格式比如主机名、端口WWN、状态、速率、错误计数然后用一条命令汇总成表格。这个习惯帮我提前发现过好几次隐患比如某台机器的链路速率从16G掉到了8G重启端口或光模块后恢复如果不巡检根本发现不了。4. 实战中高频踩坑HBA卡常见问题与排查实录4.1 链路Up了但速度不对现象服务器和存储都显示链路正常但吞吐就是上不去用iometer或dd测试发现速度只有预期的一半甚至四分之一。排查思路先看协商速率。用前面提到的命令检查speed文件——是16 Gbit还是8 Gbit或者更低。如果协商速率降了八成是光模块或光纤的问题。换一根光纤跳线、重新插拔光模块很多时候就能恢复。另一个容易忽略的点是光模块本身的规格。现在很多存储环境用的是10G以太网光模块外观和8G/16G FC光模块一模一样插口都是SFP。但FC设备对光模块的兼容性要求很高以太网光模块插到FC HBA上有些根本不会亮有些会以较低速率协商成功。比如16G FC卡插了个10G以太网模块可能协商成8G。所以备件库里一定要分清FC光模块和以太网光模块最好用标签区分别混着用。4.2 驱动加载后系统启动变慢现象服务器开机后卡在某个地方很久进入系统后dmesg里一堆关于qla2xxx或lpfc的超时日志但最终系统又能正常起来。有时候链路状态一会儿Online一会儿Offline。这个问题我在几个批次的主板上都遇到过根本原因多数不是HBA卡本身坏了而是BIOS/UEFI和驱动在初始化阶段配合不好。常见解决办法一是升级服务器BIOS到厂商建议的版本二是检查HBA卡Option ROM设置如果不需要从SAN启动可以禁用HBA卡的Option ROM减少开机扫描时间三是升级HBA卡固件老固件在某个内核版本上握手逻辑有bug很常见。如果服务器上同时插着多张HBA卡还有一个坑是PCIe资源分配不足导致后面的卡初始化失败。这时候需要到BIOS里手动分配PCIe槽位或者调整PCIe ARIAlternative Routing-ID Interpretation开关让系统能识别更多的PCIe功能。4.3 多路径软件看不到设备现象存储端映射了LUN主机也能看到底层磁盘设备但multipath -ll里就是看不到聚合后的盘。最常见的原因是/etc/multipath.conf里没有配置对应设备的wwid或者把设备误拦截了。排查时用multipath -v3重新刷新并输出详细日志能看到它到底卡在哪一步。还有一个很容易忽略的地方多路径软件依赖SCSI的report luns命令来发现设备如果存储端映射的时候把主机类型设错了比如明明是Linux却配了Windows类型会导致LUN不响应某些命令多路径自然看不到盘。这种情况下存储端和主机端都要检查。主机端能做的就是用sg_scan、lsscsi看看底层磁盘是不是暴露了排除HBA链路问题存储端则看映射配置里主机类型、LUN类型、LUN ID是否匹配。我在现场处理过一次折腾半天最后发现是存储上“主机类型”选成了AIX所有LUN响应都很奇怪改成Linux后一切正常。4.4 线缆和光模块的隐性故障老实说HBA卡本身故障率很低真正搞事情的往往是光模块、光纤跳线、光纤配线架这些“外设”。光纤跳线看着好好的但弯折半径过小或者长期被机柜扎带勒着内部纤芯可能已经受损。光模块也是一个道理尤其是用了几年的老模块发光功率会逐渐衰减。HBA卡厂商管理工具里都能看到光模块的收发光功率。一般来说收光功率在-10dBm以上是健康的低于-20dBm可能就不太行了不同模块标准有差异但趋势很有参考价值。遇到链路闪断、CRC错误计数增长先别急着换HBA卡把光纤两端都重新插拔一次擦一下光模块的金手指和光纤头看错误计数是否停止。如果还不行换一根光纤跳线再试。光纤头脏是机房环境里的头号杀手尤其是改造过的老机房光纤配线架上灰尘不少。建议每次处理光路问题都带上光纤清洁笔和无尘纸现场擦一下能解决一半以上的“疑难杂症”。常见现象可能的根因排查方向链路Offline不Up光模块不兼容、光纤断开、对端端口down检查光模块亮灯、查对端交换机或存储端口配置链路Up但速度不对线缆/光模块质量或规格不匹配查看协商速率替换线缆和模块传输性能差收发光功率异常、CRC错误增长查看光功率统计清洁光纤头系统启动极慢驱动与固件配合问题升级BIOS/HBA固件、禁用Option ROM系统认不到新卡插槽通道不足、卡没插紧lspci确认设备、重新插拔WWPN与配置不符LUN映射配置错误用管理工具核对光模块端口的WWPN收尾这行干久了我最想提醒你的一点和HBA卡打了这么多年交道最大的感受就是存储链路出问题时千万不要一上来就怀疑HBA卡硬件坏了。绝大多数所谓的“HBA卡故障”查到最后要么是光模块不兼容要么是光纤头脏了要么是驱动固件没配对。HBA卡这个设备本身相當皮实正常用个五六年问题不大。遇到故障时耐心点按“物理链路 — 光模块 — 驱动固件 — 存储配置 — 多路径”这个顺序一层层排查基本都能定位到根因。另外每一个新项目进场我都会让负责布线的人把光纤两端的标签和光模块型号记录到文档里这个习惯救过我很多次——半年后链路出问题翻出当时的记录一两分钟就能缩小排查范围。希望这篇关于HBA卡的内容对你有用下次在机房里再看到那块插着光纤的板卡能一眼认出它是干什么吃的也知道怎么把它伺候得服服帖帖。