Linux主机HBA卡WWN查询与存储LUN扫描实操指南
2026/9/16 22:03:44 网站建设 项目流程

接手一台新上架的Linux数据库服务器,或者给现有机器扩存储的时候,第一个动作往往不是装系统、配数据库,而是先把主机总线适配卡的光纤WWN抄出来,发给存储工程师划LUN,然后再回到主机侧把新映射的磁盘扫出来。这套流程你只要在机房待过两年,闭着眼睛都能背,但每次做都会有一堆细节容易翻车,比如WWN抄错一位数、扫描命令敲了之后盘没出来、多路径没认到新LUN……这一篇我直接把我自己的操作过程和踩坑记录整理出来,给刚接触这块的运维同行做个参考。

先说下这个操作的使用场景。凡是走光纤通道(Fibre Channel)连存储的Linux主机,无论是连中端存储还是全闪阵列,都会有HBA卡;而存储工程师划分LUN的时候,靠的就是你主机HBA卡的WWN来识别和授权。WWN全称是世界范围名称(World Wide Name),你可以把它理解成每张光纤HBA卡出厂自带的“身份证号”,全球唯一。存储端把你主机的WWN加入映射组之后,存储端口才会把LUN“踢”给你这台主机,主机再通过扫描总线的方式把新磁盘认出来,接下来就是建文件系统、挂载、迁移数据那一套常规操作。

这个过程说难不难,但最大的特点是“看不见摸不着”。你没法用肉眼确认光纤链路是否正常,只能依靠命令输出和系统日志层层排查。而且不同厂商的HBA卡、不同版本的Linux发行版,命令输出格式多少有点差异。这篇文章我会把“查WWN”和“扫描存储空间”这两件事拆开来讲,先讲原理和命令,再讲实操步骤和踩坑排查,最后给你一份可以直接抄作业的速查表。

1. 内容整体设计与思路拆解

1.1 为什么查WWN不是“查一下”那么简单

很多新手会觉得,查个WWN不就是一个命令的事吗?还真不是。关键在于,你要查的WWN不是“网卡MAC地址”那种一个设备一个号的简单概念。一张HBA卡通常有两个光纤端口,每个端口都有一个独立的WWN,而且每个端口还分“端口WWN”(Port WWN)和“节点WWN”(Node WWN)。存储端做映射时,有的厂商用端口WWN,有的用节点WWN,如果你用错了,映射关系就建立不起来。

还有一类情况更坑:服务器配置了虚拟化或者双机热备软件(比如RHCS、Veritas Cluster Server),这些软件会对WWN做虚拟化,主机实际发到存储端的WWN可能并不是HBA卡出厂时那个原始值。在这种场景下,你单纯用HBA卡厂商的工具(比如Emulex的elxflash、QLogic的sdiagnostics)去查,查出来的是“出厂WWN”,跟存储上实际认到的“当前WWN”还不一定一样。所以我的习惯是:先看系统识别到的WWN,再看HBA卡固件层级的WWN,两者交叉验证。

在Linux操作系统层面,查看FC端口WWN的经典路径是/sys/class/fc_host/hostX/port_name,这个文件里直接保存了当前HBA端口上报给系统的端口名,格式一般是0x开头的十六进制字符串。而HBA卡厂商工具查出来的,则是卡上固件记录的WWN值。在日常运维中,绝大多数情况以系统识别的结果为准。

1.2 存储扫描的本质:把看不见的LUN“拉”进系统

存储扫描这件事,本质上就是让主机重新发起一次总线扫描,去发现存储端有没有新的LUN映射过来。这就好比你手机在Wi-Fi信号满格的状态下,下拉刷新了一下Wi-Fi列表,刚开的邻近路由器就这么出现了——不是路由器不存在,而是你的手机之前没有主动去“探测”到它。

Linux系统扫描存储端口,主要有三个方向,对应三条命令路径:第一个是扫描主机HBA端口本身(/sys/class/scsi_host/hostX/scan),第二个是扫描挂在HBA端口下的SCSI目标(比如用sg_scan或者直接通过多路径软件重新扫描),第三个是操作系统层面对磁盘分区表进行重读(partprobe、partx)。很多人只执行了第一步,以为“盘就会出来”,结果fdisk -l里根本看不到,原因多半是漏了后面几步,或者多路径软件(比如device-mapper-multipath)还没来得及把新LUN纳管,导致系统只看到了底层sd设备,却没看到聚合后的dm设备。

