#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_bond_health.sh
# 功能描述: 自动扫描系统底层 Bond 聚合网卡状态,核查物理成员链路冗余度 (纯只读)
# 使用方式: 在物理宿主机以 root 权限执行
# ==============================================================================
set -o pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} 系统底层 Bond 逻辑网卡高可用状态自动化巡检 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
# 1. 检测系统是否存在 Bond 网卡
if [ ! -d /proc/net/bonding ]; then
echo -e "\n${YELLOW}[INFO] 当前系统未加载 bonding 内核模块,未配置双网卡绑定。${PLAIN}"
exit 0
fi
BOND_FILES=$(ls /proc/net/bonding/ 2>/dev/null)
if [ -z "$BOND_FILES" ]; then
echo -e "\n${RED}[WARN] /proc/net/bonding/ 下无活跃接口,当前服务器存在物理网卡单点风险。${PLAIN}"
exit 0
fi
for bond in $BOND_FILES; do
echo -e "\n${YELLOW}>>> 正在检查逻辑接口: ${bond}${PLAIN}"
BOND_PATH="/proc/net/bonding/${bond}"
# 2. 提取核心配置与全局状态
BOND_MODE=$(grep "Bonding Mode:" "$BOND_PATH" | cut -d':' -f2 | sed 's/^[ \t]*//')
MII_STATUS=$(grep -m 1 "MII Status:" "$BOND_PATH" | cut -d':' -f2 | sed 's/^[ \t]*//')
MII_POLLING=$(grep "MII Polling Interval (ms):" "$BOND_PATH" | cut -d':' -f2 | sed 's/^[ \t]*//')
ACTIVE_SLAVE=$(grep "Currently Active Slave:" "$BOND_PATH" | cut -d':' -f2 | sed 's/^[ \t]*//')
echo -e " -> 绑定工作模式: ${GREEN}${BOND_MODE}${PLAIN}"
echo -e " -> MII 探测周期: ${MII_POLLING} ms"
if [ "$MII_STATUS" == "up" ]; then
echo -e " -> 逻辑接口状态: ${GREEN}UP (正常)${PLAIN}"
else
echo -e " -> 逻辑接口状态: ${RED}DOWN (严重异常:逻辑网卡已中断)${PLAIN}"
fi
if [ -n "$ACTIVE_SLAVE" ]; then
echo -e " -> 当前承载主卡: ${GREEN}${ACTIVE_SLAVE}${PLAIN}"
fi
# 3. 遍历底层物理子网卡 (Slave Interfaces)
echo -e "\n -> [ 底层物理成员网卡状态 ]"
SLAVES=$(grep -E "^Slave Interface:" "$BOND_PATH" | cut -d':' -f2 | sed 's/^[ \t]*//')
UP_COUNT=0
TOTAL_COUNT=0
for slave in $SLAVES; do
((TOTAL_COUNT++))
# 提取对应子网卡块内的 MII Status 与 Link Failure Count
SLAVE_BLOCK=$(awk "/^Slave Interface: ${slave}$/,/^$/" "$BOND_PATH")
SLAVE_STATUS=$(echo "$SLAVE_BLOCK" | grep -m 1 "MII Status:" | cut -d':' -f2 | sed 's/^[ \t]*//')
FAIL_COUNT=$(echo "$SLAVE_BLOCK" | grep -m 1 "Link Failure Count:" | cut -d':' -f2 | sed 's/^[ \t]*//')
if [ "$SLAVE_STATUS" == "up" ]; then
echo -e " - 网卡 ${slave} :${GREEN}UP (链路正常)${PLAIN} | 历史闪断次数: ${FAIL_COUNT:-0}"
((UP_COUNT++))
else
echo -e " - 网卡 ${slave} :${RED}DOWN (物理链路断开!请检查网线或对端交换机端口)${PLAIN} | 历史闪断次数: ${FAIL_COUNT:-0}"
fi
done
# 4. 冗余健康度综合评估
if [ "$TOTAL_COUNT" -lt 2 ]; then
echo -e "\n -> ${RED}[ALERT]${bond} 仅包含 ${TOTAL_COUNT} 块物理网卡,不具备物理冗余容灾能力!${PLAIN}"
elif [ "$UP_COUNT" -lt "$TOTAL_COUNT" ]; then
echo -e "\n -> ${RED}[WARN] 检测到备用物理链路处于 DOWN 状态!当前已降级为单点运行,失去容灾保护,请尽快报修物理链路。${PLAIN}"
else
echo -e "\n -> ${GREEN}[OK] ${bond} 所有底层物理成员链路均处于 UP 状态,高可用冗余正常。${PLAIN}"
fi
done
echo -e "\n${BLUE}================================================================${PLAIN}"