- ntp
- Network Time Protocol,即网络时间同步协议。
安装 ntp
ntpdate 和 ntpd 通常包含在 ntp 软件包里,但有的系统是单独打包。
ntpdate 命令用于直接同步时间。
ntpd 服务用于平滑同步时间。
yaourt -S ntp
使用 ntpdate 命令同步时间
ntpdate 命令用于强制性的将系统时间设置为 ntp 服务器时间,导致时钟跃变,可能会引起系统不稳定。
手工同步一次
带 -d 选项,调试运行,不修改本地时间
1: # ntpdate -d s1a.time.edu.cn 2: 9 Mar 18:46:29 ntpdate[20537]: ntpdate 4.2.4p8@1.1612-o Fri Feb 22 11:23:28 UTC 2013 (1) 3: Looking for host s1a.time.edu.cn and service ntp 4: host found : 202.112.10.60 5: transmit(202.112.10.60) 6: receive(202.112.10.60) 7: transmit(202.112.10.60) 8: receive(202.112.10.60) 9: transmit(202.112.10.60) 10: receive(202.112.10.60) 11: transmit(202.112.10.60) 12: receive(202.112.10.60) 13: transmit(202.112.10.60) 14: server 202.112.10.60, port 123 15: stratum 1, precision -20, leap 00, trust 000 16: refid [PPS], delay 0.06285, dispersion 0.00003 17: transmitted 4, in filter 4 18: reference time: da8a8b53.73391350 Wed, Mar 9 2016 19:45:23.450 19: originate timestamp: da8a8b5c.3f42dc7c Wed, Mar 9 2016 19:45:32.247 20: transmit timestamp: da8a7d86.32fde4c3 Wed, Mar 9 2016 18:46:30.199 21: filter delay: 0.06323 0.06317 0.06299 0.06285 22: 0.00000 0.00000 0.00000 0.00000 23: filter offset: 3542.028 3542.028 3542.028 3542.028 24: 0.000000 0.000000 0.000000 0.000000 25: delay 0.06285, dispersion 0.00003 26: offset 3542.028898 27: 28: 9 Mar 18:46:30 ntpdate[20537]: step time server 202.112.10.60 offset 3542.028898 sec
- 行 26
- 本机时间比时间服务器慢了 3542.028898 秒
不带 -d 选项,修改本地时间
# ntpdate s1a.time.edu.cn ntpdate s1a.time.edu.cn 9 Mar 19:51:51 ntpdate[20553]: step time server 202.112.10.60 offset 3542.052347 sec
定期自动同步时间
长时间运行的系统,会与标准时间产生偏差,通过 crontab 每日运行一次
/etc/cron.daily/ntpdate
#!/bin/bash /usr/sbin/ntpdate s1a.time.edu.cn >/dev/null 2>&1
请记得为 /etc/cron.daily/ntpdate
添加可执行权限。
使用 ntpd 服务同步时间
- ntpd
- Network Time Protocol (NTP) Daemon The ntpd program is an operating system daemon that synchronizes the system clock to remote NTP time servers or local reference clocks.
ntpd 服务的配置文件为 /etc/ntp.conf 。
ntpd 如果时间偏差过大(默认 1000 秒钟),ntpd 会输出错误到系统日志后退出,所以在服务启动前需要先同步好时间。
某嵌入式系统上的 ntpd 服务脚本:
/etc/init.d/S49ntp
#! /bin/sh # # System-V init script for the openntp daemon # PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="network time protocol daemon" NAME=ntpd DAEMON=/usr/sbin/$NAME NTPDATE_BIN=/usr/bin/ntpdate # Gracefully exit if the package has been removed. test -x $DAEMON || exit 0 # Read config file if it is present. if [ -r /etc/default/$NAME ] then . /etc/default/$NAME fi case "$1" in start) if [ -x $NTPDATE_BIN ] ; then echo -n "Getting initial time via ntp" $NTPDATE_BIN $NTPDATE_OPTS $NTPSERVERS > /dev/null 2>&1 echo "." fi echo -n "Starting $DESC: $NAME" start-stop-daemon -S -q -x $DAEMON echo "." ;; stop) echo -n "Stopping $DESC: $NAME" start-stop-daemon -K -q -n $NAME echo "." ;; reload|force-reload) echo -n "Reloading $DESC configuration..." start-stop-daemon -K -q -n $NAME -s 1 echo "done." ;; restart) echo "Restarting $DESC: $NAME" $0 stop sleep 1 $0 start ;; *) echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 exit 1 ;; esac exit 0
其中 $NTPDATE_OPTS 定义在 /etc/default/ntpd 中:
NTPDATE_OPTS="-t 5"
通过 ntpdate 同步初始时间失败,ntpd 服务可能因为当前系统时间与时间服务器偏差过大而退出。
同步失败的原因:
- 开机后网络尚未连通
- 时间服务器繁忙
- 网络环境限制使用 NTP 协议
命令执行超时
域名解析、网络请求处理都会占用时间,5 秒钟不一定能完成。
由于脚本是在系统启动过程中运行,再延长超时时间可能导致开机启动时间变长。
可以配置 ntpd 在时间偏差过大时仍然同步时间(注意:ntpd 第一次需要 4-5 分钟才能完成同步),有以下几种方法:
添加 -g 命令行选项
-g
本地时间与时间服务器偏差达过大(默认为 1000 秒)时,不退出,同步一次时间。设置 NTPD_PANICGATE 环境变量
绝大部分命令行选项都可以通过加 NTPD_ 前缀的环境变量进行设置。
修改配置文件
将以下内容添加到 /etc/ntp.conf 最前面
tinker panic 0
手工同步一次
通过 ntpd 的命令行选项可以更好地完成 ntpdate 的功能。
-q
同步一次后退出。
ntpd -g -q
上面的命令会确保同步一次时间后结束。