收起左侧

开启 OVS 后设备获取不到 IP 的处理方法

82
回复
5058
查看
  [ 复制链接 ]

294

主题

1万

回帖

0

牛值

管理员

fnOS1.0上线纪念勋章

2026-3-10 19:19:00 显示全部楼层 阅读模式

现象

部分设备开启(OVS)后,设备原本能自动获取 IP,但现在网络不通、DHCP 拿不到地址,Web 管理页也进不去。

适用场景

  • 设备开启 OVS 后无法获取 IP
  • 你能 接显示器/键盘 进入本机终端
  • 有多网口设备/额外的USB网卡:可以将网线插到另一个没有开启OVS的网口来获取IP进入系统。
  • 只有一个网口的设备:可以先尝试多重启几次设备看能否获取到IP,进入系统关闭OVS。

一、进入终端

接显示器/键盘 进入本机终端后先输入你的管理员账号及密码进行登录,

示例

假设:

  • 用户名:root

则在设备名 login中输入:

xxx login:root

接着输入密码

password:

👉 输入 NAS 密码(输入时不会显示,这是正常的)

👉 回车

切换到root账号

输入:

sudo -i

然后回车

接着输入密码

password:

👉 输入 NAS 密码(输入时不会显示,这是正常的)

👉 回车


二、执行命令获取 IP

  • 接口名因机型而异:下面示例用 enp3s0。请先执行 ip a,把命令里的 enp3s0 替换成你机器上实际显示的网口名(例如 eno1 / enp2s0 / eth0 等)。
  • 需要把下列命令中的 enp3s0 全部替换为你自己的网口名。
  1. 获取网口名称

ip a

接口名因机型而异,如下方网口名称为ens2-ovs

  1. 从 OVS 端口解绑物理网口

需要把下列命令中的 enp3s0 全部替换为你自己的网口名。
ovs-vsctl del-port enp3s0-ovs enp3s0
  1. 拉起网口链路

需要把下列命令中的 enp3s0 全部替换为你自己的网口名。
ip l set dev enp3s0 up
  1. 通过 DHCP 获取地址

需要把下列命令中的 enp3s0 全部替换为你自己的网口名。
dhclient enp3s0
  1. 查看该网口当前 IP

ip a show dev enp3s0

获取到IP后就可以输入IP进入Web页。

该问题我们已联系部分用户进行排查,有ssh使用经验可私信联系@飞牛技术同学 提供网络服务更新脚本验证修复。

收藏
送赞 4
分享

0

主题

12

回帖

0

牛值

江湖小虾

2026-3-12 14:07:58 显示全部楼层

提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网络共享功能)——然后就可以使用手机APP或者网页进入飞牛后台,然后在网口选项里关闭OVS功能,然后就可以断开USB重启一下应该就回复正常了

感谢,折腾了一晚上  详情 回复
7 天前
大哥**。 我的nas突然访问不到了,因为是旧笔记本装的,我还以为是硬盘坏了。 搜到了这个帖子,看到了大哥的评论。 现在全部都正常了。。非常感谢。  详情 回复
2026-3-26 01:04
头疼了很久,就在最后下定决心重装时,看到你的方法,瞬间解决,顺利登录系统了。非常感谢,大牛。必须得回来顶你一个。版主是理论流,说的小白不懂,你是转化为实践派,简单的方法,搞定  详情 回复
2026-3-24 15:30
就差重装系统了,周末两天都在搞这个,Gpt和Gemini都问完了,无数方法试了,差点人崩溃  详情 回复
2026-3-22 23:53
**兄弟,我折腾一整天了看到你的方法两分钟解决,感谢  详情 回复
2026-3-21 20:08
今天我这的个问题折腾大半天,最后重装系统,才解决,吓得虚拟机都不敢开了  详情 回复
2026-3-19 23:55
今天早上设备突然失联了,折腾半天没解决,最后还是按照你这个方法解决了问题。  详情 回复
2026-3-18 13:41
目前看反馈就是OVS功能有问题,我这个方法适用于想简单快速解决问题的,因为可以直接进飞牛APP和网页直接操作,不用敲代码  详情 回复
2026-3-18 12:34
3

查看全部评分

0

主题

4

回帖

0

牛值

江湖小虾

2026-3-11 09:45:50 显示全部楼层

image.pngIP地址获取方式设置为手动的话且路由器没有进行IP-MAC绑定,路由器重启后就会丢失IPV4地址,导致断联,希望能够优化

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不是这个的问题,我路由器搞了ip绑定,NAS里年前因为出过一次掉ip的情况,接显示器连上之后用dhclient enp1s0-ovs手动拿到了一个ip,后面设置的是DCHP,但是没有用,依旧断网掉ip,看了这个帖子才发现是ovs上面出bug  详情 回复
2026-3-14 04:08

10

主题

32

回帖

0

牛值

初出茅庐

2026-3-11 09:25:50 显示全部楼层

系统版本1.23,没有开OVS,启动后10分钟断连

1

查看全部评分

3

主题

2

回帖

0

牛值

江湖小虾

fnOS1.0上线纪念勋章

2026-3-11 11:02:33 显示全部楼层

重新安装的系统,启动就获取不到 IP,都还没有设置管理员账号及密码怎么操作

我的重新安装后,目前测试只有防火墙功能无法打开。。。其他还算正常。。。最新版本打开防火墙功能 的话。就会死机。。。 目前这设备不是主力机。。。主力机是白群两台。。。白群稳定些。。。 飞牛,加油。。等你成  详情 回复
2026-3-11 15:07

9

主题

148

回帖

0

牛值

初出茅庐

2026-3-11 15:07:53 显示全部楼层
NHT 发表于 2026-3-11 11:02
重新安装的系统,启动就获取不到 IP,都还没有设置管理员账号及密码怎么操作
...

我的重新安装后,目前测试只有防火墙功能无法打开。。。其他还算正常。。。最新版本打开防火墙功能 的话。就会死机。。。
目前这设备不是主力机。。。主力机是白群两台。。。白群稳定些。。。
飞牛,加油。。等你成长。。

0

主题

2

回帖

0

牛值

江湖小虾

2026-3-11 17:29:25 显示全部楼层

遇到了这个问题,按照上面操作也不行,最后只能重装系统,崩溃

6

主题

29

回帖

0

牛值

江湖小虾

2026-3-11 21:33:28 显示全部楼层

我也同样问题,路由重新启动,或NAS有线断开,重连后,NAS不能获取IP。

目前最好的临时方法是,插入USB有线网卡,连接网线获取IP登录,然后重新启用原网卡。

6

主题

29

回帖

0

牛值

江湖小虾

2026-3-11 21:34:58 显示全部楼层

TP百兆的USB有线网卡,系统能自动识别。

15

主题

67

回帖

0

牛值

初出茅庐

2026-3-11 22:42:37 显示全部楼层

系统版本1.1.23,没有开OVS,启动后10分钟断连。 1.1.20 是正常的,升级就最开始是有ipv4,然后就没有ipv4了,ipv6时有时无。

0

主题

2

回帖

0

牛值

江湖小虾

2026-3-12 10:26:30 显示全部楼层
按照这个方法解绑了ovs绑定,能获取到ip了,但是安装的虚拟机网络就不能用了

18

主题

267

回帖

0

牛值

小有名气

fnOS1.0上线纪念勋章

2026-3-12 11:29:42 显示全部楼层

我的也出现这个问题,昨天开启了虚拟机,启用了OVS,今天早上路由重启后就获取不到IP了。我的机器是富士通D588,之前也是开机很慢才获取到IP,开机五六分钟才可以(之前好像也启用了OVS),后面重装过系统,没启用OVS的这几天很快正常获取。

3

主题

4

回帖

0

牛值

江湖小虾

2026-3-12 11:52:08 显示全部楼层