我在生产环境里的习惯顺序是:先扫描FC端口唤醒链路,再扫描SCSI层让系统感知到新设备,紧接着执行multipathd的重新扫描让多路径识别聚合,最后再调用partprobe让分区表刷新。一套走完,lsblk才算是真正稳定下来。

2. 核心细节解析与实操要点

2.1 查看HBA卡WWN的全套命令

先说系统层面的查看方式,这部分对发行版不挑,RHEL、CentOS、Ubuntu、Debian等主流Linux发行版都适用。以下是常用的三个命令:

# 查看系统识别的所有FC主机端口及其WWN cat /sys/class/fc_host/host*/port_name # 更直观的方式,每个端口显示一行 for i in /sys/class/fc_host/host*; do echo "$i: $(cat $i/port_name)"; done # 配合systool查看接口速率、状态、WWN等详细信息 systool -c fc_host -v

cat /sys/class/fc_host/host*/port_name这个命令最直接,输出的是每个FC端口对应的WWN,通常以0x开头。比如输出0x10000090fa123456,这里的10000090fa是厂商OUI前缀,后面6位是HBA卡厂商自己定义的序列号部分。存储厂商的配置界面里粘贴WWN时,有些系统要求带0x,有些不带,需要注意区分——不过绝大多数现代存储管理界面都允许直接粘贴,甚至能容忍带冒号分隔的格式。

qlogic和emulex的HBA卡在Linux下通常会自带诊断工具。qlogic卡常用cat /sys/class/scsi_host/hostX/port_name,也可以装qcscli或sdiagnostics;Emulex卡常用lputilnt,装好之后执行lputilnt -a就能看到端口WWN和节点WWN。如果系统里没装这些工具,也可以用lspci确认HBA卡槽位信息,再用systool -c fc_host -v来看状态。对于大多数运维场景,直接用/sys路径下读出来的值就够了,厂商工具主要用于固件级查询和固件升级。

查询目标推荐命令说明
端口WWN(系统级)cat /sys/class/fc_host/host*/port_name最常用,文本输出易提取
节点WWNcat /sys/class/fc_host/host*/node_name与端口WWN同目录下
端口运行状态cat /sys/class/fc_host/host*/port_stateOnline为正常,Offline说明链路有问题
端口速率cat /sys/class/fc_host/host*/speed显示8G/16G/32G等速率
HBA卡PCI信息lspci | grep -i fibre能看出是QLogic还是Emulex等厂商

2.2 扫描存储空间的核心命令拆解

扫描存储空间我用的是/sys/class/scsi_host/下的scan接口。基本思路是往hostX/scan文件里写一段特殊的格式,告诉内核“我要重新扫描这个SCSI主机”。命令如下:

# 全量重新扫描所有SCSI主机,黑白名单由系统自动判断 echo "- - -" > /sys/class/scsi_host/host0/scan echo "- - -" > /sys/class/scsi_host/host1/scan # 如果有多个HBA端口,可以循环扫描 for host in /sys/class/scsi_host/host*; do echo "- - -" > "$host/scan"; done

这里的- - -是三个通配符字段,分别对应SCSI总线号、目标ID、LUN号,全部用横杠表示“扫描所有”。这条命令做的是“全量发现”:SCSI主机(host)扫描自身链路能访问到的所有SCSI目标,进而识别出所有LUN。

扫描触发之后,会出现两种情况。第一种情况是存储端已经完成映射,且光纤链路正常,那么系统会立刻出现新的sd设备,比如从原来的sdb、sdc变成sdd、sde,甚至直接跳过中间编号。第二种情况是存储端映射正常,但光纤链路中断或链路协商异常,那么扫描完成后系统日志会不断报错,比如kernel: scsi host数调整link down相关事件。

扫描完SCSI层之后,即便底层的sd设备已经出现,操作系统层面的分区表和多路径设备视图还需要额外刷新。这一步经常被新手忽略,可在生产环境里恰恰最容易出问题。多路径环境要用multipathd的命令刷新:

# 刷新多路径设备 multipath -r # 或者针对新LUN执行 multipath -v2 /dev/sde

如果是非多路径环境,只需要重新读取分区表:

# 刷新分区表,适用于设备已存在分区的情况 partprobe /dev/sde # 也可以用partx,效果类似 partx -a /dev/sde

2.3 实战思路:查WWN和扫描存储的联动过程

