目 录CONTENT

文章目录

飞牛系统 OVS 自动守护与恢复完整方案

nankle
2025-09-11 / 0 评论 / 0 点赞 / 1 阅读 / 9620 字
温馨提示:
本文最后更新于 2025-09-11,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

适用场景

  • 飞牛系统(FNOS)中使用 Open vSwitch(OVS)构建 VLAN 网络

  • 虚拟机 ikuai 依赖 VLAN 2,3,4,5

  • OVS 服务或配置可能意外丢失,导致网络中断

  • 需全自动检测、恢复、重启虚拟机,无人值守,7×24 小时守护

🧩 一、目标

  1. 自动检测 OVS 服务是否运行、端口配置是否丢失

  2. 自动恢复

    • 启动 OVS 服务(如未运行)

    • 恢复 internal 端口 0e04c68006d-ovs tag=3(飞牛管理网络)

    • 恢复物理口 enx00e04c68006d 为 trunk 模式 + 严格过滤(tag=4095)

  3. 自动重启 虚拟机 ikuai,确保网络栈重置

  4. 每 30 秒检查一次,故障 30 秒内自愈

  5. 完整日志记录,便于事后排查


📁 二、文件结构

/usr/local/bin/ovs-guardian.sh           ← 主守护脚本
/etc/systemd/system/ovs-guardian.service ← systemd 服务单元
/etc/systemd/system/ovs-guardian.timer   ← systemd 定时器
/var/log/ovs-guardian.log                ← 运行日志

🛠️ 三、完整部署步骤

✅ 步骤 1:创建守护脚本

sudo nano /usr/local/bin/ovs-guardian.sh

粘贴以下内容(已适配飞牛系统,端口名、虚拟机名可直接使用):

#!/bin/bash

# ==============================
# OVS + VM 自动守护脚本(飞牛系统专用版)
# 功能:
#   1. 检测 OVS 是否运行 → 否则启动
#   2. 检查并恢复 internal 端口 (tag=3)
#   3. 检查并恢复物理端口 (trunk + tag=4095)
#   4. 如配置变更 → 强制重启虚拟机 ikuai
#   5. 每30秒自动运行,日志记录
# ==============================

LOG="/var/log/ovs-guardian.log"
OVSPORT_INTERNAL="0e04c68006d-ovs"
OVSPORT_PHYSICAL="enx00e04c68006d"
VM_NAME="ikuai"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"
}

# Step 1: 检查 OVS 服务状态,未运行则启动
if ! systemctl is-active --quiet openvswitch-switch; then
    log "⚠️  OVS 服务未运行,正在启动..."
    systemctl start openvswitch-switch
    sleep 5  # 等待 OVS 初始化
fi

# Step 2: 检查 OVS 数据库是否就绪(避免 db.sock 未初始化)
if ! ovs-vsctl show >/dev/null 2>&1; then
    log "⚠️  OVS 数据库未就绪,等待 5 秒..."
    sleep 5
    if ! ovs-vsctl show >/dev/null 2>&1; then
        log "❌ OVS 数据库仍不可用,放弃本次修复。"
        exit 1
    fi
fi

# Step 3: 检查并恢复 internal 端口配置(飞牛管理网络)
if ! ovs-vsctl list port "$OVSPORT_INTERNAL" | grep -q "tag.*3"; then
    log "🔧 恢复 internal 端口 $OVSPORT_INTERNAL tag=3"
    ovs-vsctl set port "$OVSPORT_INTERNAL" tag=3 2>&1 | tee -a "$LOG"
fi

# Step 4: 检查并恢复物理端口配置(防环路 trunk)
PHYSICAL_CONFIG_CHANGED=false

if ! ovs-vsctl list port "$OVSPORT_PHYSICAL" | grep -q "trunks.*[2345]"; then
    log "🔧 恢复物理端口 trunks=2,3,4,5"
    ovs-vsctl set port "$OVSPORT_PHYSICAL" trunks=2,3,4,5 2>&1 | tee -a "$LOG"
    PHYSICAL_CONFIG_CHANGED=true
fi

if ! ovs-vsctl list port "$OVSPORT_PHYSICAL" | grep -q "vlan_mode.*trunk"; then
    log "🔧 恢复物理端口 vlan_mode=trunk"
    ovs-vsctl set port "$OVSPORT_PHYSICAL" vlan_mode=trunk 2>&1 | tee -a "$LOG"
    PHYSICAL_CONFIG_CHANGED=true
fi

