feat: 增强时间同步 - 配置可靠NTP源+持久化chrony+管理菜单

This commit is contained in:
2026-04-17 12:21:47 +00:00
parent 0a158bbcae
commit 0250e5efe8

View File

@@ -70,14 +70,76 @@ get_ip() {
# ============ 时间同步 ============
sync_time() {
info "同步系统时间..."
# 1. 配置 chrony NTP 源 (国际 + 阿里云)
if command -v chronyd &>/dev/null; then
local chrony_conf
if [[ -f /etc/chrony/chrony.conf ]]; then
chrony_conf="/etc/chrony/chrony.conf"
elif [[ -f /etc/chrony.conf ]]; then
chrony_conf="/etc/chrony.conf"
fi
if [[ -n "${chrony_conf:-}" ]]; then
# 备份原配置
cp "$chrony_conf" "${chrony_conf}.bak.$(date +%s)" 2>/dev/null || true
# 检查是否已配置过
if ! grep -q '# SS-Rust NTP' "$chrony_conf" 2>/dev/null; then
# 注释掉原有 server/pool 行
sed -i 's/^\(server \|pool \)/#&/' "$chrony_conf" 2>/dev/null || true
# 追加可靠 NTP 源
cat >> "$chrony_conf" <<'NTP'
# SS-Rust NTP — 多源冗余
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server time.cloudflare.com iburst
pool pool.ntp.org iburst maxsources 4
# 允许大幅时钟跳变 (SS2022 对时间敏感)
makestep 1 -1
NTP
fi
fi
# 确保 chrony 服务启动并持久化
systemctl enable --now chronyd 2>/dev/null || \
systemctl enable --now chrony 2>/dev/null || true
# 等一下让 chrony 连上源
sleep 1
chronyc makestep 2>/dev/null || true
# 2. 没有 chrony 就用 ntpd
elif command -v ntpd &>/dev/null; then
systemctl enable --now ntpd 2>/dev/null || \
systemctl enable --now ntp 2>/dev/null || true
ntpdate -u pool.ntp.org 2>/dev/null || true
fi
# 3. timedatectl 兜底
if command -v timedatectl &>/dev/null; then
timedatectl set-ntp true 2>/dev/null || true
fi
if command -v chronyd &>/dev/null; then
systemctl enable --now chronyd 2>/dev/null || true
chronyc makestep 2>/dev/null || true
# 4. 验证
local offset=""
if command -v chronyc &>/dev/null; then
offset=$(chronyc tracking 2>/dev/null | awk '/System time/{print $4, $5}')
fi
info "当前时间: $(date '+%Y-%m-%d %H:%M:%S %Z')${offset:+ | 偏移: $offset}"
# 5. 检查偏移是否过大 (>30s 告警)
if command -v chronyc &>/dev/null; then
local drift_s
drift_s=$(chronyc tracking 2>/dev/null | awk '/System time/{gsub(/[^0-9.]/,"",$4); printf "%d", $4}')
if [[ "${drift_s:-0}" -gt 30 ]]; then
warn "时钟偏移 ${drift_s}s 过大! SS2022 可能连接失败, 正在强制同步..."
chronyc makestep 2>/dev/null || true
sleep 2
info "同步后时间: $(date '+%Y-%m-%d %H:%M:%S %Z')"
fi
fi
info "当前时间: $(date '+%Y-%m-%d %H:%M:%S %Z')"
}
# ============ 安装 ss-rust ============
@@ -569,10 +631,11 @@ show_menu() {
echo -e " ${GREEN}7.${NC} 重启服务"
echo -e " ${GREEN}8.${NC} 查看日志"
echo -e " ${GREEN}10.${NC} ⚡ BBR 加速优化"
echo -e " ${GREEN}11.${NC} 🕐 时间同步 (SS2022必需)"
echo -e " ${RED}9.${NC} 卸载"
echo -e " ${YELLOW}0.${NC} 退出"
echo ""
read -rp "请选择 [0-10]: " choice
read -rp "请选择 [0-11]: " choice
case "$choice" in
1) do_install ;;
@@ -585,6 +648,7 @@ show_menu() {
8) journalctl -u ss-rust --no-pager -n 30 ;;
9) uninstall ;;
10) setup_bbr ;;
11) get_pkg_manager; install_deps; sync_time ;;
0) exit 0 ;;
*) warn "无效选择" ;;
esac
@@ -603,6 +667,7 @@ main() {
log|logs) journalctl -u ss-rust --no-pager -n 30 ;;
reset) reset_keys ;;
bbr) setup_bbr ;;
sync|time) get_pkg_manager; install_deps; sync_time ;;
*)
if [[ -f /etc/shadowsocks-rust/config.json ]]; then
show_menu