#!/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"