#!/bin/bash # 脚本文件名:setup_chrony_param.sh # 修订版本:1.2 (兼容性增强版) # 日期:2025/11/13 # 作者:Jack.liu # 电子邮件:lqf@xlsys.cn # 网址:www.xlsys.cn # 支持:RHEL/CentOS/Fedora、Debian/Ubuntu、CTyunOS(包括 CentOS 7) set -e # 遇错即停 ALIYUN_PUBLIC_NTP_SERVERS=( "ntp1.aliyun.com" "ntp2.aliyun.com" "ntp3.aliyun.com" "ntp4.aliyun.com" ) ALIYUN_PRIVATE_NTP_SERVERS=( "222.22.120.52" "134.144.144.81" "132.155.166.82" "136.153.11.220" "132.108.11.220" # 请根据实际环境修改内网 NTP 服务器 ) # 全局变量 CHRONY_CONF="" CHRONY_SERVICE="" PKG_MANAGER="" detect_os() { if [ -f /etc/os-release ]; then . /etc/os-release OS_ID="${ID,,}" else echo "错误: 无法读取 /etc/os-release,无法识别系统。" exit 1 fi case "$OS_ID" in *centos*|*rhel*|*rocky*|*almalinux*|*ctyunos*) CHRONY_CONF="/etc/chrony.conf" CHRONY_SERVICE="chronyd" PKG_MANAGER="yum" ;; *debian*|*ubuntu*) CHRONY_CONF="/etc/chrony/chrony.conf" CHRONY_SERVICE="chrony" PKG_MANAGER="apt" ;; *) echo "错误: 不支持的操作系统: $OS_ID" exit 1 ;; esac } set_timezone_to_cst() { local CURRENT_TIMEZONE # 尝试使用新式命令(systemd >= 230) if timedatectl show --property=Timezone --value &>/dev/null; then CURRENT_TIMEZONE=$(timedatectl show --property=Timezone --value) else # 回退到解析文本(兼容 CentOS 7 等) CURRENT_TIMEZONE=$(timedatectl status 2>/dev/null | grep 'Time zone' | awk '{print $3}') fi if [[ "$CURRENT_TIMEZONE" != "Asia/Shanghai" ]]; then echo "当前时区不是 CST,正在设置为 Asia/Shanghai..." sudo timedatectl set-timezone Asia/Shanghai echo "时区已设置为 CST (Asia/Shanghai)。" else echo "时区已经是 CST (Asia/Shanghai),无需更改。" fi } check_chrony_installed() { command -v chronyc >/dev/null 2>&1 } install_chrony() { echo "正在安装 chrony..." if [[ "$PKG_MANAGER" == "yum" ]]; then sudo yum install -y chrony elif [[ "$PKG_MANAGER" == "apt" ]]; then sudo apt-get update sudo apt-get install -y chrony fi } stop_ntpd() { echo "正在停止并禁用 ntpd/ntp 服务..." for svc in ntpd ntp; do if systemctl list-units --full --all | grep -q "^${svc}\."; then if systemctl is-active --quiet "$svc" 2>/dev/null; then sudo systemctl stop "$svc" fi sudo systemctl disable "$svc" --now 2>/dev/null || true fi done echo "ntpd/ntp 服务已处理。" } backup_chrony_conf() { if [[ ! -f "$CHRONY_CONF" ]]; then echo "警告: $CHRONY_CONF 不存在,跳过备份。" return 0 fi local backup_file="${CHRONY_CONF}.bak.$(date +%F_%H%M%S)" echo "正在备份配置文件到 $backup_file..." sudo cp "$CHRONY_CONF" "$backup_file" } configure_chrony_servers() { local servers=("$@") echo "清空现有 server 配置并添加新服务器..." sudo sed -i '/^server /d' "$CHRONY_CONF" for s in "${servers[@]}"; do echo "server $s iburst" | sudo tee -a "$CHRONY_CONF" >/dev/null done } start_chronyd() { echo "启动并启用 $CHRONY_SERVICE 服务..." sudo systemctl enable --now "$CHRONY_SERVICE" } restart_and_sync_chronyd() { echo "重启 $CHRONY_SERVICE 服务..." sudo systemctl restart "$CHRONY_SERVICE" echo "强制时间同步..." sudo chronyc -a makestep } display_ntp_status() { echo -e "\n====================================" echo "NTP 源状态:" chronyc sources -v echo "------------------------------------" echo "同步状态:" chronyc tracking echo "------------------------------------" echo "系统时间与时区:" timedatectl status | grep -E 'Local time|Time zone' echo -e "====================================\n" } select_ntp_servers() { case "$1" in public) configure_chrony_servers "${ALIYUN_PUBLIC_NTP_SERVERS[@]}" ;; private) configure_chrony_servers "${ALIYUN_PRIVATE_NTP_SERVERS[@]}" ;; *) echo -e "\n\033[1;31m错误: 无效选项。\033[0m\n" display_usage exit 1 ;; esac } display_usage() { echo -e "\n\033[1;34m用法: $0 {public|private}\033[0m" echo " public - 使用阿里云公网 NTP 服务器" echo " private - 使用内网 NTP 服务器" } main() { detect_os set_timezone_to_cst if ! check_chrony_installed; then install_chrony fi stop_ntpd backup_chrony_conf select_ntp_servers "$1" start_chronyd restart_and_sync_chronyd display_ntp_status echo -e "\n\033[1;32m✅ chrony 配置完成!\033[0m\n" } if [[ $# -ne 1 ]]; then display_usage exit 1 else main "$1" fi