从反复报错到稳定运行:麒麟与Ubuntu时间同步服务部署全解析
在服务器集群运维中,时间同步是保障日志追溯、数据一致性的基础环节。近期在部署麒麟V10 SP2与Ubuntu双系统时间同步服务时,遭遇了yum源失效、NTP服务配置冲突、端口拦截等一系列问题,最终通过层层排查实现稳定运行。本文将完整复盘整个过程,分享从报错排查到服务落地的实战经验。
一、场景与核心需求
本次运维场景包含两台核心服务器:
-
时间服务器:Ubuntu 22.04 LTS,IP地址脱敏为「192.168.X.197」,需提供NTP时间同步服务
-
客户端:麒麟V10 SP2(aarch64架构),需定时从Ubuntu服务器同步时间,保障业务日志时间一致性
核心需求:实现客户端每10分钟自动同步时间,同步成功率100%,且规避麒麟系统官方yum源失效问题。
二、部署路上的"坑":典型报错与根因分析
整个部署过程并非一帆风顺,以下是三个典型报错及深层原因,也是多数运维人员会遇到的共性问题。
1. 麒麟系统:yum源404报错,依赖安装受阻
执行依赖安装命令时,反复出现如下报错:
bash
Errors during downloading metadata for repository 'KylinV10-OS':
- Status code: 404 for https://update.cs2c.com.cn/NS/V10SP2/os/adv/lic/base/aarch64/repodata/repomd.xml
Error: Failed to download metadata for repo 'KylinV10-OS'
根因:麒麟V10 SP2官方yum源已停止维护,导致ntpdate、chrony等时间同步工具无法通过常规方式安装。
2. Ubuntu服务器:NTP服务启动正常却无法同步
Ubuntu端已安装ntp服务并显示"active (running)",但执行本地同步命令时仍报错:
bash
sudo ntpdate -u 127.0.0.1
8 Dec 14:46:39 ntpdate[3019707]: no server suitable for synchronization found
根因:NTP服务默认加载Ubuntu外网池源,未启用本地时钟源,且配置文件修改后未彻底重启服务,导致配置未生效。
3. 跨机同步:麒麟客户端提示"端口不可达"
麒麟端执行同步命令时,出现网络连通性问题:
bash
nc -zv -u -w 5 192.168.X.197 123
nc: connect to 192.168.X.197 port 123 (udp) failed: No route to host
根因:Ubuntu端ufw防火墙与iptables规则双重拦截123/UDP端口(NTP服务默认端口),导致跨机通信受阻。
三、解决方案:分端部署与核心配置
针对上述问题,采用"先解决依赖障碍,再配置服务核心,最后打通网络链路"的思路,分Ubuntu服务器端与麒麟客户端逐步实现。
1. Ubuntu服务器端:构建稳定NTP服务
核心目标:让Ubuntu服务器成为仅对内网开放的可靠时间源,放弃外网依赖。
步骤1:清理冲突环境,重新安装NTP
先卸载可能冲突的chrony服务,避免端口占用与配置干扰:
bash
# 卸载冲突服务
sudo apt remove -y chrony ntp
sudo apt autoremove -y
# 清空残留进程
sudo pkill -9 ntpd
sudo systemctl stop ntp 2>/dev/null
# 安装纯净NTP服务
sudo apt update && sudo apt install -y ntp
步骤2:配置本地时钟源,禁用外网访问
编辑NTP配置文件/etc/ntp.conf,仅保留本地时钟源与内网访问规则,彻底规避外网依赖:
bash
sudo bash -c 'cat > /etc/ntp.conf << EOF
# 启用本地时钟源(优先级最高,无外网也可用)
server 127.127.1.0 prefer
fudge 127.127.1.0 stratum 10
# 允许客户端所在网段(麒麟机器网段)访问
restrict 192.168.X.0 mask 255.255.255.0 nomodify notrap
# 仅允许本地回环访问
restrict 127.0.0.1
restrict -6 ::1
# 禁用所有外网访问与默认源
restrict default ignore
restrict -6 default ignore
# 系统必要配置
driftfile /var/lib/ntp/ntp.drift
logfile /var/log/ntp.log
EOF'
步骤3:初始化服务并放行端口
通过强制初始化本地时钟、关闭防火墙,确保服务正常运行且网络通畅:
bash
# 初始化本地时钟(忽略层级差,强制同步)
sudo ntpd -gq -c /etc/ntp.conf
# 启动服务并设置开机自启
sudo systemctl start ntp
sudo systemctl enable ntp
# 关闭防火墙,放行123端口
sudo ufw disable
sudo iptables -F
sudo iptables -P INPUT ACCEPT
# 持久化iptables规则
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
步骤4:服务验证
执行以下命令,若输出符合预期则说明NTP服务配置成功:
bash
# 1. 检查服务状态(显示active running)
sudo systemctl status ntp
# 2. 检查123端口监听(确保0.0.0.0:123)
sudo netstat -nulp | grep 123
# 3. 确认本地时钟源可用(显示*127.127.1.0)
ntpq -p
# 4. 本地同步测试(输出adjust time server)
sudo ntpdate -u 127.0.0.1
2. 麒麟客户端:绕开元障碍实现同步
核心目标:通过离线包安装依赖工具,编写智能脚本实现定时同步与故障报警。
步骤1:离线安装时间同步工具
从麒麟官方归档源下载离线包,绕开失效的yum源问题:
bash
# 切换到临时目录
cd /tmp
# 下载aarch64架构离线包(x86_64替换为对应架构)
sudo wget https://archive.kylinos.cn/kylin/KYLIN-ALL/V10-SP2/pool/main/n/ntp/ntpdate_4.2.8p15-1.k10.aarch64.rpm
sudo wget https://archive.kylinos.cn/kylin/KYLIN-ALL/V10-SP2/pool/main/c/chrony/chrony_3.5-2.k10.aarch64.rpm
# 强制安装(忽略依赖冲突)
sudo rpm -ivh ntpdate_4.2.8p15-1.k10.aarch64.rpm --nodeps
sudo rpm -ivh chrony_3.5-2.k10.aarch64.rpm --nodeps
步骤2:部署智能同步脚本
编写包含网络检测、双方案同步、日志记录功能的脚本,提升服务可靠性。创建/usr/local/bin/time_sync.sh文件:
bash
#!/bin/bash
set -o errexit
# 配置项(根据实际环境修改)
TIME_SERVER="192.168.X.197" # 时间服务器IP
CRON_INTERVAL="*/10 * * * *" # 每10分钟同步一次
LOG_FILE="/var/log/time_sync.log" # 日志路径
# 颜色输出与日志函数
red() { echo -e "\033[31m$1\033[0m"; }
green() { echo -e "\033[32m$1\033[0m"; }
log() {
local msg="[$(date +'%Y-%m-%d %H:%M:%S')] $1"
echo ${msg}
echo ${msg} >> ${LOG_FILE}
}
# 前置网络检测
check_network() {
yellow "检测与${TIME_SERVER}的连通性..."
# Ping检测
if ! ping -c 3 -W 5 ${TIME_SERVER} >/dev/null 2>&1; then
red "错误:网络不通,无法连接时间服务器!"
exit 1
fi
# 端口检测
if ! nc -zv -u -w 5 ${TIME_SERVER} 123 >/dev/null 2>&1; then
yellow "警告:123端口未开放,尝试继续同步..."
fi
}
# 双方案同步函数
sync_time() {
check_network
# 方案1:ntpdate同步(优先)
if command -v ntpdate >/dev/null 2>&1; then
if ntpdate -u ${TIME_SERVER} >/dev/null 2>&1; then
hwclock -w # 同步硬件时钟
green "ntpdate同步成功"
return 0
fi
fi
# 方案2:chronyc同步(备用)
if command -v chronyc >/dev/null 2>&1; then
chronyc delete all >/dev/null 2>&1
chronyc add server ${TIME_SERVER} iburst >/dev/null 2>&1
if chronyc -a -t 10 makestep >/dev/null 2>&1; then
hwclock -w
green "chronyc同步成功"
return 0
fi
fi
red "同步失败!请检查服务器NTP服务"
exit 1
}
# 主逻辑(支持install/sync命令)
case "$1" in
sync) sync_time ;;
install)
# 添加定时任务
(crontab -l 2>/dev/null; echo "${CRON_INTERVAL} $0 sync >> ${LOG_FILE} 2>&1") | crontab -
green "定时任务添加成功,开始首次同步"
sync_time
;;
*) echo "用法:$0 [install|sync]" ;;
esac
步骤3:初始化客户端服务
赋予脚本执行权限并完成安装,实现定时同步:
bash
# 修复换行符(避免Windows格式问题)
sudo dos2unix /usr/local/bin/time_sync.sh
# 赋予执行权限
sudo chmod +x /usr/local/bin/time_sync.sh
# 完整安装(同步+定时任务)
sudo bash /usr/local/bin/time_sync.sh install
四、运维保障:监控与问题排查手册
服务部署后,需建立简单有效的监控机制,确保问题快速定位。
1. 关键监控点
-
日志监控:麒麟端查看/var/log/time_sync.log,Ubuntu端查看/var/log/ntp.log
-
服务状态:Ubuntu端执行sudo systemctl status ntp,确保服务持续运行
-
定时任务:麒麟端执行crontab -l,确认同步任务存在
2. 常见问题速查
| 问题现象 | 排查方向 | 解决方案 |
|---|---|---|
| 麒麟端提示"no server suitable" | Ubuntu端NTP源未加载 | 执行sudo ntpd -gq -c /etc/ntp.conf重新初始化 |
| 跨机同步时端口不通 | Ubuntu防火墙未关闭 | 执行sudo ufw disable && sudo iptables -F |
| 脚本执行报$'\r'错误 | 脚本格式为Windows格式 | 执行dos2unix修复脚本格式 |
五、总结与经验沉淀
本次时间同步服务部署,核心解决了"依赖源失效""服务配置冲突""网络链路拦截"三大核心问题,最终实现了稳定可靠的跨系统时间同步。沉淀出两点关键经验:
-
内网服务优先本地化:对于无外网权限或外网源不稳定的场景,启用本地时钟源、采用离线包安装等方式,可大幅提升服务可靠性。
-
脚本化提升运维效率:将网络检测、双方案同步、日志记录等功能集成到脚本中,不仅降低操作门槛,更能实现故障快速追溯。
后续可基于此方案,扩展至多节点集群同步,通过增加主备时间服务器进一步提升服务可用性。