if ! ovs-vsctl list port "$OVSPORT_PHYSICAL" | grep -q "tag.*4095"; then
    log "🔧 恢复物理端口 tag=4095 (strict trunk filter)"
    ovs-vsctl set port "$OVSPORT_PHYSICAL" tag=4095 2>&1 | tee -a "$LOG"
    PHYSICAL_CONFIG_CHANGED=true
fi

# Step 5: 如果物理口配置被修改过 → 重启虚拟机 ikuai
if [ "$PHYSICAL_CONFIG_CHANGED" = true ]; then
    log "🔄 检测到网络配置变更,准备重启虚拟机 $VM_NAME"

    # 检查虚拟机是否正在运行
    if virsh list --name | grep -q "^$VM_NAME$"; then
        log "🛑 正在强制关闭虚拟机 $VM_NAME..."
        virsh destroy "$VM_NAME" 2>&1 | tee -a "$LOG"
        sleep 3
    fi

    # 启动虚拟机
    log "🚀 正在启动虚拟机 $VM_NAME..."
    virsh start "$VM_NAME" 2>&1 | tee -a "$LOG"

    # 等待并确认启动状态
    sleep 5
    if virsh list --name | grep -q "^$VM_NAME$"; then
        log "✅ 虚拟机 $VM_NAME 已成功启动。"
    else
        log "❌ 虚拟机 $VM_NAME 启动失败!请手动检查。"
    fi
fi

log "✅ 守护检查完成,系统状态正常。"

✅ 步骤 2:赋予脚本执行权限

sudo chmod +x /usr/local/bin/ovs-guardian.sh

✅ 步骤 3:创建 systemd 服务文件

sudo nano /etc/systemd/system/ovs-guardian.service

内容:

[Unit]
Description=OVS and VM Guardian Service for FeiNiu System
After=openvswitch-switch.service libvirtd.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/ovs-guardian.sh
User=root
Group=root
TimeoutStartSec=60
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

✅ 步骤 4:创建 systemd 定时器(每 30 秒运行一次)

sudo nano /etc/systemd/system/ovs-guardian.timer

内容:

[Unit]
Description=Run OVS Guardian every 30 seconds for FeiNiu

[Timer]
OnBootSec=30
OnUnitActiveSec=30
Unit=ovs-guardian.service

[Install]
WantedBy=timers.target

✅ 步骤 5:启用并启动守护服务

# 重新加载 systemd 配置
sudo systemctl daemon-reload

# 启用并启动定时器
sudo systemctl enable ovs-guardian.timer
sudo systemctl start ovs-guardian.timer

# 启用服务(双重保险,开机自启)
sudo systemctl enable ovs-guardian.service

🔍 四、验证部署

✅ 1. 查看定时器状态

systemctl list-timers | grep ovs

应看到类似:

Thu 2025-09-11 19:30:00 CST  25s left   Thu 2025-09-11 19:29:30 CST  4s ago    ovs-guardian.timer

✅ 2. 手动触发一次测试

sudo systemctl start ovs-guardian.service
sudo systemctl status ovs-guardian.service

✅ 3. 查看实时日志

tail -f /var/log/ovs-guardian.log

应看到类似输出:

[2025-09-11 19:29:30] ✅ 守护检查完成,系统状态正常。
[2025-09-11 19:30:00] 🔧 恢复物理端口 tag=4095 (strict trunk filter)
[2025-09-11 19:30:00] 🔄 检测到网络配置变更,准备重启虚拟机 ikuai
[2025-09-11 19:30:00] 🛑 正在强制关闭虚拟机 ikuai...
[2025-09-11 19:30:03] 🚀 正在启动虚拟机 ikuai...
[2025-09-11 19:30:08] ✅ 虚拟机 ikuai 已成功启动。
[2025-09-11 19:30:08] ✅ 守护检查完成,系统状态正常。

✅ 4. 模拟故障测试(可选)

# 模拟 OVS 崩溃
sudo systemctl stop openvswitch-switch

# 等待 30 秒,观察日志是否自动恢复
tail -f /var/log/ovs-guardian.log

🛡️ 五、增强建议(可选)

1. 设置 OVS 服务崩溃自动重启

sudo systemctl edit openvswitch-switch.service

添加:

[Service]
Restart=always
RestartSec=5

然后:

sudo systemctl daemon-reload
sudo systemctl restart openvswitch-switch

2. 设置日志轮转(防止日志过大)

sudo nano /etc/logrotate.d/ovs-guardian

内容:

/var/log/ovs-guardian.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 644 root root
}

0

评论区