断网恢复预案(OpenWrt 旁路由改造 · 前置)¶
用途:在执行「宿主机切 networkd + 建 br0 网桥」这类网络变更时,若发生失联,按本文件在本地控制台逐步恢复。 存放位置:
handover/openwrt_bypass/recovery-plan.md(建议同时存一份到手机/打印) 生效前提:变更前必须先执行第 1 章的备份步骤,否则本预案第 3 章失效。
0. 一句话原则¶
别慌、别重启、先从 .250(eno2)绕进来;绕不进就在本地控制台还原备份。
1. 事前准备(变更前必须先做,否则预案失效)¶
# 1) 备份全部 netplan 配置到固定路径(固定路径便于失联时盲敲)
sudo rm -rf /root/net-backup
sudo mkdir -p /root/net-backup
sudo cp -av /etc/netplan/. /root/net-backup/
# 2) 记录变更前状态,恢复时用于对照
sudo ip -br addr | sudo tee /root/net-backup/state-before.txt
sudo ip route | sudo tee -a /root/net-backup/state-before.txt
sudo ss -tnp state established 2>/dev/null | sudo tee -a /root/net-backup/state-before.txt
# 3) 确认备份落地
sudo ls -l /root/net-backup/
预期:/root/net-backup/ 下能看到 01-network-manager-all.yaml、50-cloud-init.yaml、99-static-ips.yaml 与 state-before.txt。
变更前状态基线(本次改造前实测,恢复时对照用):
| 网卡 | 地址 | 说明 |
|---|---|---|
| eno1 | 192.168.31.249/24 | 默认路由所在 |
| eno2 | 192.168.31.250/24 | SSH 入口,全程不动 |
| eno3 | 192.168.31.251/24 | 备用 |
| 默认路由 | default via 192.168.31.1 dev eno1 |
2. 哪些操作会导致失联¶
| 操作 | 失联风险 | 原因 |
|---|---|---|
| 把 eno1 加入 br0 并迁移 IP | 高 | 默认路由所在口被重建,中间有瞬断 |
| 把 netplan 渲染器从 NetworkManager 改为 networkd | 中高 | NM 撒手、networkd 接管的过程若配置有误,网就没了 |
| 误动 eno2 | 高 | 你的 SSH 正走 .250 |
| 改小米路由 / 关 OpenWrt | 低 | 不影响宿主管路 |
3. 失联后的时间线(先等,别急着动手)¶
| 时间 | 该做什么 |
|---|---|
| 0–2 分钟 | 什么都别做。若用的是 netplan try,120 秒不确认会自动回滚 |
| 2–5 分钟 | 继续等。变更前挂的 at 定时还原任务会在 5 分钟时自动执行 |
| 5 分钟后仍不通 | 走第 5 章,进本地控制台手工恢复 |
这两道自动回滚是"双保险"。先给它们机会,别一断就冲去改配置,否则会和自动还原打架。
4. 进本地控制台¶
你实连宿主很方便,两条路:
- 图形界面:直接登录
rain,打开终端(Terminal) - 文本控制台:
Ctrl + Alt + F3切到 TTY,用rain登录;回图形界面用Ctrl + Alt + F1(或 F2)
登录后第一件事是看状态,不是改配置:
ip -br addr
ip route
sudo netplan --debug get # 看 netplan 实际生成的配置
5. 分级恢复手段(按顺序尝试,命中即停)¶
5.1 还原 netplan 备份(首选)¶
sudo cp -av /root/net-backup/. /etc/netplan/
sudo netplan apply
sleep 3
ip -br addr
ip route | grep default
ping -c2 192.168.31.1
预期:192.168.31.249 回到 eno1,默认路由恢复。
5.2 手工拉临时网络(netplan 也不管用时的兜底)¶
此方式不改配置文件,纯内存生效,重启即消失;用于先把网络救回来,再从容排查。
# 情况 A:桥没建起来,把 IP 抢回物理口
sudo ip link set eno1 up
sudo ip addr flush dev eno1
sudo ip addr add 192.168.31.249/24 dev eno1
sudo ip route replace default via 192.168.31.1 dev eno1
# 情况 B:桥建起来了但 IP 没配上,把 IP 配到桥上
sudo ip link set br0 up
sudo ip addr flush dev br0
sudo ip addr add 192.168.31.249/24 dev br0
sudo ip route replace default via 192.168.31.1 dev br0
验证:
ping -c2 192.168.31.1
ip -br addr
5.3 渲染器(networkd)回退¶
若怀疑是"切 networkd"导致的问题:先还原配置文件(renderer 回到 NetworkManager),再 apply。不要反过来先停服务。
sudo cp -av /root/net-backup/. /etc/netplan/
sudo systemctl enable --now NetworkManager
sudo netplan apply
sleep 3
ping -c2 192.168.31.1
若确认要彻底退回原渲染器:
sudo systemctl disable --now systemd-networkd
sudo netplan apply
5.4 从 eno2 绕进来(不碰控制台的办法)¶
eno2 全程未动,只要它还有链路,就能用 .250 连:
ssh rain@192.168.31.250
注意:这是从 Win/其它设备发起的连接,不是宿主机上执行。
6. 诊断命令(恢复不顺时用)¶
sudo netplan --debug apply # 看 netplan 报错
networkctl status # networkd 视角
networkctl list
sudo bridge link show # 桥端口状态
ip -br addr && ip route
journalctl -u systemd-networkd -n 50 --no-pager
journalctl -u NetworkManager -n 50 --no-pager
sudo systemctl status systemd-networkd NetworkManager --no-pager | head -40
7. 恢复确认¶
ping -c2 192.168.31.1 # 网关通
ip -br addr show eno1 ; ip -br addr show eno2 # .249 / .250 都在
ip route | grep default # 默认路由存在
从 Win 侧再验一次:
ssh rain@192.168.31.250 # eno2 兜底口通
ssh rain@192.168.31.249 # 主口通(若已恢复)
8. 严禁动作¶
| ❌ 禁止 | 原因 |
|---|---|
失联时 sudo reboot |
配置是错的,重启只会更糟、且可能连本地控制台都要重来一遍 |
rm -rf /etc/netplan |
备份之外的兜底配置也会丢 |
| 失联时顺手改 eno2 | 那是你唯一的远程退路 |
不备份就 netplan apply |
本预案第 5 章直接失效 |
| 在自动回滚窗口内反复改配置 | 会和 at / netplan try 的还原动作互相打架 |
9. 一键恢复块(可直接整段粘贴到本地控制台)¶
# ===== 恢复到变更前状态(幂等,可反复执行)=====
set -x
sudo cp -av /root/net-backup/. /etc/netplan/
sudo netplan apply
sleep 3
ip -br addr
ip route | grep default
ping -c2 192.168.31.1
10. 最坏情况:连本地控制台都进不去¶
- 用 iDRAC 虚拟控制台(
192.168.0.120)—— ⚠️ 当前该地址不可达(你的网段在192.168.31.0/24,iDRAC 在192.168.0.0/24,不同二层)。改造前若需它兜底,得先想办法恢复对它的访问; - 接显示器键盘直连(你已确认可行);
- 进 GRUB 编辑内核参数加
systemd.unit=multi-user.target或单用户模式init=/bin/bash,手工把网卡拉起(最后手段,需谨慎)。
来源:
/home/rain/Documents/kvm/openwrt_bypass/recovery-plan.md| 最后更新:2026-09-15 01:05(由build/sync.py同步,请勿在站点侧修改)