删除ovs应该只是临时措施吧,大佬们预计什么时候能够出个包修复呢cry

0

主题

1

回帖

0

牛值

江湖小虾

2026-3-12 17:51:15 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

搞半天搞不好 还好看到你的评论 厉害  👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍
帮到你就好 懒人想懒办法,也是看到前面有人讲用USB网卡能用就想到这个了,试了一下真成了 而且很方便  详情 回复
2026-3-12 23:12

0

主题

12

回帖

0

牛值

江湖小虾

2026-3-12 23:12:12 显示全部楼层
夏阔156232436 发表于 2026-3-12 17:51
搞半天搞不好 还好看到你的评论 厉害  👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍 ...

帮到你就好  懒人想懒办法,也是看到前面有人讲用USB网卡能用就想到这个了,试了一下真成了 而且很方便

0

主题

2

回帖

0

牛值

江湖小虾

2026-3-13 08:37:31 显示全部楼层

所以OVS虚拟网卡现在不能用了吗?我只有一个网口关闭后各种下载都不正常了。

2

主题

11

回帖

0

牛值

江湖小虾

2026-3-13 09:13:26 显示全部楼层

是不是以后用虚拟机的都用不了飞牛了,我已经3天不能连上飞牛了

18

主题

267

回帖

0

牛值

小有名气

fnOS1.0上线纪念勋章

2026-3-13 11:40:06 显示全部楼层

按教程修复后可以了,有一点需要注意,获取到IP后赶紧进后台关闭OVS,没关闭重启还是获取不到IP

0

主题

4

回帖

0

牛值

江湖小虾

2026-3-13 19:06:55 显示全部楼层

我发现OVS网卡即使使用dhclient命令获取到IP后,也会在运行1-2天后IP地址突然莫名其妙地消失,甚至重启设备也不一定能恢复IP。所以我想了一个解决办法,就是编写一个shell脚本,自动检测OVS网卡是否有IP地址,没有就执行dhclient。然后把这个脚本放到任务计划里每分钟执行一次,并且还添加了一个重启后执行的任务。目前来看运行了几天都没断网了。

#!/bin/bash
# 飞牛OS OVS网卡IP丢失自动修复脚本
# 功能:检测到OVS网卡无IP时自动执行dhclient获取IP

# ===================== 配置项 =====================
# OVS网卡名称(请确认实际OVS网卡名是否为enp2s0-ovs,不是则自行修改)
ovs_nic="enp2s0-ovs"

