远程重启与兜底恢复:智能插座、通电自启和 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、网卡和局域网发送端配合。
- BIOS 开启 Wake On LAN;
- Linux 确认网卡支持魔术包;
- 软路由、服务器或另一台在线设备负责发送魔术包。
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.targetsudo 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: ALLCloudflare 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 是有效尝试,但太依赖环境,放在折腾记录里更合适。