远程重启与兜底恢复:智能插座、通电自启和 WOL 尝试

2024 年 6 月 9 日 星期日(已编辑)
/ , , , ,
24
摘要
远程恢复最终靠智能插座 + BIOS 通电自启:系统卡死时远程断电再上电,机器自动开机,NetworkManager 和 Docker 服务自动恢复。WOL、路由器 SSH 和魔术包也能跑通,但维护成本更高,作为尝试记录保留。

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

远程重启与兜底恢复:智能插座、通电自启和 WOL 尝试

编写时间:2024-06-09

服务跑起来以后,我开始反过来想一个更现实的问题:人在外面,机器坏了怎么办?管理入口本身已经放在 Cloudflare Application / Zero Trust 后面,能进后台时可以 SSH、看日志、重启容器;真正麻烦的是系统卡死、机器断电、网络恢复后机器没有自动回来。

最后最实用的远程恢复方案不是 Wake On LAN,而是智能插座 + BIOS 通电自启:需要重启时远程断电再上电,机器来电后自动开机,系统联网,Docker 服务自动拉起。WOL 和路由器 SSH 发送魔术包是有效尝试,但链路更折腾,适合记录,不适合作为主方案。

故障恢复层级

层级工具解决的问题
应用层Docker restart、Portainer、日志单个服务崩溃
管理入口Cloudflare Application / Zero Trust异地安全进入管理页面
电源层智能插座 + BIOS 通电自启系统卡死、远程强制重启
网络层软路由自动拨号、DHCP 绑定断电恢复后自动回网
尝试分支WOL、路由器 SSH、魔术包远程开机,但维护成本高

这套兜底链路的目标很直接:家里恢复供电后,软路由能拨号,服务器能拿到 IP,Docker 能自动起来;系统卡死时,能通过智能插座做一次硬重启。

通电自启

通电自启要分几层看:

设备配置
软路由断电恢复后自动拨号、自动 DHCP
All-in-One 服务器BIOS 开启 AC Power Recovery
智能插座远程断电再上电
Docker 服务restart: unless-stopped

这条链路是最后真正长期可用的方案。它不优雅,但足够直接:只要智能插座还能控制电源,机器就可以被强制重启;只要 BIOS 设置正确,重新上电后会自动开机。

NetworkManager 侧保证开机自动联网:

sudo systemctl enable NetworkManager
sudo systemctl start NetworkManager
nmcli device
nmcli con mod "[connection-name]" ipv4.method auto
nmcli con mod "[connection-name]" connection.autoconnect yes

如果某些网卡在路由器重启后不会自动恢复,可以加一个轻量重连服务。脚本模板:

#!/usr/bin/env bash

INTERFACE="[interface]"
TARGET="1.1.1.1"

if ! ping -c 3 "$TARGET" >/dev/null 2>&1; then
  nmcli device disconnect "$INTERFACE"
  sleep 3
  nmcli device connect "$INTERFACE"
fi

配合 systemd timer 定期执行即可。它不解决所有网络问题,但可以覆盖“网关恢复后宿主机连接状态没刷新”的小故障。

Wake On LAN 尝试

WOL 需要 BIOS、网卡和局域网发送端配合。

  1. BIOS 开启 Wake On LAN;
  2. Linux 确认网卡支持魔术包;
  3. 软路由、服务器或另一台在线设备负责发送魔术包。
sudo dnf install ethtool -y
ethtool "[interface]"
sudo ethtool -s "[interface]" wol g

为了开机后自动设置 WOL,可以写 systemd 服务:

[Unit]
Description=Enable Wake On LAN

[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -s [interface] wol g
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable wol.service

同一局域网里直接发魔术包即可:

wol [target-mac-address]

真正麻烦的是异地触发。理论上可以先进某个受控入口,再让局域网里的设备发包;也可以让路由器开 SSH 后承担发送端。能做,但每一层都多一个维护点。

路由器 SSH + WOL

路由器 SSH 作为发送端是一个有效尝试。路径大概是:

脚本只保留模板:

#!/usr/bin/env sh

TARGET_MAC="[target-mac-address]"
TARGET_BROADCAST="192.168.10.255"

etherwake -b -i br-lan "$TARGET_MAC"

这条路可以跑通,但对路由器固件、SSH 持久化、工具安装、权限和网络环境都有要求。作为折腾记录可以保留;作为日常远程重启方案,智能插座更简单。

SSH 免密

日常维护不应该依赖密码登录。客户端生成密钥,服务器只收公钥。

ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\homelab"

上传公钥模板:

Get-Content "$env:USERPROFILE\.ssh\homelab.pub" |
  ssh "[user]@[server]" "mkdir -p ~/.ssh; cat >> ~/.ssh/authorized_keys"

服务器创建管理员用户:

sudo adduser [user]
sudo usermod -aG wheel [user]

是否配置 sudo 免密要谨慎。如果配置,至少保证 SSH 只允许密钥登录,并且管理入口不直接裸露公网。

[user] ALL=(ALL) NOPASSWD: ALL

Cloudflare SSH 与 Web 管理

管理入口主要放在 Cloudflare Application / Zero Trust 后面。Cockpit、NPM 管理面板、SSH Web 这类服务都可以通过 Tunnel 接进来,再由 Access 做身份验证。

本地 SSH 客户端也可以通过 cloudflared 代理,但这类配置更依赖客户端环境。能用 Web 管理时,优先把入口收在 Access 后面,少暴露端口。

开机自动登录

无图形界面的服务器一般不需要自动登录。只有在特殊硬件、脚本或调试流程依赖 TTY 登录状态时才考虑。

[Service]
ExecStart=
ExecStart=-/usr/sbin/agetty --autologin [user] --noclear %I 38400 linux

这会绕过认证,风险很高,只适合物理环境可信、机器不暴露的场景。

维护命令

docker ps
docker logs [container] --tail 100
docker compose pull
docker compose up -d
systemctl status cloudflared

备份也要纳入维护:

tar czf homelab-compose-$(date +%Y%m%d).tar.gz /home/[user]/compose/

真正重要的数据目录要单独备份,不要只备份 Compose。

小结

远程恢复最后靠的是简单可靠的电源链路:智能插座负责远程断电再上电,BIOS 通电自启负责开机,NetworkManager 和 Docker restart policy 负责服务自己回来。WOL 和路由器 SSH 是有效尝试,但太依赖环境,放在折腾记录里更合适。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...