Files
ykxmz/_build/fix_boot_slow.sh
T
xmz7891 f4a146056f 修开机慢 2 分钟:掉电重启后要 2 分 10 秒才能恢复
用户早上撞上 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 ✓
2026-10-07 10:27:07 +08:00

79 lines
3.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"