断电导致软路由重启问题解决方法
声明:该方法是治标不治本,因为openwrt 软路由文件系统可能由于高负荷工作时断电,发生文件损坏,修复并不完善。细节会在文档中说明。
[toc]
1. 原因排查(不必执行该目录下的命令):
-
事件原因:软路由运行时突然断电,可能导致文件系统部分文件损坏,虽然使用fsck 修复,但是可能部分关于网卡自启动的命令存在问题,导致软路由无法启动虚拟机。
-
排查经过(硬件部分):
- 公司整体网络局域网无连接,考虑运营商的问题,笔记本网卡接光猫,但没网( 因为光猫不具有拨号功能,当时未考虑宽带拨号问题 )。
- 由于公司 2条宽带,一条公网IP专线,公网专线接的故障这边的局域网。另一条宽带能联网,而且电信给的回复这边网络没问题,因此 考虑是本地设置的问题。
- 考虑到网络结构中总有一个网络设备负责拨号上网,因此使用 笔记本接光猫并拨号,测试能上网(确定是拨号设备故障导致连不了网)。
- 误会电信那边人员,我当时以为软路由是电信那边帮忙安装的。而且电信技术员理解错了,以为我询问的是专线路由器(所以导致了乌龙)。
- 使用TP-Link 路由器接光猫并拨号,先临时让网络正常运转。随后处理OpenWrt 软路由( 此时原因已确定,就剩下一步一步排错并解决 )。
-
排查经过(软件部分):
-
软路由接HDMI,发现是Proxmox 的虚拟机,内核启动之后加载文件系统出现报错( 如下 )
允许文件系统检查,查找半天的原因解决方案
# 执行命令无效,(因为根本就不是下面的命令) fsck -p /dev/nvme0 umount /dev/nvme0 # 我此时以为是根文件系统挂载的问题,(并不是,而是它提示的路径/dev/mapper/pve-root 文件系统故障) # 需要执行,一路按Y 或者加-y fsck /dev/mapper/pve-root -y
-
之后重启可能会遇到问题,多试几次,如果是文件系统问题,还是依照上方的解决步骤来
-
进入到登录界面,此时你以为万事大吉了( 并没有 )?后续排错才刚开始。
# 1.试着网线直插openwrt,将电脑网卡设置为固定IP,亦或者DHCP 进行尝试。 # 2.登录下面的proxmox 管理地址。但是并进不去,此时也不知道proxmox 密码!!! # 3.因为不知道密码,所以根本不了解proxmox 后面藏着什么精灵古怪
-
由于不知道密码,并尝试了很多密码都无法成功登录,因此需要重置Linux 密码
- 在下图的引导界面,按 E进入引导配置界面
- 在引导配置界面中划到最下面,并修改下图部分的引导配置为 init=/bin/sh( 注意看~:这里的/dev/mapper/pve-root 是不是很眼熟? )
- 按Ctrl+X 启动系统,并输入
mount -o remount rw /
然后再输入passwd
之后就设置新密码了!!
- 重启 reboot now ,或者断电重启也行。这样就可以用新密码进入proxmox 了
-
进入proxmox 之后,发现,连不上网,于是修改IP和网关和当前电脑同一网段一致,并修改proxmox web 管理界面地址
# 修改IP 地址为当前网段 nano /etc/network/interfaces # 查看IP 信息 ip addr # 测试网络连接 service networking restart # 重启网卡 ping 192.168.100.1 # 当时设置的网关地址。 # 修改WEB 页面地址 nano /etc/issue nano /etc/hosts # 只改IP 不改其它。 # 测试通过之后访问 https://192.168.100.x:8006
-
进入之后发现 OpenWrt 虚拟机并没有启动。( 而且每次重启之后必须执行
service networking start
启动网卡,而且Proxmox 也报错,网卡桥接无设备,导致OpenWrt 虚拟机无法启动 )因此已确定问题点。剩下就慢慢折腾。
-
进入OpenWrt 路径中的文件vim /etc/config/network
可以看出,这边使用了2个网卡,一条作为网关192.168.2.1,一条为pppoe拨号上网( 下方宽带信息已隐匿 ),我们并不修改它,只是作为参考,初步了解这边的数据收发形式。
-
根据Proxmox 的桥接信息,确定网卡如何连接
- openwrt 的网络设备
- PVE 网络信息
此时: vmbr0 就是openwrt 中的
lan
,vmbr2 就是openwrt 中的WAN
也就是,目前调试的网线那根口接光猫,另外的口接外部交换机。
-
目前可以将软路由放在机房进行测试了。
# 调试技巧: 1. 使用TP-Link路由器 作为调试工具 将TP-Link 的局域网IP 设置为192.168.2.22/24 网段, Openwrt 插上显示屏,在局域网中先进入proxmox 启动Openwrt 虚拟机。 将之前改过的PVE 地址复原,IP 地址 192.168.2.210 2. 由于OpenWrt没改动,但是连不上网,我也怀疑openWrt 的网卡没启动。。。。 因此,在OpenWrt 控制台输入 systemctl restart network # 如果不行就改为 networking 或者 service network restart 3. 然后proxmox 掉线(但是),可能是openwrt 接管了网卡。 怀疑成功了。手贱接了屏幕,在proxmox 的DOS 界面Ping 192.168.2.1,没想到成功了。 此时已经修复。治标不治本,但是能用。 vmbr2 口接回交换机。此时网络已经可以正常使用了,VPN 工作正常。
-
2. 修复命令( 断电重启必定遇到该问题,应急使用 )
openwrt 接显示器,在机房操作,确保等会不会挪动电源。 && 启动 openwrt 虚拟机
-
vmbr0 也就是靠近电源DC口的那个网口插TP-link (下图绿色标注) ,同时笔记本连接上TP-link 的WIFI,进入管理界面,修改IP网段为 192.168.2.22/24 ( 22作为局域网网关地址,确保能进proxmox web 页面 )
-
修复文件系统( 如果有提示的话 )
# 修复登录文件系统 如果提示 /dev/mapper/pve-root 如果提示其它,就该地址就行 fsck /dev/mapper/pve-root -y
-
如果忘记root 密码,那就看前面的密码重置部分
-
在proxmox 的Shell 中执行网卡启动。
# 启动软路由的网卡 service networking start # 测试网络是否能和网关连接 ping 192.168.2.22
-
进入web 管理界面 https://192.168.2.210:8006 启动虚拟机
-
在web 管理界面,进入虚拟机启动/重启网卡。
# 命令不太确定,挨个试,只要试着能让web 页面掉线就行(掉线意味着 openwrt 接管了网卡) systemctl restart network systemctl start network systemctl restart networking service network restart service network start service networking restart
-
网络断掉之后,在HDMI 屏幕中查看ping 192.168.2.1 自身网卡是否能通,能通,说明openwrt 起作用,就可以 将TP-Link 的网线插回交换机。另外 接光猫的网线也应当能正常拨号上网了。
-
修复完成
3. 后续改进
-
该方案治标不治本
暂时没想好解决办法:不能确保 proxmox 完全能进去,如果内核启动卡住,多试着重启2次。
-
proxmox 启动网卡的部分,可以做成 sh 脚本,开机自动执行,目前暂不测试,提前写好脚本下次遇到再测试,因为开关机影响范围较大。
-
因为openwrt 虚拟机桥接proxmox 网卡,只有proxmox 网卡启动了才能自动启动openwrt
设置虚拟机启动延时,保证网卡先启动
-
治本:目前已将openwrt 虚拟机做成备份,如果下次需要使用,可以试着重装proxmox 并导入备份虚拟机。因为之前没做过,所以这次暂时先不处理
备份信息截图:
虚拟机部分(虚拟基硬件部分)
宿主机部分(网桥部分)
4. 注意细节
-
文件系统的修复,我当时可能尝试了几次,多试试没问题
-
密码的重置,在这个界面选择你要启动的系统进行重置。。。光标不要移到第二个。
-
宽带问题,先拨号上网测试,拨号通过,说明是本地设备问题。
-
进入proxmox 要先启动网卡之后,才能连web 界面,这也是为什么要用显示器的原因
5. 密码信息
后续处理
方法1🙁 目前使用的该方法 )
-
由于又一次软路由虚拟机的问题导致设备宕机,所以不得不提上日程,先使用命令来让设备开机之后自启动网卡。配置如下
# 设置系统自启动, nano /usr/lib/systemd/system/restart-network.service # 在该启动设置页面添加下方的启动配置文件。 ########################## [Unit] Description=Restart Networking service After=network.target syslog.target Wants=network.target # 希望在网络初始化好了之后再执行下方命令 [Service] Type=oneshot # 单次执行 ExecStart=/bin/bash -c "/bin/sleep 20 && service networking stop && /bin/sleep 10 && service networking start" # 所执行命令,20s 后停止网络服务 10s 之后再开启网络服务 [Install] WantedBy=multi-user.target ########################### # 将上方服务添加至systemctl 并开机自启动 systemctl enable restart-network.service # 如果有修改,请重新加载服务 systemctl daemon-reload # 测试服务的正常使用( 实际修改的时候请勿使用该命令,不然同事的网会断开,我在虚拟机测好了就不用在实体机测试了 ) systemctl start restart-network.service # 可以进行重启测试。
-
由于prxmox 的web 界面的开机启动延时并不能设置第一个虚拟机启动的延时。
( web 界面的 启动/关机顺序 是依据不同顺序的间隔来启动的。而不是第一个虚拟机启动的延时 )
因此需要修改别的地方:
我使用的是方法1:
# 设置第一个虚拟机启动延时为3分钟。(足够网络等方面初始化完毕了) pvenode config set --startall-onboot-delay 180 # 该命令的说明: --startall-onboot-delay
(0 - 300) ( default = 0 ) Initial delay in seconds, before starting all the Virtual Guests with on-boot enabled.
此时如果公司软路由断电重启应该正常,除非高负载情况下断电破坏根文件系统。