# 检测网卡IP状态
check_ip_status() {
    # 获取网卡的IPv4地址(排除127.0.0.1/0.0.0.0)
    ip_addr=$(ip addr show $ovs_nic | grep -Eo 'inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v '127.0.0.1' | grep -v '0.0.0.0' | awk '{print $2}')
}

# 执行IP修复
fix_ip() {
    # 先停止dhclient进程(避免冲突)
    pkill -f "dhclient $ovs_nic" >/dev/null 2>&1

    # 执行dhclient获取IP
    dhclient $ovs_nic >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        # 验证修复结果
        sleep 1
        new_ip=$(ip addr show $ovs_nic | grep -Eo 'inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v '127.0.0.1' | awk '{print $2}')
        echo "OVS网卡 $ovs_nic 的IP修复成功, 新IP: $new_ip"
    else
        echo "OVS网卡 $ovs_nic 的IP修复失败"
    fi
}

# ===================== 主程序 =====================
# 检查脚本权限
if [ "$(id -u)" -ne 0 ]; then
    echo "请以root用户运行此脚本"
    exit 1
fi

# 检查网卡是否存在
if ! ip link show $ovs_nic >/dev/null 2>&1; then
    echo "OVS网卡 $ovs_nic 不存在"
    exit 1
fi

check_ip_status

if [ "$ip_addr" == "" ]; then
    fix_ip
else
    echo "OVS网卡 $ovs_nic 状态正常, 当前IP: $ip_addr"
fi

1、先切换到root用户

2、使用前要先用ip addr命令确认OVS网卡的名称,然后修改脚本里的ovs_nic="enp2s0-ovs"

3、文件可以上传到飞牛的/tmp/文件夹,然后创建 /usr/local/scripts/ 文件夹,再把脚本文件拷贝进去,并改名,然后赋权

mkdir /usr/local/scripts/
mv /tmp/fix_ovs_network_v1.0.sh /usr/local/scripts/fix_ovs_network.sh
chmod +x /usr/local/scripts/fix_ovs_network.sh

5、添加任务

echo "* * * * * /bin/sh /usr/local/scripts/fix_ovs_network.sh" >> /var/spool/cron/crontabs/root
echo "@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh" >> /var/spool/cron/crontabs/root

6、重启任务服务

/sbin/service cron restart

执行效果:

image.png

附件:fix_ovs_network_v1.0.zip

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

0

主题

8

回帖

0

牛值

江湖小虾

2026-3-13 19:12:35 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

哥,谢谢你。差一点刷机了。

0

主题

4

回帖

0

牛值

江湖小虾

2026-3-13 19:31:56 显示全部楼层

为了实现自动检测物理网卡,自动检测OVS网卡,自动添加任务计划,我对脚本进行了功能升级。

#!/bin/bash
#飞牛OS有线OVS网卡IP丢失自动修复脚本
#功能:
#1、检测到OVS网卡丢失时自动创建OVS网卡
#2、检测到OVS网卡无IP时自动执行dhclient获取IP,如果指定了IP就设置固定IP到OVS网卡

######全局变量######
version="v1.1"                               #脚本版本号
script_file="fix_ovs_network_$version.sh"    #脚本文件名

phy_nic=""                                   #物理网卡:如果预设了名称,不自动检测物理网卡名
ovs_nic=""                                   #OVS网卡

ip_addr=""                                   #自动检测到的IP
static_ip=""                                 #固定IP:如果留空就默认自动获取IP
netmaks="24"                                 #子网掩码:如果设置了固定IP,务必要填写子网掩码
gateway=""                                   #网关IP:如果设置了固定IP,务必要填写网关IP
dns_server="223.5.5.5 8.8.8.8"               #DNS服务器:如果设置了固定IP,务必要填写DNS服务器,多个DNS服务器之间可以空格

######**######

#字符颜色程序_黑色
function black(){
    str_input=$1
    echo -e "\\033[30m$str_input\033[0m\c"
}

#字符颜色程序_红色
function red(){
    str_input=$1
    echo -e "\\033[31m$str_input\033[0m\c"
}

#字符颜色程序_绿色
function green(){
    str_input=$1
    echo -e "\\033[32m$str_input\033[0m\c"
}

#字符颜色程序_**
function yellow(){
    str_input=$1
    echo -e "\\033[33m$str_input\033[0m\c"
}

#字符颜色程序_蓝色
function blue(){
    str_input=$1
    echo -e "\\033[34m$str_input\033[0m\c"
}

#字符颜色程序_紫色
function purple(){
    str_input=$1
    echo -e "\\033[35m$str_input\033[0m\c"
}

#字符颜色程序_天蓝色
function skyblue(){
    str_input=$1
    echo -e "\\033[36m$str_input\033[0m\c"
}

#字符颜色程序_白色
function white(){
    str_input=$1
    echo -e "\\033[37m$str_input\033[0m\c"
}


#操作系统名称、版本检测
function system_check(){
    system_name=$(cat /etc/os-release | grep "NAME" | grep -v "_NAME" | awk -F '"' '{print$2}')
    system_version=$(cat /etc/os-release | grep "VERSION_ID" | awk -F '"' '{print$2}' | awk -F "." '{print $1}')
    yellow "操作系统名称: "; green "$system_name\n"
    yellow "操作系统版本: "; green "$system_version\n"
}


#检测指定网卡的IP地址
#用法:check_ip 网卡名
function check_ip() {
    # 获取网卡的IPv4地址(排除127.0.0.1/0.0.0.0)
    ip_addr=$(ip addr show $1 | grep -Eo 'inet [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v '127.0.0.1' | grep -v '0.0.0.0' | awk '{print $2}')
    if [ ! -z $ip_addr ]; then
        #yellow "网卡"; blue $1; yellow "的IP地址: "; green "$ip_addr\n"
        return 0
    else
        #yellow "网卡"; blue $1; yellow "的IP地址: "; red "未设置\n"
        return 1
    fi
}

#IP设置程序
#用法:configure_ip 网卡名
function configure_ip() {
    if [ -z $1 ];then
        red "没有输入网卡名\n"
        exit 1
    fi

    if [ "$static_ip" == "" ];then     #如果没有预设固定IP,就设置自动获取IP
        #先停止dhclient进程
        pkill -f "dhclient $1" >/dev/null 2>&1 

        #执行dhclient获取IP
        dhclient $1 >/dev/null 2>&1

        sleep 1
      
        #检查网卡的IP
        check_ip $1
    else
        if [ "$static_ip" != "" -a "$netmask" != "" -a "$gateway" != "" -a "$dns_server" != "" ];then
            #设置静态IP
            nmcli con mod $1 ipv4.addresses $static_ip/$netmask ipv4.method manual >> /dev/null 2>&1

            #设置网关
            nmcli con mod $1 ipv4.gateway $gateway >> /dev/null 2>&1

            #设置DNS
            nmcli con mod $1 ipv4.dns "$dns_server" >> /dev/null 2>&1

            #重启网卡生效
            nmcli con up $1 >> /dev/null 2>&1

            sleep 1

            #检查网卡的IP
            check_ip $1
        else    #如果预设的参数有缺失
            if [ "$netmask" != "" ];then
                red "未设置子网掩码\n"
            fi
            if [ "$gateway" != "" ];then
                red "未设置网关IP\n"
            fi
            if [ "$dns_server" != "" ];then
                red "未设置DNS服务器\n"
            fi

            red "固定IP预设参数不全,改成自动获取IP\n"
            #先停止dhclient进程
            pkill -f "dhclient $1" >/dev/null 2>&1 

            #执行dhclient获取IP
            dhclient $1 >/dev/null 2>&1

            sleep 1

            #检查网卡的IP
            check_ip $1
        fi
    fi

}


#获取物理网卡名称
function check_phy_nic(){
    if [ -z $phy_nic ];then   #如果没有预设物理网卡名称,就自动检测
        phy_nic=$(ls /sys/class/net/ | xargs -I {} sh -c 'if [ -d /sys/class/net/{}/device ]; then echo {}; fi' | grep -E 'enp|ens|eth' | head -1)
    fi

    if [ -z "$phy_nic" ]; then    #如果没有获取到物理网卡名称
        yellow "物理网卡名称: "; red "未检测到物理网卡\n"
        check_phy_nic_name_result="未检测到物理网卡"
    else
        yellow "物理网卡名称: "; green "$phy_nic\n"
        check_phy_nic_name_result="物理网卡名称$phy_nic"

        check_phy_nic_brand_result=$(lspci | grep -i ethernet | awk -F ':' '{print $3}' | awk '{print $1}')
        check_phy_nic_model_result=$(dmesg | grep -i $phy_nic | head -n 1 | awk '{print $3}')
        yellow "物理网卡品牌: "; green "$check_phy_nic_brand_result\n"
        yellow "物理网卡型号: "; green "$check_phy_nic_model_result\n"
    fi
}


#ovs网卡设置程序
#用法:configure_ovs check|setup|restore 物理网卡名
function configure_ovs(){
    if [ -z $1 ];then
        red "没有输入物理网卡名\n"
        exit 1
    fi
  
    if [ "$1" == "check" -o "$1" == "check-csv" ];then
        #检查物理网卡的状态
        if ip ad show "$2" | grep UP &>/dev/null; then
            check_phy_nic_status_result="物理网卡${2}状态是UP"
            yellow "物理网卡状态: "; green "UP\n"
        else
            check_phy_nic_status_result="物理网卡${2}状态是DOWN"
            yellow "物理网卡状态: "; red " DOWN\n"
        fi
      
        #检查物理网卡的IP
        check_ip $2
        if [ $? -eq 0 ]; then
            yellow "物理网卡的IP: "; red "$ip_addr\n"
            check_phy_nic_ip_result="物理网卡的IP是$ip_addr"
        else
            yellow "物理网卡的IP: "; green "未设置\n"
            check_phy_nic_ip_result="物理网卡的IP未设置"
        fi

        #判断物理网卡对应的OVS网卡是否存在(默认命名规则:物理网卡名-ovs)
        ovs_nic="$2-ovs"
        if ip ad show "$ovs_nic" &>/dev/null; then
            yellow "对应的OVS网卡: "; blue "$ovs_nic"; green " 存在\n"

            #检查物理网卡的OVS桥接设置
            if [ "$(ovs-vsctl port-to-br $2)" == "$ovs_nic" ]; then
                check_ovs_nic_result="物理网卡${2}的OVS桥接设置正常"
                yellow "OVS桥接设置: "; green "正常\n"
            else
                check_ovs_nic_result="物理网卡${2}的OVS桥接设置异常"
                yellow "OVS桥接设置: "; red "异常\n"
            fi

            #检测ovs网卡的IP
            check_ip $ovs_nic
            if [ $? -eq 0 ]; then
                yellow "OVS网卡的IP: "; green "$ip_addr\n"
                check_ovs_nic_ip_result="OVS网卡的IP是$ip_addr"
            else
                yellow "OVS网卡的IP: "; red "未设置\n"
                check_ovs_nic_ip_result="OVS网卡的IP未设置"
            fi
        else
            yellow "对应的OVS网卡: "; blue "$ovs_nic"; red " 不存在\n"
            check_ovs_nic_result="对应的OVS网卡${ovs_nic}不存在"
        fi
    elif [ "$1" == "setup" -o "$1" == "setup-csv" ];then
        #检查物理网卡的UP状态
        if ip ad show "$2" | grep UP &>/dev/null; then
            check_phy_nic_status_result="物理网卡${2}状态是UP"
            yellow "物理网卡状态: "; green "UP\n"
        else
            #把物理网卡设置为UP状态
            ifup $2

            if ip ad show "$2" | grep UP; then
                check_phy_nic_status_result="物理网卡${2}状态设置为UP成功"
                yellow "物理网卡状态: "; green "UP\n"
            else
                check_phy_nic_status_result="物理网卡${2}状态是DOWN"
                yellow "物理网卡状态: "; red "DOWN\n"
            fi
        fi
      
        #检查物理网卡的IP
        check_ip $2
        if [ $? -eq 0 ];then    #如果物理网卡配了IP,就删除其IP配置
            ip addr flush dev $2
            if [ $? -eq 0 ];then
                yellow "删除物理网卡IP: "; green "成功\n"
                check_phy_nic_ip_result="删除物理网卡IP成功"
            else
                yellow "删除物理网卡IP: "; red "失败\n"
                check_phy_nic_ip_result="删除物理网卡IP${ip_addr}失败"
            fi
        else
            yellow "物理网卡的IP: "; green "未设置\n"
            check_phy_nic_ip_result="物理网卡的IP未设置"
        fi

        #判断物理网卡对应的OVS网卡是否存在(默认命名规则:物理网卡名-ovs)
        ovs_nic="$2-ovs"
        if ip ad show "$ovs_nic" &>/dev/null; then
            yellow "对应的OVS网卡: "; blue "$ovs_nic"; green " 存在\n"

            #检查物理网卡的OVS桥接设置
            if [ "$(ovs-vsctl port-to-br $2)" == "$ovs_nic" ]; then
                check_ovs_nic_result="OVS桥接设置正常"
                yellow "OVS桥接设置: "; green "正常\n"
            else
                #把物理网卡从网桥里移除
                ovs-vsctl del-port ovs-system $2 >> /dev/null 2>&1
              
                #删掉整个网桥
                ovs-vsctl del-br ovs-system >> /dev/null 2>&1
              
                #创建网桥
                ovs-vsctl add-br ovs-system >> /dev/null 2>&1
              
                #把物理网卡加入网桥
                ovs-vsctl add-port ovs-system $2 >> /dev/null 2>&1

                #把OVS网卡设置为UP状态
                ifup $ovs_nic

                #检测OVS网卡修复结果
                if [ "$(ovs-vsctl port-to-br $2)" == "$ovs_nic" ]; then
                    check_ovs_nic_result="OVS桥接设置修复成功"
                    yellow "OVS桥接设置: "; green "修复成功\n"
                else
                    check_ovs_nic_result="OVS桥接修复失败"
                    yellow "OVS桥接设置: "; red "修复失败\n"
                fi
            fi

            #检测OVS网卡的IP
            check_ip $ovs_nic
            if [ $? -ne 0 ];then    #如果OVS网卡没有设置IP,就进行设置
                configure_ip $ovs_nic
                if [ $? -eq 0 ];then
                    yellow "OVS网卡的IP: "; green "$ip_addr\n"
                    check_ovs_nic_ip_result="OVS网卡的IP是$ip_addr"
                else
                    yellow "OVS网卡的IP: "; red "设置失败\n"
                    check_ovs_nic_ip_result="OVS网卡的IP设置失败"
                fi
            else
                yellow "OVS网卡的IP: "; green "$ip_addr\n"
                check_ovs_nic_ip_result="OVS网卡的IP是$ip_addr"
            fi
        else
            yellow "对应的OVS网卡: "; blue "$ovs_nic"; red " 不存在\n"
         
            #创建网桥
            ovs-vsctl add-br $ovs_nic >> /dev/null 2>&1
          
            #把物理网卡加入网桥
            ovs-vsctl add-port $ovs_nic $2 >> /dev/null 2>&1

            #把OVS网卡设置为UP状态
            ifup $ovs_nic >> /dev/null 2>&1

            #检测OVS网卡修复结果
            if [ "$(ovs-vsctl port-to-br $2)" == "$ovs_nic" ]; then
                check_ovs_nic_result="OVS桥接设置修复成功"
                yellow "OVS桥接设置: "; green "修复成功\n"
            else
                check_ovs_nic_result="OVS桥接修复失败"
                yellow "OVS桥接设置: "; red "修复失败\n"
            fi
        fi
    elif [ "$1" == "restore" -o "$1" == "restore-csv" ];then
        #判断物理网卡对应的OVS网卡是否存在(默认命名规则:物理网卡名-ovs)
        ovs_nic="$2-ovs"
        if ip ad show "$ovs_nic" &>/dev/null; then
            yellow "对应的OVS网卡: "; blue "$ovs_nic"; red " 存在\n"
          
            #把物理网卡从网桥里移除
            ovs-vsctl del-port $ovs_nic $2 >> /dev/null 2>&1

            #删除网桥
            ovs-vsctl del-br $ovs_nic >> /dev/null 2>&1

            #检查OVS网卡删除结果
            if ip ad show "$ovs_nic" &>/dev/null; then
                yellow "删除OVS网卡"; blue $ovs_nic; yellow ": "; red "失败\n"
                check_ovs_nic_result="删除OVS网卡${ovs_nic}失败"
            else
                yellow "删除OVS网卡"; blue $ovs_nic; yellow ": "; green "成功\n"
                check_ovs_nic_result="删除OVS网卡${ovs_nic}成功"
            fi
        else
            yellow "OVS网卡: "; blue "$ovs_nic"; green " 不存在\n"
            check_ovs_nic_result="OVS网卡${ovs_nic}不存在"
        fi

        #检查物理网卡的UP状态
        if ip ad show "$2" | grep UP &>/dev/null; then
            check_phy_nic_status_result="物理网卡${2}状态是UP"
            yellow "物理网卡状态: "; green "UP\n"
        else
            #把物理网卡设置为UP状态
            ifup $2 >> /dev/null 2>&1
          
            if ip ad show "$2" | grep UP &>/dev/null; then
                check_phy_nic_status_result="物理网卡${2}状态设置为UP成功"
                yellow "物理网卡状态: "; green "UP\n"
            else
                check_phy_nic_status_result="物理网卡${2}状态是DOWN"
                yellow "物理网卡状态: "; red "DOWN\n"
            fi
        fi
      
        #检查物理网卡的IP
        check_ip $2
        if [ $? -ne 0 ];then    #如果物理网卡没有设置IP,就进行设置
            configure_ip $2
            if [ $? -eq 0 ];then
                yellow "物理网卡的IP: "; green "$ip_addr\n"
                check_ovs_nic_ip_result="物理网卡的IP是$ip_addr"
            else
                yellow "物理网卡的IP: "; red "设置失败\n"
                check_ovs_nic_ip_result="物理网卡的IP设置失败"
            fi
        else
            yellow "物理网卡的IP: "; red "$ip_addr\n"
            check_phy_nic_ip_result="物理网卡的IP是$ip_addr"
        fi
    fi
}


#更新脚本文件程序
function upgrade_script_file(){
    if [ ! -d "/usr/local/scripts/" ];then    #如果不存在/usr/local/scripts/文件夹,就创建该文件夹
        mkdir /usr/local/scripts/
    fi

    if [ "$1" == "check" -o "$1" == "check-csv" ];then
        if [ -f "/usr/local/scripts/fix_ovs_network.sh" ];then    #如果存在fix_ovs_network.sh脚本
            check_upgrade_script_result1="脚本文件fix_ovs_network.sh已部署"
            yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
            if [ -f "$script_file" ];then    #如果存在新上传的脚本
                if [ "$(diff /usr/local/scripts/fix_ovs_network.sh $script_file)" == "" ];then    #如果旧脚本和新脚本完全相同
                    check_upgrade_script_result2="脚本文件无需更新"
                    yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
                else
                    check_upgrade_script_result2="脚本文件需要更新"
                    yellow "脚本更新: "; red "$check_upgrade_script_result2\n"
                fi
            else
                check_upgrade_script_result2="脚本文件无需更新"
                yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
            fi

            #检测fix_ovs_network.sh的权限
            if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" == "" ];then    #如果fix_ovs_network.sh脚本的权限不是700
                check_upgrade_script_result3="脚本权限不是700"
                yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
            else   #如果fix_ovs_network.sh脚本的权限是700
                check_upgrade_script_result3="脚本权限是700"
                yellow "脚本权限: "; green "$check_upgrade_script_result3\n"
            fi
        else
            check_upgrade_script_result1="脚本文件fix_ovs_network.sh未部署"
            check_upgrade_script_result2="脚本文件无需更新"
            check_upgrade_script_result3="脚本权限无法检测"
            yellow "脚本部署: "; red "$check_upgrade_script_result1\n"
            yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
            yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
        fi
        check_upgrade_script_result="$check_upgrade_script_result1;$check_upgrade_script_result2;$check_upgrade_script_result3"
    elif [ "$1" == "setup" -o "$1" == "setup-csv" ];then
        if [ -f "/usr/local/scripts/fix_ovs_network.sh" ];then    #如果存在fix_ovs_network.sh脚本
            check_upgrade_script_result1="脚本文件fix_ovs_network.sh此前已部署"
            yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
            if [ -f "$script_file" ];then    #如果存在新上传的tempcmd-root-fix_ovs_network.sh脚本
                if [ "$(diff /usr/local/scripts/fix_ovs_network.sh $script_file)" == "" ];then    #如果旧脚本和新脚本完全相同
                    check_upgrade_script_result2="脚本文件无需更新"
                    yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
                else
                    cp -f $script_file /usr/local/scripts/fix_ovs_network.sh
                    if [ $? -eq 0 ];then
                        check_upgrade_script_result2="脚本文件更新成功"
                        yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
                    else
                        check_upgrade_script_result2="脚本文件更新失败"
                        yellow "脚本更新: "; red "$check_upgrade_script_result2\n"
                    fi
                fi
            else
                check_upgrade_script_result2="脚本文件无需更新"
                yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
            fi

            #检测fix_ovs_network.sh的权限
            if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" == "" ];then    #如果fix_ovs_network.sh脚本的权限不是700
                chmod 700 /usr/local/scripts/fix_ovs_network.sh
                if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" != "" ];then
                    check_upgrade_script_result3="脚本权限设置为700成功"
                    yellow "脚本权限: "; green "$check_upgrade_script_result3\n"
                else
                    check_upgrade_script_result3="脚本权限设置为700失败"
                    yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
                fi
            else   #如果fix_ovs_network.sh脚本的权限是700
                check_upgrade_script_result3="脚本权限已经是700"
                yellow "脚本权限: "; green "$check_upgrade_script_result3\n"
            fi
        else
            if [ -f "$script_file" ];then    #如果存在新上传的tempcmd-root-fix_ovs_network.sh脚本
                cp -f $script_file /usr/local/scripts/fix_ovs_network.sh
                if [ $? -eq 0 ];then
                    check_upgrade_script_result1="脚本文件fix_ovs_network.sh部署成功"
                    check_upgrade_script_result2="脚本文件无需更新"
                    yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
                    yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
                    if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" == "" ];then    #如果fix_ovs_network.sh脚本的权限不是700
                        chmod 700 /usr/local/scripts/fix_ovs_network.sh
                        if [ "$(ls -l /usr/local/scripts/fix_ovs_network.sh | grep 'rwx------')" != "" ];then
                            check_upgrade_script_result3="脚本权限设置为700成功"
                            yellow "Script Permissions: "; green "$check_upgrade_script_result3\n"
                        else
                            check_upgrade_script_result3="脚本权限设置为700失败"
                            yellow "Script Permissions: "; red "$check_upgrade_script_result3\n"
                        fi
                    else   #如果fix_ovs_network.sh脚本的权限是700
                        check_upgrade_script_result3="脚本权限已经是700"
                        yellow "Script Permissions: "; green "$check_upgrade_script_result3\n"
                    fi
                else
                    check_upgrade_script_result1="脚本文件fix_ovs_network.sh部署失败"
                    check_upgrade_script_result2="脚本文件无需更新"
                    check_upgrade_script_result3="脚本权限无法检测"
                    yellow "脚本部署: "; red "$check_upgrade_script_result1\n"
                    yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
                    yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
                fi
            else
                check_upgrade_script_result1="脚本文件fix_ovs_network.sh未部署"
                check_upgrade_script_result2="脚本文件无需更新"
                check_upgrade_script_result3="脚本权限无法检测"
                yellow "脚本部署: "; red "$check_upgrade_script_result1\n"
                yellow "脚本更新: "; green "$check_upgrade_script_result2\n"
                yellow "脚本权限: "; red "$check_upgrade_script_result3\n"
            fi
        fi
        check_upgrade_script_result="$check_upgrade_script_result1;$check_upgrade_script_result2;$check_upgrade_script_result3"
    elif [ "$1" == "restore" -o "$1" == "restore-csv" ];then
        if [ -f "/usr/local/scripts/fix_ovs_network.sh" ];then    #如果存在fix_ovs_network.sh脚本
            rm -f /usr/local/scripts/fix_ovs_network.sh
            if [ ! -f "/usr/local/scripts/fix_ovs_network.sh" ];then
                check_upgrade_script_result1="脚本文件fix_ovs_network.sh删除成功"
                yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
            else
                check_upgrade_script_result1="脚本文件fix_ovs_network.sh删除失败"
                yellow "脚本部署: "; red "$check_upgrade_script_result1\n"
            fi
        else
            check_upgrade_script_result1="脚本文件fix_ovs_network.sh此前已删除"
            yellow "脚本部署: "; green "$check_upgrade_script_result1\n"
        fi
        check_upgrade_script_result="$check_upgrade_script_result1"
    fi
}


#设置任务计划程序
function config_crontab(){
    if [ "$1" == "check" -o "$1" == "check-csv" ];then
        root_cron_file="/var/spool/cron/crontabs/root"

        if [ -f "$root_cron_file" ];then    #如果存在root的任务文件
            if [ "$(cat $root_cron_file | grep 'fix_ovs_network.sh')" != "" ];then     #如果已经存在'fix_ovs_network.sh任务,判断设置的模式
                #检测是否存在重启后设置任务
                if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
                    if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
                        check_crontab_result1="重启后设置任务已添加"
                        yellow "重启后设置任务: "; green "$check_crontab_result1\n"
                    else
                        check_crontab_result1="重启后设置任务已添加但存在重复任务"
                        yellow "重启后设置任务: "; red "$check_crontab_result1\n"
                    fi
                else
                    check_crontab_result1="重启后设置任务未添加"
                    yellow "重启后设置任务: "; red "$check_crontab_result1\n"
                fi

                #检测是否存在每分钟设置任务
                if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
                    if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
                        check_crontab_result2="每分钟设置任务已添加"
                        yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
                    else
                        check_crontab_result2="每分钟设置任务已添加但存在重复任务"
                        yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
                    fi
                else
                    check_crontab_result2="每分钟设置任务未添加"
                    yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
                fi
            else
                check_crontab_result1="重启后设置任务未添加"
                check_crontab_result2="每分钟设置任务未添加"
                yellow "重启后设置任务: "; red "$check_crontab_result1\n"
                yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
            fi
        else
                check_crontab_result1="重启后设置任务未添加"
                check_crontab_result2="每分钟设置任务未添加"
                yellow "重启后设置任务: "; red "$check_crontab_result1\n"
                yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
        fi
        check_crontab_result="$check_crontab_result1;$check_crontab_result2"
    elif [ "$1" == "setup" -o "$1" == "setup-csv" ];then
        root_cron_file="/var/spool/cron/crontabs/root"

        if [ -f "$root_cron_file" ];then    #如果存在root的任务文件
            #检测是否存在重启恢复任务
            if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
                if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
                    check_crontab_result1="重启后设置任务此前已添加"
                    yellow "重启后设置任务: "; green "$check_crontab_result1\n"
                else
                    #如果该任务重复配置,就删除全部该任务,然后重新添加一次
                    sed -i "/@reboot sleep 5 && source \/etc\/profile && sh \/usr\/local\/scripts\/fix_ovs_network.sh/d" $root_cron_file
                    echo "@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file
                    if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
                        check_crontab_result1="重启后设置任务此前已添加"
                        yellow "重启后设置任务: "; green "$check_crontab_result1\n"
                    else
                        check_crontab_result1="重启后设置任务此前已添加但存在重复任务"
                        yellow "重启后设置任务: "; red "$check_crontab_result1\n"
                    fi
                fi
            else
                #echo "@reboot /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file  #添加重启设置任务
                echo "@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file  #添加重启设置任务
                if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
                    check_crontab_result1="重启后设置任务添加成功"
                    yellow "重启后设置任务: "; green "$check_crontab_result1\n"
                else
                    check_crontab_result1="重启后设置任务添加失败"
                    yellow "重启后设置任务: "; red "$check_crontab_result1\n"
                fi
            fi

            #检测是否存在每分钟设置任务
            if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
                if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
                    check_crontab_result2="每分钟设置任务此前已添加"
                    yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
                else
                    #如果该任务重复配置,就删除全部该任务,然后重新添加一次
                    sed -i "/\* \* \* \* \* \/bin\/sh \/usr\/local\/scripts\/fix_ovs_network.sh/d" $root_cron_file
                    echo "* * * * * /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file  #添加每分钟设置任务
                    if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv' | wc -l)" -eq 1 ];then
                        check_crontab_result2="重启后设置任务此前已添加"
                        yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
                    else
                        check_crontab_result2="每分钟设置任务此前已添加但存在重复任务"
                        yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
                    fi
                fi
            else
                echo "* * * * * /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file  #添加每分钟设置任务
                if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
                    check_crontab_result2="每分钟设置任务添加成功"
                    yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
                else
                    check_crontab_result2="每分钟设置任务添加失败"
                    yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
                fi
            fi
        else
            #添加重启恢复任务
            echo "@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file  #添加重启设置任务
            if [ "$(cat $root_cron_file | grep '^@reboot sleep 5 && source /etc/profile && sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
                check_crontab_result1="重启后设置任务添加成功"
                yellow "重启后设置任务: "; green "$check_crontab_result1\n"
            else
                check_crontab_result1="重启后设置任务添加失败"
                yellow "重启后设置任务: "; red "$check_crontab_result1\n"
            fi

            #添加每分钟设置任务
            echo "* * * * * /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv" >> $root_cron_file  #添加每分钟设置任务
            if [ "$(cat $root_cron_file | grep '^\* \* \* \* \* /bin/sh /usr/local/scripts/fix_ovs_network.sh setup-csv')" != "" ];then
                check_crontab_result2="每分钟设置任务添加成功"
                yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
            else
                check_crontab_result2="每分钟设置任务添加失败"
                yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
            fi
        fi
        check_crontab_result="$check_crontab_result1;$check_crontab_result2"

        /sbin/service cron restart >> /dev/null 2>&1    #重启cron服务
    elif [ "$1" == "restore" -o "$1" == "restore-csv" ];then
        root_cron_file="/var/spool/cron/crontabs/root"

        if [ -f "$root_cron_file" ];then    #如果存在root的任务文件
            if [ "$(cat $root_cron_file | grep 'fix_ovs_network.sh')" != "" ];then     #如果已经存在fix_ovs_network.sh任务
                #删除所有fix_ovs_network.sh任务
                sed -i "/fix_ovs_network.sh/d" $root_cron_file
              
                #检查Iptables重启恢复任务是否删除
                if [ "$(cat $root_cron_file | grep '^@reboot*.*fix_ovs_network.sh')" == "" ];then
                    check_crontab_result1="重启后设置任务删除成功"
                    yellow "重启后设置任务: "; green "$check_crontab_result1\n"
                else
                    check_crontab_result1="重启后设置任务删除失败"
                    yellow "重启后设置任务: "; red "$check_crontab_result1\n"
                fi

                #检查每分钟设置任务是否删除
                if [ "$(cat $root_cron_file | grep '^*[[:space:]]*.*fix_ovs_network.sh')" == "" ];then
                    check_crontab_result2="每分钟设置任务删除成功"
                    yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
                else
                    check_crontab_result2="每分钟设置任务删除失败"
                    yellow "每分钟设置任务: "; red "$check_crontab_result2\n"
                fi
            else
                check_crontab_result1="重启后设置任务不存在"
                check_crontab_result2="每分钟设置任务不存在"
                yellow "重启后设置任务: "; green "$check_crontab_result1\n"
                yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
            fi
        else
            check_crontab_result1="重启后设置任务不存在"
            check_crontab_result2="每分钟设置任务不存在"
            yellow "重启后设置任务: "; green "$check_crontab_result1\n"
            yellow "每分钟设置任务: "; green "$check_crontab_result2\n"
        fi
        check_crontab_result="$check_crontab_result1;$check_crontab_result2"

        /sbin/service cron restart >> /dev/null 2>&1    #重启cron服务
    fi
}


#CSV格式结果显示程序
function show_csv_result(){
    check_ovs_result="$ipaddr,$system_name,$system_version,$check_phy_nic_name_result,$check_phy_nic_brand_result,$check_phy_nic_model_result,$check_phy_nic_status_result,$check_phy_nic_ip_result,$check_ovs_nic_result,$check_ovs_nic_ip_result,$check_upgrade_script_result,$check_crontab_result"
    echo check_ovs_result="$check_ovs_result"
}


#主程序
function main(){
    if [ "$1" == "check" -o "$1" == "setup" -o "$1" == "restore" ];then
        blue "飞牛OS有线OVS网卡IP丢失自动修复脚本 $version\n"
        echo

        #操作系统名称检测
        system_check

        #获取物理网卡名称
        check_phy_nic

        #ovs网卡设置程序
        configure_ovs $1 $phy_nic

        #更新脚本文件程序
        upgrade_script_file $1

        #设置任务计划程序
        config_crontab $1
    elif [ "$1" == "check-csv" -o "$1" == "setup-csv" -o "$1" == "restore-csv" ];then
        #服务器ip地址获取程序
        get_ip >> /dev/null 2>&1

        #操作系统名称检测
        system_check >> /dev/null 2>&1

        #获取物理网卡名称
        check_phy_nic >> /dev/null 2>&1

        #ovs网卡设置程序
        configure_ovs $1 $phy_nic >> /dev/null 2>&1

        #更新脚本文件程序
        upgrade_script_file $1 >> /dev/null 2>&1

        #设置任务计划程序
        config_crontab $1 >> /dev/null 2>&1

        #CSV格式结果显示程序
        show_csv_result
    fi
}


#帮助程序
function help(){
    green "用法: "; yellow "$0 ( check | check-csv | setup | setup-csv | restore | restore-csv )\n"
    green "举例:\n"
    yellow "$0 check                      ";green "#检查OVS网卡,检查IP设置,检查定时任务\n"
    yellow "$0 check-csv                  ";green "#检查OVS网卡,检查IP设置,检查定时任务,显示CSV格式信息\n"
    yellow "$0 setup                      ";green "#修复OVS网卡,设置IP到OVS网卡,添加定时任务\n"
    yellow "$0 setup-csv                  ";green "#修复OVS网卡,设置IP到OVS网卡,添加定时任务,显示CSV格式信息\n"
    yellow "$0 restore                    ";green "#删除OVS网卡,设置IP到物理网卡,删除定时任务\n"
    yellow "$0 restore-csv                ";green "#删除OVS网卡,设置IP到物理网卡,删除定时任务,显示CSV格式信息\n"
    echo
    exit
}


#必须由root启动
if [ $UID -ne 0 ];then
    red "请使用root用户运行此脚本!\n"
    echo check_ovs_result="请使用root用户运行此脚本"
    exit
fi

#检查输入的参数
if [ $# -ne 1 ];then
    red "脚本必须输入1个参数\n"
    echo
    help
    exit
elif [ "$1" == "check" -o "$1" == "check-csv" -o "$1" == "setup" -o "$1" == "setup-csv" -o "$1" == "restore" -o "$1" == "restore-csv" ];then
    main $1
else
    red "输入的参数错误"
    help
    exit
fi


使用说明:

1、把脚本文件上传到/tmp/文件夹

2、切换到root用户

3、给脚本添加执行权限

cd /tmp

chmod +x fix_ovs_network_v1.1.sh

4、查看程序帮助菜单,输入执行参数。

./fix_ovs_network_v1.1.sh #回车可查看帮助菜单

image.png

5、使用check和check-csv参数,可以检测当前的OVS网卡的IP设置和任务设置

./fix_ovs_network_v1.1.sh check

image.png

image.png

6、使用setup和setup-csv参数,可以修复OVS网卡,设置IP到OVS网卡,添加定时任务,如果检测没问题就不做任何修复操作。

image.png

7、使用restore和restore-csv参数,可以删除OVS网卡,设置IP到物理网卡,删除定时任务。

image.png

8、使用注意:在删除OVS网卡后,会导致虚拟机无法使用。如果使用setup参数再次设置OVS网卡后,最好重启下飞牛主机。

9、脚本可以自动检测物理网卡,但编写没有考虑存在多个物理网卡的情况,也没考虑使用无线网卡的情况,也没考虑使用多网卡聚合的情况,如果这种情况下也想使用脚本,可以在脚本里指定物理网卡名称,不过我没做测试。

10、脚本默认是给OVS网卡自动获取IP,如果想配置固定IP,可以在脚本里预设固定IP、掩码、网关和DNS服务器,缺了任何一项都会改成自动获取IP。

upload 附件:fix_ovs_network_v1.1.zip

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
感谢分享,1.1.20版本部署了,看看有没有效果  详情 回复
2026-3-13 22:27
1

查看全部评分

0

主题

4

回帖

0

牛值

江湖小虾

2026-3-13 22:27:29 显示全部楼层
荔枝壳 发表于 2026-3-13 19:31
为了实现自动检测物理网卡,自动检测OVS网卡,自动添加任务计划,我对脚本进行了功能升级。
#!/bin/bash
# ...

感谢分享,1.1.20版本部署了,看看有没有效果

3

主题

16

回帖

0

牛值

江湖小虾

2026-3-14 00:18:46 显示全部楼层

我想知道,如果新安装最新的系统,还会ip 失联吗?

2

主题

9

回帖

0

牛值

江湖小虾

2026-3-14 04:08:36 显示全部楼层
faba333 发表于 2026-3-11 09:45
IP地址获取方式设置为手动的话且路由器没有进行IP-MAC绑定,路由器重启后就会丢失IPV4地址,导致断联,希望 ...

不是这个的问题,我路由器搞了ip绑定,NAS里年前因为出过一次掉ip的情况,接显示器连上之后用dhclient enp1s0-ovs手动拿到了一个ip,后面设置的是DCHP,但是没有用,依旧断网掉ip,看了这个帖子才发现是ovs上面出bug了,用帖子里的指令把ovs关了,暂时不用虚拟机就好了

3

主题

8

回帖

0

牛值

江湖小虾

2026-3-14 11:30:34 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

这个方案的前提是你的飞牛os安装在你说的这台电脑上吧?
手机通过usb连接线插到飞牛机器上。  详情 回复
2026-3-14 11:53

3

主题

8

回帖

0

牛值

江湖小虾

2026-3-14 11:46:44 显示全部楼层

我也遇到一摸一样的问题,看来虚拟机没法玩了。还好我有6个网口,我又多插了一个网口

。但是好混乱,现在网口插多了,ipv6太多了,导致lucky自动获取的ipv6不对,内网穿透失效了。

0

主题

8

回帖

0

牛值

江湖小虾

2026-3-14 11:53:18 显示全部楼层
Gibson 发表于 2026-3-14 11:30
这个方案的前提是你的飞牛os安装在你说的这台电脑上吧?

手机通过usb连接线插到飞牛机器上。

0

主题

1

回帖

0

牛值

江湖小虾

2026-3-14 18:22:19 显示全部楼层

也碰到这个问题了,重新开关一下ovs似乎暂时没问题。。。

0

主题

4

回帖

0

牛值

江湖小虾

2026-3-14 22:02:54 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

非常感谢,终于能进系统关闭OVS。试了各种办法就是不行,差点就刷机了。

1

主题

1

回帖

0

牛值

江湖小虾

2026-3-15 17:43:40 显示全部楼层

重装了,哎

就算重装了,等下次ipv6地址触发刷新的话,还是会出现相同的bug。除非你有办法回滚到1.1.15之前的版本  详情 回复
2026-3-16 13:24

3

主题

8

回帖

0

牛值

江湖小虾

2026-3-16 13:24:27 显示全部楼层

就算重装了,等下次ipv6地址触发刷新的话,还是会出现相同的bug。除非你有办法回滚到1.1.15之前的版本

3

主题

8

回帖

0

牛值

江湖小虾

2026-3-16 13:48:55 显示全部楼层

image.png

如果有条件(你的nas设备有2个网口的话)的话,建议:

建议插两根网线,如图设置,网口3开启ovs专门给虚拟机桥接使用,网关/DNS都留空,不配置。

网口4正常配置,用于飞牛设备使用。

然后虚拟机内正常配置即可,虚拟机是使用的虚拟网卡桥接可以进虚拟机单独配置,不是走网口3物理网卡。

这样目前没啥问题,包括虚拟机的内网穿透,我试了都没有问题。

——这样就实现了飞牛nas和虚拟机的网络通过两个网口彻底分开了。

虽然是ovs的bug引发的这个问题,但是从网络隔离健壮性上来说,有条件的还是建议这样配置。一劳永逸了,后面再出问题容易排查到底是哪块的问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
家用不太现实,很少一个房间会预留两根网线的,要给飞牛插两根网线还得给他配一个交换机。  详情 回复
2026-3-16 14:08

1

主题

11

回帖

0

牛值

江湖小虾

飞牛百度网盘玩家

2026-3-16 14:08:14 显示全部楼层
Gibson 发表于 2026-3-16 13:48
如果有条件(你的nas设备有2个网口的话)的话,建议:
建议插两根网线,如图设置,网口3开启ovs专门给虚拟 ...

家用不太现实,很少一个房间会预留两根网线的,要给飞牛插两根网线还得给他配一个交换机。

7

主题

26

回帖

0

牛值

江湖小虾

2026-3-16 19:10:24 显示全部楼层

看来不是我一个人出现这个问题,折腾了一下午

📋 问题现象判断

先确认是否属于OVS导致的网络故障:

  • 之前能上网,开启OVS或重启后突然连不上
  • ip a 看到物理网卡(如 enp4s0)后面有 master xxx 字样
  • nmcli dev status 看到 ovs-systemxxx-ovs 设备状态异常
  • 能获取IP但无法上网(ping网关显示 Network is unreachable

🚑 第一阶段:紧急恢复网络(救命用)

步骤1:接上显示器键盘,直接登录系统

(SSH连不上时只能用本地终端)

步骤2:查看OVS网桥状态

sudo ovs-vsctl show

记下网桥名称(通常是 enpXs0-ovsovs-system

步骤3:删除OVS网桥(核心操作)

# 删除捣乱的OVS网桥(名字从上一步获取)
sudo ovs-vsctl del-br enp4s0-ovs

# 释放物理网卡
sudo ip link set enp4s0 nomaster

# 重启网络服务
sudo systemctl restart NetworkManager

步骤4:验证网络恢复

ip a                     # 看物理网卡是否独立
sudo ping 192.168.1.1    # 测试网关
sudo ping baidu.com       # 测试外网

网络恢复! 现在可以继续下面的永久修复。


🔒 第二阶段:永久修复(避免复发)

方案A:彻底关闭OVS(如果你不需要虚拟机)

在飞牛OS Web界面 → 网络设置 → 关闭OVS开关。最简单有效!

方案B:固定OVS网桥IP(如果你必须用OVS)

B1:找到OVS网桥配置文件

cd /etc/NetworkManager/system-connections/
ls -la | grep ovs

看到类似 enp4s0-ovs.nmconnection 的文件

B2:编辑配置文件,设置静态IP

sudo nano enp4s0-ovs.nmconnection

确保内容如下(和物理网卡一样的IP):

[connection]
id=enp4s0-ovs
type=ovs-bridge
interface-name=enp4s0-ovs
autoconnect=true

[ipv4]
method=manual
addresses=192.168.1.42/24    # 你的固定IP
gateway=192.168.1.1
dns=192.168.1.1;114.114.114.114;

B3:重启网络

sudo systemctl restart NetworkManager

方案C:路由器MAC绑定(双重保险)

登录路由器后台(192.168.1.1):

  • 找到“静态地址分配”或“DHCP绑定”
  • MAC地址:00:e0:4c:a6:33:9b(你网卡的MAC)
  • IP地址:192.168.1.42(你的固定IP)
  • 保存生效

📝 第三阶段:诊断工具箱(常用命令备忘)

网络状态查看

ip a                          # 查看所有接口IP
ip link show                   # 查看接口状态
ip route show                  # 查看路由表
nmcli dev status               # 查看NetworkManager设备状态
nmcli con show                 # 查看所有连接

OVS相关

sudo ovs-vsctl show            # 查看OVS网桥
sudo ovs-vsctl del-br <网桥名>  # 删除OVS网桥(救命神技)

网络测试

sudo ping 192.168.1.1          # 测试网关
sudo ping 114.114.114.114      # 测试外网IP
sudo ping baidu.com             # 测试DNS解析

配置文件位置

/etc/NetworkManager/system-connections/   # 所有网络连接配置
/etc/resolv.conf                          # DNS配置

⚠️ 预防措施清单

  • 开OVS前:先给主机设好静态IP
  • 开OVS后:立即检查 sudo ovs-vsctl show 确认网桥正常
  • 重启前:确保OVS网桥有静态IP配置
  • 路由器:做好MAC/IP绑定
  • 存好自救命令sudo ovs-vsctl del-br enp4s0-ovs

🆘 终极自救快捷命令

把这行命令保存到手机备忘录,断网时直接敲:

sudo ovs-vsctl del-br enp4s0-ovs && sudo systemctl restart NetworkManager

网卡设置固定ip路由器重启后还是会丢失ip  详情 回复
2026-3-16 21:30

1

主题

11

回帖

0

牛值

江湖小虾

飞牛百度网盘玩家

2026-3-16 21:30:58 显示全部楼层
William.Liew 发表于 2026-3-16 19:10
看来不是我一个人出现这个问题,折腾了一下午
📋 问题现象判断
先确认是否属于OVS导致的网络故障:

网卡设置固定ip路由器重启后还是会丢失ip

0

主题

1

回帖

0

牛值

江湖小虾

2026-3-17 18:02:45 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

非常感谢!!!!

4

主题

3

回帖

0

牛值

江湖小虾

2026-3-18 09:49:14 显示全部楼层

害我以为硬件坏了,在没有重新启动port的情况下,用 dhclient 获取到IP,也还是不通,试着重装系统才好

1

主题

19

回帖

0

牛值

江湖小虾

2026-3-18 10:29:17 显示全部楼层

1.png固定IP依旧回丢失

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个OVS功能有问题 用不到关闭最保险  详情 回复
2026-3-18 12:30

0

主题

12

回帖

0

牛值

江湖小虾

2026-3-18 12:30:56 显示全部楼层
ajax 发表于 2026-3-18 10:29
固定IP依旧回丢失

这个OVS功能有问题  用不到关闭最保险

0

主题

12

回帖

0

牛值

江湖小虾

2026-3-18 12:34:43 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

目前看反馈就是OVS功能有问题,我这个方法适用于想简单快速解决问题的,因为可以直接进飞牛APP和网页直接操作,不用敲代码

0

主题

3

回帖

0

牛值

江湖小虾

2026-3-18 13:41:57 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

今天早上设备突然失联了,折腾半天没解决,最后还是按照你这个方法解决了问题。
有用就行 官方的方法对大部分来说还是麻烦,我这个比较通用  详情 回复
2026-3-23 13:40

0

主题

3

回帖

0

牛值

江湖小虾

2026-3-18 13:43:59 显示全部楼层

就是OVS有问题,概率导致设备失联,上级路由器里能看到飞牛的IP地址,但是无法访问,官方抓紧时间修复

这个问题吧。

1

主题

5

回帖

0

牛值

江湖小虾

2026-3-18 19:57:00 显示全部楼层

我第二次遇见这个问题了,也是飞牛的虚拟机装的istoreos软路由,只能进istoreos软路由,用IP扫也只能扫到软路由,第一次直接重装了系统,又重装了软路由,结果第3天又出现这种情况了。还好上论坛看了这文,不然又要重装系统了。

早点修复这个BUG吧,不然我们这种单网口就玩不了虚拟机了!

0

主题

4

回帖

0

牛值

江湖小虾

2026-3-18 23:24:28 显示全部楼层

针对OVS网卡的问题,发现开启OVS网卡后,存在运行一段时间后OVS网卡自动丢失IP设置,或者OVS网卡显示有IP但实际上已经失效的情况。针对第二种现象,添加了自动ping测试网关和外网 域名的功能,判断OVS网卡的IP是否真实有效,发现无效就自动删除重置OVS网卡的IP。

#V1.2更新
#1、增加检测网络是否通畅的功能,判断能否ping通网关,能否ping通外网
#2、增加OVS网卡有IP,但判断网络不通后,自动删除IP重置的功能
#3、修复任务计划里的bug,把/bin/sh换成/bin/bash --20260326

image.png

upload 附件:fix_ovs_network_v1.2.zip

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
需要使用虚拟机。你这个可以固定IP来使用吗?  详情 回复
2026-4-7 11:26

1

主题

9

回帖

0

牛值

江湖小虾

2026-3-19 23:55:28 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

今天我这的个问题折腾大半天,最后重装系统,才解决,吓得虚拟机都不敢开了
应该就是OVS这个功能的问题 我关闭了这段时间都没出问题  详情 回复
2026-3-23 13:41

0

主题

1

回帖

0

牛值

江湖小虾

2026-3-20 00:13:24 显示全部楼层

单网口小主机 同样的问题 最后插了usb网卡 进web关闭ovs才解决问题。

希望1.24版本能彻底解决这个bug

0

主题

1

回帖

0

牛值

江湖小虾

2026-3-20 10:32:19 显示全部楼层
就是OVS有问题 应该是 ovs  docker 主机网络混乱 绑定在 ovs下的主机获取ip失败 虚拟机成功获取 

0

主题

3

回帖

0

牛值

江湖小虾

2026-3-20 15:18:51 显示全部楼层

我是飞牛系统突然断 电重启后发现的这个问题,我的解决方案是用另一个网口连接飞牛,关闭网口的OVS,重启一下,就好了,再打开OVS也没问题。后来研究了一下,重启的时候,延时10s启动OVS,后续就没再发生这个问题。

下面是方法:

通过SSH登录飞牛(如果当前无法SSH,接一台显示器或者用另一个网口登录),创建并启用一个延时服务:

sudo -i
nano /etc/systemd/system/restart-ovs.service

将以下内容粘贴进去:

[Unit]
Description=Restart Open vSwitch After Boot
After=network.target openvswitch-switch.service

[Service]
Type=oneshot
ExecStartPre=/bin/sleep 10
ExecStart=/bin/systemctl restart openvswitch-switch.service

[Install]
WantedBy=multi-user.target

保存后执行:

systemctl enable restart-ovs.service
reboot

此方法能让OVS在系统启动后延迟10秒重启,避免启动冲突。

确实需要使用虚拟机。你这个方法有效吗?怎么没看到人使用效果回复?  详情 回复
2026-4-7 11:25

0

主题

1

回帖

0

牛值

江湖小虾

2026-3-21 20:08:17 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

**兄弟,我折腾一整天了看到你的方法两分钟解决,感谢
嘿嘿 不客气 敲代码很多人还是不熟悉  详情 回复
2026-3-23 13:44

3

主题

6

回帖

0

牛值

江湖小虾

2026-3-22 23:53:06 显示全部楼层
FnWen 发表于 2026-3-12 14:07
提供一个修复方法,不用敲命令(自己测试修复成功);手机用数据线连接电脑,然后打开个人热点里的(USB网 ...

就差重装系统了,周末两天都在搞这个,Gpt和Gemini都问完了,无数方法试了,差点人崩溃
嘿嘿 我方法最主要是方便,重装肯定能解决  详情 回复
2026-3-23 13:42
12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则