脚本如何检测光纤通道是否正常

wen 实用脚本 15

本文目录导读:

脚本如何检测光纤通道是否正常

  1. 方法一:使用 systoolcat 检查HBA卡状态
  2. 方法二:使用 fcping 确认端到端连通性
  3. 方法三:分析系统日志与硬件错误
  4. 方法四:完整状态检测脚本(推荐)
  5. 适用场景与建议
  6. 补充:Windows环境检测
  7. 常见故障判断

要检测光纤通道(Fibre Channel, FC)是否正常,通常需要从物理层(链路状态)协议层(协商速率) 以及设备层(HBA卡健康) 三个层面进行,以下是几种常见的脚本检测方法,适用于Linux/Unix环境。

使用 systoolcat 检查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 表示正常。OfflineLinkdownBypass 表示异常。
  • speed: 4 Gbit, 8 Gbit, 16 Gbit,如果显示 unknown0,可能存在问题。

使用 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

注意: 需要安装 libfcfcping 工具,在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定期执行,并配置邮件告警。

抱歉,评论功能暂时关闭!