fnOS升级后有线网口失联

防坑指南:fnOS/Docker 宿主升级换内核后「有线网口失联、备用口正常」(OVS 内部端口丢失)
适用场景:宿主通过 Open vSwitch 桥接物理网口(有线 IP 配在 OVS internal 口上), 系统升级/换内核重启后,有线 IP 完全不通,但另一张网卡(WiFi/备用口)的管理页和 SSH 一切正常。本文以飞牛 fnOS 为例,适用于任何同构环境。 全部命令与输出均来自真实故障的定位与修复过程,可直接照抄执行。
1. 症状(对照自查)
| 现象 | 判据 |
|---|---|
| 有线 IP 完全不通 | ping 100% 丢包、SSH 全端口超时、连 TCP SYN 都没有回应 |
| 备用口/WiFi 侧一切正常 | 管理页可打开、SSH 可登录、延迟正常(同机房 1~2ms) |
| 「时好时坏/像断连」 | 双默认路由下,出方向流量仍优先走死掉的有线路由 |
| 本机自查:网关 ARP 解析不到 | ip neigh show 里网关为 INCOMPLETE |
| 重启无效 | 重启后依然不通(问题出在启动流程,不在运行态) |
2. 快速定位(5 分钟五步走)
第 1 步:确认物理链路没坏
1 | cat /sys/class/net/<有线口>/carrier # 应为 1(有载波) |
载波=1、无错误计数 → 网线/交换机/网卡硬件没问题,问题在软件层,继续往下。
第 2 步:排除防火墙(很多人第一反应是防火墙,先排除掉)
1 | sudo iptables -S | head -25 |
判据:INPUT 链 policy 为 ACCEPT、且没有针对本机端口的 DROP/REJECT 规则 (若宿主跑了 Docker,只会看到 DOCKER 系列的 NAT/桥接规则——那是正常的,不拦 INPUT)。 本文案例的规则集里只有 Docker 标准规则,INPUT ACCEPT → 排除防火墙。
第 3 步:看网关 ARP(关键证据)
1 | ip neigh show | grep '<有线网关IP>' |
问题案例的实际输出:
1 | <网关IP> dev <有线口>-ovs INCOMPLETE |
网关 ARP 为 INCOMPLETE —— 物理口有载波却连二层都通不了, 说明包根本没从接口发出去/进来。这是「OVS 数据面丢端口」的典型信号。
第 4 步:检查 OVS 数据面(实锤)
1 | sudo ovs-dpctl show |
问题案例的实际输出:
1 | system@ovs-system: |
两个异常一目了然:
- 端口列表里只有物理口,没有 internal 口(本应同时有
port N: <物理口>和port M: <有线口>-ovs (internal)); missed/lost计数暴涨(18 万+)——物理口收到的包没有去处,直接丢。
第 5 步:对照 OVSDB 配置与守护进程
1 | sudo ovs-vsctl show # OVSDB 里的配置(桥和端口都在,看起来"正常") |
问题案例:ovs-vsctl show 里桥和端口配置齐全、ovsdb-server/ovs-vswitchd 进程也在、服务显示 active——配置没丢,是数据面没有随新内核正确重建。
3. 根因
宿主(fnOS)系统更新触发换内核并重启后:
- OVS 内核数据面(
ovs-system)在新内核上重建; - 重建时只挂回了物理口,internal 口(有线 IP 所在的口)没有重新挂进数据面;
- OVSDB 配置还在,所以
ovs-vsctl show看起来一切正常; - 于是「配置正常、数据面缺端口」——有线口收到的包全部
missed → lost,有线 IP 完全失联;备用口不受影响。
触发条件:fnOS 升级 → 换内核版本 → 重启。重启一次未自愈, 再重启一次也未自愈(两次实测),说明是升级遗留的确定性问题, 等待官方修复前需手工恢复。
4. 修复(一条命令)
1 | sudo systemctl restart openvswitch-switch |
重启服务后 ovs-vswitchd 会把 internal 口重新挂进数据面。验证:
1 | sudo ovs-dpctl show | grep -aE 'port|flows' |
实测:执行后 ARP 立即 REACHABLE,外部 ping/SSH 秒恢复。
5. 若重启服务后仍不通——检查 seed/内部口状态
如果 ovs-dpctl show 里 internal 口依旧缺失,或数据面反复异常:
1 | # 把 OVS 数据面彻底清掉重建(会闪断一次该桥上所有端口,数秒恢复) |
再不行,检查 fnOS 自身的网络管理服务是否正常 (fnOS 用 NetworkManager + dispatcher 管理 OVS 接口, journalctl | grep -aiE 'ovs|dispatcher' 可看启动期是否报错), 必要时在 fnOS 网页管理端「网络」里对该接口做一次「重新配置/重连」。
6. 防复发与应急
- 应急入口:给宿主保留第二张网卡(WiFi/USB 网卡均可,DHCP 即可)。 有线挂掉时,备用口的管理页/SSH 就是唯一入口——没有它只能接显示器键盘。
- 每次换内核重启后,先
ping <网关>验证有线口,不通就执行第 4 节命令。 - 双默认路由的坑:有线与备用口各有一条默认路由时, 有线路由优先级更高(无 metric 默认最优先)。有线坏了以后系统仍优先走死路由, 这就是「时好时坏」的来源;需要时可在有线恢复后
ip route del default via <有线网关> dev <有线口>(重启失效,仅临时缓解)。 - 向系统厂商反馈:升级换内核后 OVS 数据面未重新挂载 internal 口, 属于其网络服务在换内核场景下的缺陷。
7. 同宿主上连环踩到的其他坑(简要索引)
在同一台机器排查期间还确认了以下独立问题,详细过程见同目录其他文档:
| 坑 | 报错/现象 | 一句话解法 |
|---|---|---|
| 旧版 Oracle 镜像(10g/11g)在新内核上启动即段错误 | 容器 Exited(139),连 /bin/bash 都崩 |
userspace 与新内核 vsyscall 不兼容;换新内核宿主或加 vsyscall=emulate 启动参数 |
| schema1 老镜像 Docker 28 拒绝拉取 | Docker Image Format v1 ... support has been removed |
skopeo copy docker://… docker-archive:… 转格式后再 docker load;skopeo 临时文件默认写 /var/tmp,小系统盘会被写满——临时 mount --bind <大盘目录> /var/tmp 或清理后重试 |
| 手工建 Oracle CDB 后 PDB 字典不全 | ORA-06553: PLS-213: package STANDARD not accessible |
CDB 必须在 PDB$SEED 里也补跑 catalog/catproc(close→open read write→跑脚本→close),并清干净残留会话与 IPC,否则死锁 ORA-04020 |
| 手工建 Oracle 用 MEMORY_TARGET 失败 | ORA-00845: MEMORY_TARGET not supported on this system |
Docker 默认 /dev/shm 64M 太小;pfile 改用 sga_target/pga_aggregate_target |
| mysqladmin ping 密码错误也返回 alive | healthcheck 误判就绪 | 判断就绪要用真实查询 mysql -u… -p… -e 'SELECT 1' |
8. 版本与证据时间线
| 时间 | 事件 |
|---|---|
| D-1 | 全部业务经有线 IP 正常运行数日 |
| D0 02:30 | fnOS 更新重启,内核 c1126 → c1186;有线 IP 开始失联 |
| D0/D1 09:26 | 再次重启,未自愈 |
| D1 | 经备用口定位 → 重启 openvswitch-switch → 恢复 |