mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 14:50:45 +00:00
修开机慢 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 ✓
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
r'''把开机加速的修复固化到仓库(脚本 + 文档 + 提交)。
|
||||
|
||||
事故:用户早上撞上 Error 1033。
|
||||
查出设备**掉电重启**过(上次开机日志是空的 = 直接断电)。
|
||||
重启后要 **2 分 10 秒**公网才恢复 —— 那段时间浏览器就是 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 秒**
|
||||
'''
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote")
|
||||
GIT = r"C:\Program Files\Git\bin\git.exe"
|
||||
|
||||
# 把设备上的实际做法固化成脚本
|
||||
SCRIPT = '''#!/bin/bash
|
||||
# 加快掉电重启后的恢复速度。
|
||||
#
|
||||
# 背景(实测数据):
|
||||
# 用户撞上的 Cloudflare Error 1033 是设备**掉电重启**造成的。
|
||||
# 修之前开机要 2 分 10 秒公网才恢复,那段时间浏览器就是 1033。
|
||||
#
|
||||
# 根因:这台机器 NetworkManager 和 systemd-networkd 同时在跑,
|
||||
# 但 wlan0 归 NetworkManager 管。
|
||||
# NetworkManager-wait-online -> 9 秒成功
|
||||
# systemd-networkd-wait-online -> 等不归它管的网络,
|
||||
# 干等 2 分钟超时然后 failed
|
||||
# network-online.target 要等两个都完成,
|
||||
# 被那个失败的拖了整整 2 分钟,
|
||||
# relay / tunnel / net-tune 全跟着等。
|
||||
#
|
||||
# 修完:用户空间 2分6秒 -> 14秒;掉电重启后 24 秒公网恢复。
|
||||
set -u
|
||||
|
||||
echo " 1. mask 掉 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 " 2. 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 " 3. 确认"
|
||||
echo " networkd-wait-online: $(systemctl is-enabled systemd-networkd-wait-online 2>&1)(应为 masked)"
|
||||
echo " watchdog timer: $(systemctl is-active lanremote-watchdog.timer 2>&1)"
|
||||
systemctl list-dependencies network-online.target --no-pager 2>/dev/null | sed 's/^/ /'
|
||||
'''
|
||||
|
||||
MSG = """修开机慢 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 ✓
|
||||
"""
|
||||
|
||||
|
||||
def save_script() -> None:
|
||||
target = ROOT / "relay" / "speed-up-boot.sh"
|
||||
target.write_text(SCRIPT, encoding="utf-8", newline="\n")
|
||||
print(" 已写 %s(%d 行)" % (target.name, SCRIPT.count("\n")))
|
||||
|
||||
|
||||
def commit() -> None:
|
||||
print()
|
||||
subprocess.run([GIT, "add", "-A"], cwd=str(ROOT), check=False)
|
||||
msg_file = ROOT / "_build" / "_c11.txt"
|
||||
msg_file.write_bytes(MSG.encode("utf-8"))
|
||||
r = subprocess.run([GIT, "commit", "-q", "-F", str(msg_file)],
|
||||
cwd=str(ROOT), capture_output=True, text=True,
|
||||
encoding="utf-8", errors="replace")
|
||||
msg_file.unlink(missing_ok=True)
|
||||
print(" commit exit=%s" % r.returncode)
|
||||
show = subprocess.run([GIT, "log", "--oneline", "-1"], cwd=str(ROOT),
|
||||
capture_output=True, text=True, encoding="utf-8",
|
||||
errors="replace")
|
||||
print(" " + (show.stdout or "").strip())
|
||||
env = dict(os.environ)
|
||||
env["GIT_SSH_COMMAND"] = r'"C:\Program Files\Git\usr\bin\ssh.exe"'
|
||||
push = subprocess.run([GIT, "push", "origin", "main"], cwd=str(ROOT),
|
||||
capture_output=True, text=True, encoding="utf-8",
|
||||
errors="replace", env=env)
|
||||
for line in (push.stderr or push.stdout or "").strip().splitlines()[-2:]:
|
||||
print(" " + line)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
save_script()
|
||||
commit()
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user