查WWN和扫描存储,在实际工作中不是两个独立的操作,而是一条链路上的上下游。存储工程师在存储端创建主机组时,需要我提供主机所有HBA端口的WWN;他配置好映射之后,我再到主机上扫描存储空间、格式化新盘、挂载文件系统。整个过程涉及主机侧和存储侧两边的协同,任何一环脱节都会导致业务数据“看不见”。

我在这个环节有个习惯:先记录扫描前的磁盘基线。执行lsblkmultipath -ll,把结果随手保存到/tmp或直接贴到操作备忘里,扫描之后再对比一次。这样新设备是哪个盘、走的哪条路径、聚合成了哪个dm设备,一目了然。遇到问题的时候,也可以凭这个基线判断是“盘出现了但多路径没接管”还是“盘根本没被系统感知到”。

3. 实操过程与核心环节实现

3.1 完整案例:从查WWN到交付新空间

下面我用一个完整案例走一遍流程,假设场景是一台RHEL 8.6服务器,配置了双端口HBA卡,存储端映射了两块新LUN,我需要在这个主机上完成识别和交付。你可以直接在对应的Linux主机上实践。

第一步:确认HBA驱动加载情况和端口状态。

lsmod | grep -E 'qla2xxx|lpfc' lspci | grep -i fibre cat /sys/class/fc_host/host*/port_state

正常情况下,qla2xxx或lpfc驱动已经加载,lspci能看到Fibre Channel控制器,端口状态是Online。如果端口状态不是Online,说明光纤链路有问题,需要去检查光模块、光纤跳线、交换机端口或存储端口状态。

第二步:查WWN并记录。

for i in /sys/class/fc_host/host*; do echo "Host: $(basename $i)" echo " WWN: $(cat $i/port_name)" echo " State: $(cat $i/port_state)" echo " Speed: $(cat $i/speed)" done

输出大概长这样:

Host: host2 WWN: 0x10000090fa123456 State: Online Speed: 16 Gbit Host: host3 WWN: 0x10000090fa123457 State: Online Speed: 16 Gbit

把这两个WWN发给存储工程师,让他配置主机映射。

第三步:存储映射完成后,在主机侧做全量扫描。

for host in /sys/class/scsi_host/host*; do echo "- - -" > "$host/scan" done

扫描后执行lsblk看一下:

sda 8:0 0 558.9G 0 disk ├─sda1 8:1 0 600M 0 part /boot/efi ├─sda2 8:2 0 1G 0 part /boot └─sda3 8:3 0 557.3G 0 part ├─rhel-root 253:0 0 100G 0 lvm / ├─rhel-swap 253:1 0 8G 0 lvm [SWAP] └─rhel-home 253:2 0 449.3G 0 lvm /home sdb 8:16 0 1.8T 0 disk sdc 8:32 0 1.8T 0 disk sdd 8:48 0 1.8T 0 disk sde 8:64 0 1.8T 0 disk

原本只有sda一块系统盘,现在多了sdb、sdc、sdd、sde四块盘,每块1.8T,对应存储端映射过来的两块LUN通过双控制器分别呈现给主机。如果配置了多路径软件,需要继续执行多路径刷新。

第四步:多路径刷新与验证。

multipath -r multipath -ll

看到类似下面的输出就说明多路径正常:

mpatha (3600c0ff0001234567890abcdef12345) dm-3 VENDOR,STORAGE size=1.8T features='0' hwhandler='0' wp=rw `-+- policy='service-time 0' prio=50 status=active |- 1:0:0:1 sdb 8:16 active ready running |- 1:0:1:1 sdc 8:32 active ready running |- 0:0:0:1 sdd 8:48 active ready running `- 0:0:1:1 sde 8:64 active ready running

第五步:分区、格式化、挂载。

这里我以multipath设备mpatha为例:

# 分区 fdisk /dev/mapper/mpatha # 创建PV、VG、LV,或直接格式化挂载 mkfs.xfs /dev/mapper/mpatha mkdir -p /data1 mount /dev/mapper/mpatha /data1 echo "/dev/mapper/mpatha /data1 xfs defaults,_netdev 0 0" >> /etc/fstab

3.2 扫描不出来的常见现场处理实录

有一次我去客户现场,给一台CentOS 7.9主机扩存储,存储那边明明已经显示映射成功,主机这边fdisk -l就是看不到新盘。我当时按照“先查链路,再查扫描,最后查多路径”的顺序排查。

