Files
ykxmz/_build/why_reboot.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

57 lines
2.6 KiB
Bash

#!/bin/bash
# 设备重启了 —— 查是掉电、还是崩溃、还是被谁重启的
set -u
echo "════════ 1. 这次开机的起点 ════════"
uptime | sed 's/^/ /'
echo " 当前时间: $(date '+%m-%d %H:%M:%S')"
echo " 开机时刻: $(uptime -s 2>/dev/null || echo '?')"
echo
echo "════════ 2. 上一次关机是干净的还是掉电 ════════"
echo " --- last reboot ---"
last -x reboot 2>/dev/null | head -6 | sed 's/^/ /'
echo " --- last shutdown ---"
last -x shutdown 2>/dev/null | head -4 | sed 's/^/ /'
echo
echo "════════ 3. 本次启动的日志开头(看有没有异常)════════"
journalctl -b --no-pager 2>/dev/null | head -25 | sed 's/^/ /'
echo
echo "════════ 4. 有没有内核崩溃 / 掉电迹象 ════════"
echo " --- 上次启动末尾(也就是重启前最后的日志)---"
journalctl -b -1 --no-pager 2>/dev/null | tail -25 | sed 's/^/ /'
echo
echo " (如果上面是空的,说明上次的日志没落盘 —— 典型的直接掉电)"
echo
echo "════════ 5. dmesg 里的告警 ════════"
dmesg 2>/dev/null | grep -iE 'error|warn|fail|thermal|voltage|under' | tail -12 | sed 's/^/ /'
echo " (没输出=没有明显告警)"
echo
echo "════════ 6. 温度 / 电压(如果是过热或欠压会重启)════════"
for f in /sys/class/thermal/thermal_zone*/temp; do
[ -f "$f" ] && echo " $f: $(($(cat $f) / 1000))°C"
done
command -v vcgencmd >/dev/null 2>&1 && vcgencmd measure_temp 2>/dev/null | sed 's/^/ /'
cat /sys/class/power_supply/*/voltage_now 2>/dev/null | while read v; do
echo " 电压: $((v / 1000)) mV"
done
echo
echo "════════ 7. 内存压力(OOM 会把系统搞挂)════════"
free -m | sed 's/^/ /'
echo " 本次启动有没有 OOM:"
journalctl -b --no-pager 2>/dev/null | grep -ic 'out of memory\|oom-kill' | sed 's/^/ /'
echo
echo "════════ 8. 是不是被关机命令重启的 ════════"
journalctl -b --no-pager 2>/dev/null | grep -iE 'shutdown|reboot|poweroff|systemd-logind' | head -8 | sed 's/^/ /'
echo
echo "════════ 9. 日志持久化了吗(掉电的话日志会丢)════════"
echo " /var/log/journal 存在: $(if [ -d /var/log/journal ]; then echo 是; else echo '否(日志只在内存里,重启就没)'; fi)"
echo " 当前 journal 占用: $(journalctl --disk-usage 2>/dev/null | sed 's/.*take up //' || echo '?')"