在服务器上确认FC卡驱动是否装好,直接执行lspci | grep -i fibre看硬件是否被系统识别,再用lsmod | grep qla2xxx确认驱动模块有没有加载,两条命令就能得出结论。
做服务器运维的朋友应该都遇到过这种情况:存储阵列那边一切正常,交换机端口也亮着,但服务器里就是看不到磁盘,排查到最后,十有八九是FC卡驱动没装或者没加载成功,这玩意儿不像网卡,坏了顶多断网,FC卡出问题,整个存储链路直接瘫痪,业务数据全堵在门口进不来,今天咱们就把这个识别过程彻底聊透,从命令行到日志,从Linux到Windows,给你一套能直接上手用的排查方法。
linux查看fc卡是否安装驱动的三种方法
Linux系统下识别驱动状态,别指望图形界面,命令行才是最可靠的,我见过不少新手打开系统设置里的硬件列表看半天,啥也看不出来,最后还得老老实实回到终端,以下三种方法按顺序执行,基本能覆盖百分之九十九的场景。
用lspci验证硬件是否被系统识别
这一步是最基础的,先确认系统有没有“看见”这块卡,执行命令:
lspci | grep -i fibre
如果卡是QLogic或者Emulex(现在叫Broadcom)的,输出会类似这样:
03:00.0 Fibre Channel: QLogic Corp. ISP2722-based 16Gb Fibre Channel to PCIe Adapter (rev 02)
看到这行输出,说明PCIe总线层面已经识别到这块卡了,如果这里就空空如也,那问题不在驱动,在硬件本身卡没插好、PCIe插槽坏了、或者卡本身烧了,此时你该做的是断电、重新插拔卡,或者换个插槽试试,行业共识认为,lspci都看不到的设备,驱动再折腾也是白费力气。
用lsmod确认驱动模块是否加载
硬件识别到了,接下来看驱动,以最常见的QLogic卡为例:
lsmod | grep qla2xxx
qla2xxx 2088960 2
有这个结果,说明驱动模块已经加载进内核了,同理,Emulex卡的驱动叫lpfc,检查命令换成lsmod | grep lpfc,如果是博通自家的一些老款卡,驱动名可能是bnx2fc。
这里有个细节容易被忽略:lsmod显示的第三列数字是“被引用次数”,如果这里的数字是0,说明驱动虽然加载了,但可能没有实际工作中的设备在用,这种情况通常意味着卡的固件和驱动版本不匹配,或者卡本身处于禁用状态。
用dmesg找驱动初始化的关键日志
驱动加载成功不代表初始化成功。dmesg能告诉你最真实的情况:
dmesg | grep -i qla2xxx
正常的日志末尾,你会看到类似qla2xxx 0000:03:00.0: LIP reset occurred或者QLogic Fibre Channel HBA: QLE2742这样的信息,最关键的是看有没有adapter is online字样这表示卡的端口已经和交换机完成登录,链路是通的。
反过来,如果看到failed、error、timeout这些词,那就得仔细看上下文了,常见的报错比如firmware image not present,这是固件丢了;再比如DMA mapping failed,这可能是BIOS里没开Above 4G Decoding,导致卡无法在64位地址空间工作。
系统层面确认驱动状态的辅助手段
命令行确认之后,还可以从系统设备节点和存储侧两个方向做交叉验证,多一层确认,总归更稳妥。
检查/dev目录和fc_host节点
驱动加载成功后,系统会在/dev目录下创建对应的设备文件,执行:
ls /dev/ | grep fc
能看到fpga、fc128这类设备节点(不同发行版命名略有差异)。/sys/class/fc_host/目录下也会出现host0、host1这样的子目录,这些对应物理卡上的每个FC端口:
cat /sys/class/fc_host/host0/port_name
这个命令会输出端口的WWPN(全球端口名),形如0x21000024ff6a3b7c,能拿到WWPN,就说明从硬件到驱动再到内核子系统,这条链路已经全部打通了,拿这个WWPN去存储阵列上查zoned配置,就能确认是不是存储侧没把LUN映射过来。
存储侧多路径的佐证视角
就算服务器这边一切正常,也别忘了看一眼多路径软件的认盘情况,在CentOS或Ubuntu上执行multipath -ll,能看到系统通过FC链路发现的所有存储设备路径,如果FC卡驱动有问题,这里通常一行输出都没有,或者只有一条失效路径。
另外一个常见误区是把lsscsi的输出误判为FC卡状态。lsscsi显示的是上层SCSI设备,它正常工作只能说明存储磁盘已经被系统看到,而FC卡本身的状态,还是得回到lspci和lsmod那儿去判断。
服务器fc卡驱动安装失败怎么排查
如果你发现驱动确实没装上,那就要进入下一步了,直接去发行版仓库yum install qla2xxx或apt install qla2xxx通常找不到包,因为FC卡驱动多数情况是编译进内核的,或者需要自己装厂商提供的驱动包。
确认卡型号后找对应驱动源码包
先用lspci -vv查看卡的完整设备ID和厂商ID,记录下来,然后去Broadcom官网(Emulex和QLogic现在都在那儿)或者卡厂商的技术支持页面,按设备ID找对应的驱动源码包。
这里多说一句:Emulex和QLogic的驱动源码包,编译前必须先装好内核头文件:
yum install kernel-devel
或:
apt install linux-headers-$(uname -r)
内核头文件装不上,后面编译百分之百会报错。
编译过程中最常见的报错及应对
编译FC卡驱动时,最常遇到的问题就是内核版本太新,老驱动源码里的一些内核API调用已经失效了,报错信息一般是error: implicit declaration of function 'XXX'或error: struct pci_dev has no member named 'XXX'。
遇到这种报错,别硬着头皮改源码,先去查一下该驱动是否发布了适配新版内核的补丁包,多数情况下,厂商会提供两个版本:一个适配RHEL/CentOS系列,一个适配Ubuntu/Debian系列,别下错,如果厂商的驱动确实不支持你当前的内核版本,更实际的做法是用系统自带的内置驱动模块这点后面细说。
驱动加载后立即失效的问题怎么处理
这算是比较棘手的一种情况:驱动编译成功,modprobe加载也不报错,但过几秒卡就掉线了。dmesg里反复出现Firmware aborted或者Port down。
这种问题,业内专家指出,多数跟卡的固件版本有关,和驱动本身关系不大,先记录下卡当前的固件版本:
cat /sys/class/fc_host/hostX/firmware_version
然后去厂商官网比对,看是否有已知的固件缺陷和对应的升级包,升级FC卡固件需要专门的工具,QLogic卡用sanboot或qaucli,Emulex卡用elxflash,这些工具在bootable的DOS镜像里就有,也可以做成Linux下的可执行文件,刷固件有风险,操作时记得只在维护窗口做。
Windows系统下检测FC卡驱动的简易路径
Linux用户居多,但Windows环境也有不少,在Windows Server下,打开设备管理器,找到“存储控制器”或“Fibre Channel Adapter”分类,设备图标上如果有黄色感叹号,那肯定是驱动有问题。
更专业一点的做法是看系统事件日志在“应用程序和服务日志”下的HBA事件类别中,能看到详细的端口状态记录,Windows下QLogic卡的管理工具叫QConvergeConsole,Emulex的对应工具是OneCommand Manager,装一个就能看到端口和驱动的完整状态,比翻设备管理器直观得多。
怎么识别服务器fc卡驱动状态:常见问题Q&A
针对比较集中的几个疑问,这里一并解答清楚,也把上面分散的命令整合一下。
问:FC卡驱动和HBA卡驱动是一回事吗?
是,FC卡就是光纤通道HBA卡,只是叫法不同,无论是QLogic、Emulex还是博通,官方驱动文档里都统一用“HBA驱动”来指代FC卡驱动,区别只在于接口不同FC卡是连接光纤存储网络的,普通SATA/SAS HBA卡是连接本地硬盘的,两者驱动完全不通用。
问:为什么lspci能看到卡,但系统识别不到存储设备?
这个问题优先级排序很明确:先确认驱动模块加载状态(lsmod),再确认卡端口是否和交换机完成登录(dmesg中的adapter is online),最后查存储侧LUN映射和Zoning配置,三个环节环环相扣,前一个没通过,后面的都不用看,另外别忘了检查光纤跳线,我见过不少案例,折腾半天驱动,最后发现是光模块脏了收光功率过低导致链路不稳定。
问:CentOS下自带的FC卡驱动和厂商提供的驱动有什么区别?
CentOS系统内已经内置了主流FC卡的驱动模块,比如qla2xxx和lpfc,系统自带驱动的优势是随内核版本自动更新,兼容性有保障,初始化集成度也高,厂商驱动则可能包含一些新卡型号的适配补丁,以及对特定存储阵列的优化参数,实际部署中,建议先用系统自带驱动跑一段时间,遇到性能或兼容性问题再换厂商驱动,多数情况下,系统自带驱动完全够用,额外安装厂商驱动反而可能因为内核升级导致模块签名不匹配的麻烦。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/773382.html


