ntpdate是一个简单的NTP客户端工具,用于从NTP服务器同步系统时间。虽然在新版本中已被chrony替代,但在许多系统中仍有使用。
# CentOS / RHEL / Fedora
sudo yum install ntpdate
# 或(较新版本)
sudo dnf install ntpdate
# Ubuntu / Debian
sudo apt-get update
sudo apt-get install ntpdate
# Arch Linux
sudo pacman -S ntp
# 检查是否安装成功
ntpdate --version
ntpdate [选项] [NTP服务器1] [NTP服务器2] ...
| 选项 | 说明 |
|---|---|
-b |
强制调整时间(即使时间差很大) |
-d |
调试模式,不实际修改时间 |
-s |
将输出记录到系统日志,而不是标准输出 |
-u |
使用非特权端口(当防火墙限制时) |
-v |
详细输出 |
-q |
只查询时间,不设置时间 |
-t 超时时间 |
设置超时时间(秒) |
-4 |
仅使用IPv4 |
-6 |
仅使用IPv6 |
# 1. 查看当前系统时间
date
timedatectl status
# 2. 从公共NTP服务器同步时间(需要root权限)
sudo ntpdate pool.ntp.org
# 3. 指定多个NTP服务器(提高可靠性)
sudo ntpdate time.nist.gov time.google.com
# 4. 使用国内NTP服务器
sudo ntpdate ntp.aliyun.com
sudo ntpdate ntp1.aliyun.com
# 5. 强制同步(即使时间差很大)
sudo ntpdate -b pool.ntp.org
# 6. 只查询时间,不设置时间
ntpdate -q pool.ntp.org
# 1. 调试模式(不实际修改时间)
sudo ntpdate -d pool.ntp.org
# 2. 设置超时时间为10秒
sudo ntpdate -t 10 pool.ntp.org
# 3. 使用非特权端口(绕过防火墙限制)
sudo ntpdate -u pool.ntp.org
# 4. 同步并将日志记录到系统日志
sudo ntpdate -s pool.ntp.org
# 5. 查询多个服务器的时间差异
sudo ntpdate -q time.nist.gov time.google.com
# 6. 结合watch命令实时监控时间差异
watch -n 10 'ntpdate -q pool.ntp.org | tail -1'
pool.ntp.org - NTP池项目time.google.com - Google时间服务器time.windows.com - Windows时间服务器time.nist.gov - 美国国家标准技术研究所time.apple.com - Apple时间服务器0.pool.ntp.org - 地区池服务器1.pool.ntp.org - 地区池服务器2.pool.ntp.org - 地区池服务器ntp.aliyun.com - 阿里云NTPntp1.aliyun.com - 阿里云NTP服务器1ntp2.aliyun.com - 阿里云NTP服务器2ntp.tuna.tsinghua.edu.cn - 清华大学NTPtime.pool.aliyun.com - 阿里云时间池time1.cloud.tencent.com - 腾讯云NTPtime2.cloud.tencent.com - 腾讯云NTPcn.pool.ntp.org - 中国NTP池编辑crontab配置文件:
# 编辑当前用户的crontab
crontab -e
# 或者编辑系统的crontab
sudo crontab -e
添加定时任务:
# 每天凌晨2点同步一次
0 2 * * * /usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1
# 每小时同步一次
0 * * * * /usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1
# 每30分钟同步一次
*/30 * * * * /usr/sbin/ntpdate time.google.com > /dev/null 2>&1
# 同步并写入硬件时钟
0 3 * * * /usr/sbin/ntpdate pool.ntp.org && /sbin/hwclock --systohc
创建同步脚本 /usr/local/bin/sync-time.sh:
#!/bin/bash
# 时间同步脚本
LOG_FILE="/var/log/time-sync.log"
NTP_SERVERS="ntp.aliyun.com time.google.com pool.ntp.org"
echo "=== $(date) ===" >> "$LOG_FILE"
for server in $NTP_SERVERS; do
echo "尝试从 $server 同步时间..." >> "$LOG_FILE"
if /usr/sbin/ntpdate -s "$server" 2>/dev/null; then
echo "成功从 $server 同步时间" >> "$LOG_FILE"
# 同步硬件时钟
/sbin/hwclock --systohc
echo "已更新硬件时钟" >> "$LOG_FILE"
exit 0
else
echo "从 $server 同步失败" >> "$LOG_FILE"
fi
done
echo "所有服务器同步失败" >> "$LOG_FILE"
exit 1
设置脚本权限并测试:
# 添加执行权限
sudo chmod +x /usr/local/bin/sync-time.sh
# 测试脚本
sudo /usr/local/bin/sync-time.sh
# 查看日志
tail -f /var/log/time-sync.log
# 添加到cron(每小时执行一次)
echo "0 * * * * /usr/local/bin/sync-time.sh" | sudo crontab -
chrony是ntpdate和ntpd的现代替代品,更适合不稳定的网络环境。
# 安装chrony
sudo yum install chrony # CentOS/RHEL
sudo apt-get install chrony # Ubuntu/Debian
# 启动并启用服务
sudo systemctl start chronyd
sudo systemctl enable chronyd
# 查看状态
sudo systemctl status chronyd
chronyc tracking
chronyc sources
# 编辑配置文件
sudo vi /etc/chrony.conf
# 添加国内NTP服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server time.google.com iburst
# 重启服务
sudo systemctl restart chronyd
systemd-timesyncd是systemd提供的时间同步服务。
# 启动服务
sudo systemctl start systemd-timesyncd
sudo systemctl enable systemd-timesyncd
# 查看状态
timedatectl status
timedatectl show-timesync
# 配置(编辑配置文件)
sudo vi /etc/systemd/timesyncd.conf
# 修改配置示例
[Time]
NTP=ntp.aliyun.com time.google.com
FallbackNTP=0.pool.ntp.org 1.pool.ntp.org
# 应用配置
sudo systemctl restart systemd-timesyncd
# 错误:no server suitable for synchronization found
# 可能原因:防火墙阻止NTP流量
# 解决方案:
# 1. 检查防火墙规则
sudo firewall-cmd --list-all # CentOS/RHEL
sudo ufw status # Ubuntu
# 2. 临时开放NTP端口(123/UDP)
sudo firewall-cmd --add-service=ntp --permanent
sudo firewall-cmd --reload
# 3. 使用非特权端口
sudo ntpdate -u pool.ntp.org
# 错误:adjust time server offset too large
# 可能原因:系统时间与真实时间差异太大
# 解决方案:
# 1. 使用-b参数强制同步
sudo ntpdate -b pool.ntp.org
# 2. 手动设置近似时间,然后再同步
sudo date -s "2023-10-01 12:00:00"
sudo ntpdate pool.ntp.org
# 3. 检查硬件时钟
sudo hwclock --show
sudo hwclock --hctosys # 从硬件时钟设置系统时间
# 错误:ntpdate: command not found
# 可能原因:未安装ntpdate或已弃用
# 解决方案:
# 1. 安装ntpdate
sudo yum install ntpdate # CentOS/RHEL
sudo apt-get install ntpdate # Ubuntu
# 2. 如果已弃用,使用替代方案
# 检查chrony
sudo yum install chrony
chronyc sources
# 或使用rdate(简单时间同步)
sudo yum install rdate
sudo rdate -s time.nist.gov
# 诊断命令
# 1. 检查网络连接
ping -c 3 pool.ntp.org
nc -z -u pool.ntp.org 123
# 2. 查看详细调试信息
sudo ntpdate -d pool.ntp.org
# 3. 检查本地ntp服务是否冲突
sudo systemctl status ntpd
sudo systemctl stop ntpd # 如果ntpd在运行,先停止它
# 4. 检查时区设置
timedatectl
cat /etc/timezone
# 5. 查看系统日志
sudo tail -f /var/log/messages
sudo journalctl -u systemd-timesyncd
#!/bin/bash
# 集群时间同步脚本
MASTER_NTP="ntp.master.local"
BACKUP_NTPS="ntp.aliyun.com time.google.com"
# 首先尝试从主NTP服务器同步
if ntpdate -q $MASTER_NTP >/dev/null 2>&1; then
sudo ntpdate $MASTER_NTP
else
# 如果主服务器不可用,使用备用服务器
for server in $BACKUP_NTPS; do
if sudo ntpdate $server; then
break
fi
done
fi
# 同步硬件时钟
sudo hwclock --systohc
#!/bin/bash
# 云服务器首次启动时的时间初始化
echo "正在初始化系统时间..."
# 安装必要工具
if command -v yum &> /dev/null; then
sudo yum install -y ntpdate
elif command -v apt-get &> /dev/null; then
sudo apt-get update
sudo apt-get install -y ntpdate
fi
# 同步时间
if sudo ntpdate -b ntp.aliyun.com; then
echo "时间同步成功"
# 设置时区为上海
sudo timedatectl set-timezone Asia/Shanghai
# 同步硬件时钟
sudo hwclock --systohc
# 显示当前时间
timedatectl status
else
echo "时间同步失败,请检查网络连接"
exit 1
fi