本文目录导读:

- 方法一:使用
systool或cat检查HBA卡状态 - 方法二:使用
fcping确认端到端连通性 - 方法三:分析系统日志与硬件错误
- 方法四:完整状态检测脚本(推荐)
- 适用场景与建议
- 补充:Windows环境检测
- 常见故障判断
要检测光纤通道(Fibre Channel, FC)是否正常,通常需要从物理层(链路状态)、协议层(协商速率) 以及设备层(HBA卡健康) 三个层面进行,以下是几种常见的脚本检测方法,适用于Linux/Unix环境。
使用 systool 或 cat 检查HBA卡状态
这是最直接的方法,检查FC HBA(主机总线适配器)的在线状态。
#!/bin/bash
# 检测FC HBA端口状态
echo "=== 检测FC HBA端口状态 ==="
# 检查是否有FC设备
if ! ls /sys/class/fc_host/ &>/dev/null; then
echo "错误:未检测到FC HBA设备或驱动未加载。"
exit 1
fi
# 遍历所有FC主机端口
for fc_host in /sys/class/fc_host/fc_host*; do
hostname=$(basename "$fc_host")
port_state=$(cat "$fc_host/port_state" 2>/dev/null)
port_speed=$(cat "$fc_host/speed" 2>/dev/null)
wwnn=$(cat "$fc_host/node_name" 2>/dev/null)
wwpn=$(cat "$fc_host/port_name" 2>/dev/null)
echo "端口: $hostname"
echo " WWNN: $wwnn"
echo " WWPN: $wwpn"
echo " 状态: $port_state"
echo " 速率: $port_speed"
# 关键判断:状态是否为Online
if [ "$port_state" = "Online" ]; then
echo " [OK] 端口在线,链路正常。"
else
echo " [FAIL] 端口离线或出现问题!"
fi
echo ""
done
关键字段解释:
port_state:Online表示正常。Offline、Linkdown、Bypass表示异常。speed:4 Gbit,8 Gbit,16 Gbit,如果显示unknown或0,可能存在问题。
使用 fcping 确认端到端连通性
fcping 是一个底层工具,用于测试FC网络中的设备是否可达。
#!/bin/bash
# 使用fcping检测光纤通道连通性
# 目标设备端口WWN(World Wide Port Name),请替换为实际值
TARGET_WWPN="21:00:00:24:ff:37:9a:5c"
HBA_INTERFACE="fc1" # 指定要使用的HBA接口
echo "正在使用fcping检测到 $TARGET_WWPN 的连通性..."
# 发送5个ping包
if fcping -c 5 -i "$HBA_INTERFACE" "$TARGET_WWPN" 2>&1 | grep -q "5 packets received"; then
echo "[OK] 端口 $TARGET_WWPN 可达,光纤通道通信正常。"
else
echo "[FAIL] 端口 $TARGET_WWPN 不可达或响应超时!"
fi
注意: 需要安装 libfc 和 fcping 工具,在RHEL/CentOS中:yum install libfc fcping。
分析系统日志与硬件错误
光纤通道问题通常会记录在系统日志中,要捕捉硬件层面的错误(如CRC错误、链路重置):
#!/bin/bash
# 检测FC HBA硬件错误和链路问题
echo "=== 检测FC HBA硬件错误 ==="
echo ""
# 方法A:从sysfs读取错误计数(适用于QLogic/Broadcom驱动)
for fc_host in /sys/class/fc_host/fc_host*; do
hostname=$(basename "$fc_host")
# 链路故障次数
link_fail=$(cat "$fc_host/link_failures" 2>/dev/null)
loss_of_sync=$(cat "$fc_host/loss_of_sync" 2>/dev/null)
loss_of_sig=$(cat "$fc_host/loss_of_signal" 2>/dev/null)
echo "端口: $hostname"
echo " 链路失败次数: $link_fail"
echo " 同步丢失次数: $loss_of_sync"
echo " 信号丢失次数: $loss_of_sig"
# 如果有非零值,说明存在问题
if [ "$link_fail" -gt 0 ] || [ "$loss_of_sync" -gt 0 ] || [ "$loss_of_sig" -gt 0 ]; then
echo " [WARN] 该端口存在硬件错误或链路抖动!"
fi
echo ""
done
# 方法B:从dmesg中查找最近的FC错误(最近10分钟)
echo "=== 系统日志中的FC异常(最近10分钟) ==="
dmesg --since "10 minutes ago" 2>/dev/null | grep -iE "(fc|fibre|link down|link up|fabric|login)" | tail -20
完整状态检测脚本(推荐)
以下是一个综合脚本,整合了上面所有关键检测点,适合定期巡检:
#!/bin/bash
# 光纤通道健康检查脚本
STATUS=0 # 0=正常, 1=警告, 2=错误
echo "========================================="
echo " 光纤通道 (FC) 健康检测报告"
echo "========================================="
echo "主机: $(hostname)"
echo "时间: $(date)"
echo ""
# 1. 检测HBA是否存在
if [ ! -d /sys/class/fc_host/ ]; then
echo "[CRITICAL] 未检测到任何FC HBA设备!"
exit 2
fi
# 2. 遍历所有端口
for fc_host in /sys/class/fc_host/fc_host*; do
hostname=$(basename "$fc_host")
port_state=$(cat "$fc_host/port_state" 2>/dev/null)
port_speed=$(cat "$fc_host/speed" 2>/dev/null)
wwpn=$(cat "$fc_host/port_name" 2>/dev/null)
echo "端口: $hostname WWPN: $wwpn"
# 状态检测
case "$port_state" in
"Online")
echo " 状态: Online [OK]"
;;
"Offline"|"Linkdown")
echo " 状态: $port_state [CRITICAL]"
STATUS=2
;;
*)
echo " 状态: $port_state [WARN]"
[ $STATUS -lt 1 ] && STATUS=1
;;
esac
# 速率检测(如果为未知或0,视为异常)
if [ "$port_speed" = "unknown" ] || [ "$port_speed" = "0" ]; then
echo " 速率: $port_speed [WARN]"
[ $STATUS -lt 1 ] && STATUS=1
else
echo " 速率: $port_speed [OK]"
fi
echo ""
done
# 3. 检测硬件错误
echo "--- 硬件错误检测 ---"
ERROR_COUNT=$(find /sys/class/fc_host/ -name "link_failures" -exec cat {} \; 2>/dev/null | paste -sd+ | bc)
SYNC_COUNT=$(find /sys/class/fc_host/ -name "loss_of_sync" -exec cat {} \; 2>/dev/null | paste -sd+ | bc)
if [ "$ERROR_COUNT" ] && [ "$ERROR_COUNT" -gt 0 ]; then
echo " 链路失败次数: $ERROR_COUNT [WARN]"
[ $STATUS -lt 1 ] && STATUS=1
fi
if [ "$SYNC_COUNT" ] && [ "$SYNC_COUNT" -gt 0 ]; then
echo " 同步丢失次数: $SYNC_COUNT [WARN]"
[ $STATUS -lt 1 ] && STATUS=1
fi
# 4. 汇总
echo ""
echo "========================================="
case $STATUS in
0) echo "检测结论: [PASS] 所有FC链路正常" ;;
1) echo "检测结论: [WARN] 部分链路存在异常,需要关注" ;;
2) echo "检测结论: [FAIL] 存在严重链路问题,请立即处理" ;;
esac
exit $STATUS
适用场景与建议
| 场景 | 推荐方法 |
|---|---|
| 快速检查HBA是否在线 | 方法一(systool/cat) |
| 测试存储阵列连通性 | 方法二(fcping) |
| 判断是否有硬件故障 | 方法三(dmesg + 错误计数器) |
| 定期巡检脚本 | 方法四(综合检查) |
补充:Windows环境检测
在Windows中,可以使用PowerShell调用WMI:
Get-WmiObject -Class MSFC_FibrePortHBAAttributes -Namespace "root\wmi" | Select-Object InstanceName, PortState, PortSpeed, PortType
或者使用 fcadmin 命令(需安装FC HBA管理工具)。
常见故障判断
Linkdown:物理连接断开,检查光纤、SFP模块。Offline:逻辑隔离,可能配置了Zoning或Port Down。Online但速率未知:兼容性问题或驱动程序未正确识别。- 链路错误计数持续增长:光纤信号质量不佳(衰减、脏污)。
通过这些脚本,基本可以自动检测出90%以上的光纤通道问题,建议将综合脚本加入crontab定期执行,并配置邮件告警。