第一步检查FC端口状态,发现cat /sys/class/fc_host/host2/port_state显示Online,速率正常。第二步执行全量scan,没报错,但lsblk里依然没有新设备。第三步查看dmesg,发现内核日志里有反复出现的rport-2:0-1: blocked之类的报错,这是链路层通信异常的信号。最终定位到光纤线老化,换了一根跳线后重新扫描,盘立刻出现了。

这个案例说明,扫描命令本身不报错不代表链路没问题。遇到扫描不到盘的场景,别急着反复敲扫描命令,先看FC端口状态,再看dmesg聚焦fc相关日志,很多时候问题出在物理链路上。

4. 常见问题与排查技巧实录

4.1 问题速查表

把日常工作中遇到的高频问题整理成了表格,方便你直接对照排查。

现象可能原因排查命令/思路
port_state不是Online光纤链路中断、SFP光模块故障、交换机端口downcheck lspci、替换光纤收发器、检查存储端口
扫描后看不到新盘存储LUN映射未完成、WWN配错、多路径未刷新核对WWN、检查存储映射、multipath -r
同一个盘出现多次路径双控制器映射,系统上报了两个sd设备配置device-mapper-multipath,确认multipath -ll
dmesg大量blocked报错链路层质量差、HBA卡驱动异常dmesg|grep -i fc,检查线缆和光模块
系统重启后盘符变化设备名按发现顺序分配,重启可能变化用UUID或multipath设备的stable名称,不要直接用/dev/sdX
多路径设备无法聚合存储端未开启ALUA,或multipath配置缺失检查multipath.conf,确认wwid,检查storage端口策略

4.2 我再额外叮嘱几句踩坑总结

第一,WWN务必复制粘贴,不要手敲。WWN是十六进制字符串,里面既有0-9,也有a-f,手抄很容易把B和8、0和O搞混。存储那边映射错了,不会立即有报错,等到主机扫描不到盘才开始排查,时间成本就上去了。我是习惯在终端里选中直接复制,粘贴到邮件或工单里,全程不做二次编辑。

第二,多路径环境千万要养成“扫描三步走”的习惯。SCSI扫描只是第一步,multipath刷新和partprobe分区刷新同样关键。我有一次在新环境忘了执行multipath -r,底层sd盘已经出现了,但业务侧看不到dm设备,当时一度以为是LUN映射有问题,折腾了半小时才发现其实只是多路径缓存没更新。

第三,对生产环境操作时先记录基线。我会在执行扫描之前,先把lsblkmultipath -llcat /proc/partitions的输出保存下来。这样做有两个好处:一是扫描后可以快速对比哪些设备是新增的;二是万一操作引发了意外,我可以对照基线判断是哪个环节出了问题。

第四,一些发行版环境下echo "- - -" > /sys/class/scsi_host/hostX/scan可能需要root权限,如果提示权限不够,检查当前用户是否有足够的sudo权限。部分安全加固系统还会对sysfs接口做只读保护,遇到这种情况就需要走官方support tool或者重启服务器“意外发现”新LUN,但生产环境重启要格外谨慎,尽量用在线扫描方式解决。

第五,如果你要在脚本里自动化“查WWN+扫描”这套流程,我建议把命令写成模块化脚本,方便复用:

#!/bin/bash # 打印所有FC HBA端口信息 for hba in /sys/class/fc_host/*; do host=$(basename "$hba") echo "$host" echo " WWN: $(cat $hba/port_name)" echo " State: $(cat $hba/port_state)" done # 扫描存储空间 for scsi_host in /sys/class/scsi_host/*; do echo "- - -" > "$scsi_host/scan" done # 刷新多路径 if systemctl is-active multipathd >/dev/null 2>&1; then multipath -r fi

这套脚本我一般在人工操作之前先跑一遍,把WWN和扫描动作都覆盖到,输出一目了然。实际项目里,还可以让存储工程师直接在存储端完成映射后通知你执行脚本,然后把lsblk输出回传给他,双方确认无误后就算闭环了。

说起来,Linux主机查HBA卡WWN、扫描存储空间,本身并不是多么高深的技术操作,但它处在基础设施链路的关键节点上,一旦出错会影响整个项目的交付进度。把每一步的原理搞清楚,把命令背后的机制理解透,开发出自己的一套操作节奏,才能在这类日常操作里既快又稳。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询