mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 16:00:43 +00:00
用户早上撞上 Cloudflare Error 1033。查出来是设备**掉电重启**:
上次开机到重启之间没有任何日志落盘(直接断电的特征),
dmesg 里还有 "l13: voltage operation not allowed"。
重启本身不是软件问题,但**恢复太慢**:
Startup finished in 3.846s (kernel) + 2min 6.358s (userspace) = 2分10秒
那 2 分钟里浏览器看到的就是 1033。
根因:
这台机器 NetworkManager 和 systemd-networkd 同时在跑,
但 wlan0 归 NetworkManager 管。
NetworkManager-wait-online -> 开机 9 秒成功
systemd-networkd-wait-online -> 等一个不归它管的网络,
干等 2 分钟超时,然后 failed
network-online.target 要等**两个都完成**,
被那个失败的拖了整整 2 分钟,
relay / tunnel / net-tune 全跟着等。
修法:
1. mask 掉 systemd-networkd-wait-online(网络不归它管,只会拖后腿)
2. watchdog 首次检查从"开机后 2 分钟"提前到 45 秒
实测(重启验证过):
修之前 Startup finished in 3.846s + 2min 6.358s = 2分10秒
修之后 Startup finished in 3.218s + 14.060s = 17.3秒
掉电重启后公网恢复时间:**24 秒**(快了 5 倍多)
配套加了 scripts/speed-up-boot.sh,换设备时直接跑一遍。
顺带确认重启后一切自动恢复:
三个服务 active + enabled ✓
keepalive 30/10/3、MTU 探测、MSS 钳制、slow_start=0 全部持久化 ✓
隧道 4 条连接 http2 ✓
官网 / 管理页 / 截图全部 200 ✓
79 lines
3.3 KiB
Bash
79 lines
3.3 KiB
Bash
#!/bin/bash
|
||
# 修开机慢 2 分钟的根因
|
||
#
|
||
# 现象:
|
||
# systemd-analyze 说用户空间花了 2 分 6 秒。
|
||
# 日志显示 network-online.target 直到开机后 2 分 10 秒才达成,
|
||
# 而 relay / tunnel / net-tune 全都在等它。
|
||
#
|
||
# 根因:
|
||
# 这台机器上 NetworkManager 和 systemd-networkd **同时在跑**,
|
||
# 但 wlan0 是 NetworkManager 管的。
|
||
# NetworkManager-wait-online -> 开机 9 秒就成功
|
||
# systemd-networkd-wait-online -> 等一个不归它管的网络,
|
||
# 干等到 2 分钟超时,然后 **failed**
|
||
# network-online.target 要等**两个都完成**,
|
||
# 于是被那个失败的服务拖了整整 2 分钟。
|
||
#
|
||
# 修法:
|
||
# 1. 屏蔽 systemd-networkd-wait-online(网络不归它管,它只会拖后腿)
|
||
# 2. 顺手把 watchdog 首次检查从"开机后 2 分钟"提前到 45 秒
|
||
# —— 开机后隧道本来就要几十秒才连上,早查早放心
|
||
set -u
|
||
|
||
echo "════════ 1. 先确认网络确实归 NetworkManager 管 ════════"
|
||
echo " wlan0 的持有者:"
|
||
systemctl status NetworkManager --no-pager 2>/dev/null | head -3 | sed 's/^/ /'
|
||
nmcli -t -f DEVICE,STATE,CONNECTION dev status 2>/dev/null | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "════════ 2. 屏蔽 systemd-networkd-wait-online ════════"
|
||
systemctl disable --now systemd-networkd-wait-online.service 2>&1 | sed 's/^/ /'
|
||
systemctl mask systemd-networkd-wait-online.service 2>&1 | sed 's/^/ /'
|
||
echo " 现在状态: $(systemctl is-enabled systemd-networkd-wait-online.service 2>&1) / $(systemctl is-active systemd-networkd-wait-online.service 2>&1)"
|
||
|
||
echo
|
||
echo "════════ 3. 确认 network-online.target 不再依赖它 ════════"
|
||
systemctl list-dependencies network-online.target --no-pager 2>/dev/null | sed 's/^/ /'
|
||
|
||
echo
|
||
echo "════════ 4. watchdog 首次检查提前到 45 秒 ════════"
|
||
cat > /etc/systemd/system/lanremote-watchdog.timer <<'EOF'
|
||
[Unit]
|
||
Description=每 20 秒检查一次隧道连接数
|
||
|
||
[Timer]
|
||
# 原来 OnBootSec=2min —— 开机后隧道几十秒就连上了,
|
||
# 干等 2 分钟才第一次检查没必要。
|
||
OnBootSec=45s
|
||
OnUnitActiveSec=20s
|
||
AccuracySec=5s
|
||
Unit=lanremote-watchdog.service
|
||
|
||
[Install]
|
||
WantedBy=timers.target
|
||
EOF
|
||
systemctl daemon-reload
|
||
systemctl restart lanremote-watchdog.timer
|
||
echo " $(systemctl is-active lanremote-watchdog.timer) / $(systemctl is-enabled lanremote-watchdog.timer)"
|
||
|
||
echo
|
||
echo "════════ 5. 服务还正常吗 ════════"
|
||
for svc in lanremote-relay lanremote-tunnel lanremote-nettune; do
|
||
printf " %-22s %s\n" "$svc" "$(systemctl is-active $svc 2>&1)"
|
||
done
|
||
echo " 隧道连接数: $(curl -s --max-time 5 http://127.0.0.1:20241/metrics 2>/dev/null | grep '^cloudflared_tunnel_ha_connections' | awk '{print $2}')"
|
||
echo " 本机 relay: HTTP $(curl -s -o /dev/null -w '%{http_code}' --max-time 8 http://127.0.0.1:8080/v1/health)"
|
||
|
||
echo
|
||
echo "════════ 6. 公网还通吗 ════════"
|
||
ok=0
|
||
for i in $(seq 1 5); do
|
||
c=$(curl -s -o /dev/null -w '%{http_code}' --max-time 15 \
|
||
-H 'User-Agent: LanRemote/1.4.0' https://relay.xxmxxs.top/v1/health)
|
||
[ "$c" = "200" ] && ok=$((ok+1))
|
||
printf " %d: %s\n" "$i" "$c"
|
||
sleep 1
|
||
done
|
||
echo " 可用 $ok/5"
|