安装
yum install -y ntp
NTP架构
- NTP服务采用C/S架构,支持多层级服务
- 如果允许所有服务器与互联网时钟同步,则可以将所有服务器作为Client端配置
- 如果设计服务器在局域网中时钟同步,则需要将至少一台服务器作为时钟源,该服务器可以作为Client从互联网同步,同时作为Server由其他服务器来同步
系统时间与硬件时间
ntp服务默认只会同步系统时间,如果想要让ntp同时同步硬件时间,可以设置/etc/sysconfig/ntpd 文件
在/etc/sysconfig/ntpd文件中,添加 SYNC_HWCLOCK=yes 这样,就可以让硬件时间与系统时间一起同步
NTP相关服务对比:ntpdate,ntpd
ntpdate同步是直接设置系统时间,会造成时间的跳跃,对一些依赖时间的程序和服务会造成影响,如sleep,timer等。
ntpd服务可以在修正时间的同时,修正cpu tick。
ntpd服务运行后,先是每64秒与上源服务器同步一次, 根据每次同步时测得的误差值经复杂计算逐步调整自己的时间,随着误差减小,逐步增加同步的间隔。
每次跳动,都会重复这个调整的过程。
要注意的是,ntpd有一个自我保护设置:如果本机与上源时间相差太大,ntpd 不运行。
所以新设置的时间服务器最好先 ntpdate 从上源取得时间初值,然后启动 ntpd服务。
理想的做法为,在开机的时候,使用ntpdate强制同步时间,在其他时候使用ntpd服务来同步时间。
crontab -e # 开机同步一次时间,然后启动ntpd自动同步时钟服务,避免长时间关机后ntpd服务不运行 @reboot /sbin/ntpdate ntp.ntsc.ac.cn >/dev/null 2>&1 ; /sbin/service ntpd start >/dev/null 2>&1
特别关注:ntpdate命令与ntpd服务无法同时使用,因为都需要使用 123/udp 端口
Server端示例
配置文件 /etc/ntp.conf
###ntp server### #每一个系统时钟的频率都有小小的误差,所以机器运行一段时间后会不精确,ntpd会自动来监测时钟的误差值并予以调整 #该配置要求ntpd把记录下来的误差先写入driftfile.这样即使重新开机,之前的计算结果也就不会丢失了 driftfile /var/lib/ntp/drift #权限配置 #语法为:restrict IP mask netmask_IP parameter #其中 IP 可以是IP地址,也可以是 default,类似 0.0.0.0 #paramter支持如下: # 1.ignore: 关闭所有的 NTP 联机服务 # 2.nomodify:表示 Client 端不能更改 Server 端的时间参数,不过Client 端仍然可以透过 Server 端来进行网络校时. # 3.notrust: 该 Client 除非通过认证,否则该 Client 来源将被视为不信任网域 # 4.noquery: 不提供 Client 端的时间查询(备注:实测noquery参数可能由于ntp框架bug,在noquery关键字后必须紧跟一个特殊空字符,非空格非tab,暂未确定,建议不配置此参数) # 5.notrap: 不提供 trap 这个远程事件登入 #如果没有用任何参数,那么表示不做任何限制 #默认关闭所有NTP请求 restrict default nomodify notrap #按需开放NTP请求 restrict 127.0.0.1 nomodify notrap restrict 192.168.11.0 mask 255.255.255.0 nomodify notrap #上层主机即NTP服务器的配置 #语法为:server [IP|HOST Name] [prefer] #Server 后面接的就是上层NTP服务器IP或域名 #prefer 表示作为主NTP服务器,其他为备选服务器 #国家授时中心 server ntp.ntsc.ac.cn prefer #阿里云 server ntp.aliyun.com #腾讯云 server time1.cloud.tencent.com #外部时间服务器不可用时,以本地时间作为时间服务 #本地时间服务器127.127.1.0,不是127.0.0.1 server 127.127.1.0 #fudge设置NTP服务器的层级,一般配置本地时间服务器时使用 #语法:fudge ip [stratum int] #注意:fudge必须和server一块用,且必须在server下一行 #stratum:0~15, #0: 顶级 #10: 通常用于给局域网主机提供时间服务 fudge 127.127.1.0 stratum 10 #以下为安全配置,默认开启,如无特殊需求,不做更改 includefile /etc/ntp/crypto/pw keys /etc/ntp/keys
Client端示例
配置文件 /etc/ntp.conf
###ntp client### #每一个系统时钟的频率都有小小的误差,所以机器运行一段时间后会不精确,NTP会自动来监测时钟的误差值并予以调整 #该配置要求ntpd把记录下来的误差先写入driftfile.这样即使重新开机,之前的计算结果也就不会丢失了 driftfile /var/lib/ntp/drift #权限配置 #语法为:restrict IP mask netmask_IP parameter #其中 IP 可以是IP地址,也可以是 default,类似 0.0.0.0 #paramter支持如下: # 1.ignore: 关闭所有的 NTP 联机服务 # 2.nomodify:表示 Client 端不能更改 Server 端的时间参数,不过Client 端仍然可以透过 Server 端来进行网络校时. # 3.notrust: 该 Client 除非通过认证,否则该 Client 来源将被视为不信任网域 # 4.noquery: 不提供 Client 端的时间查询(备注:实测noquery参数可能由于ntp框架bug,在noquery关键字后必须紧跟一个特殊空字符,非空格非tab,暂未确定,建议不配置此参数) # 5.notrap: 不提供 trap 这个远程事件登入 #如果没有用任何参数,那么表示不做任何限制 #默认关闭所有NTP请求 restrict default nomodify notrap #上层主机即NTP服务器的配置 #语法为:server [IP|HOST Name] [prefer] #Server 后面接的就是上层NTP服务器IP或域名 #prefer 表示作为主NTP服务器,其他为备选服务器 #局域网NTP服务器 server 192.168.11.27 prefer server 192.168.11.28
常见问题
- Server dropped: no data
- no server suitable for synchronization found
- Server dropped: strata too high
- stratum 16
以上问题,主要在客户端执行ntpdate命令时遇到,但根本原因,可能出现在服务端,也可能出现在客户端,可以根据以下思路排查
- 自建服务端刚启动,需要经过一段时间才能为客户端提供服务,一般3-5分钟,稍等几分钟再试
- 自建服务器使用ntp4.2(包括4.2)之后的版本(ntpq -c version 或 ntpd -! 查询版本),在restrict的定义中使用了notrust,需要去掉notrust
- 自建服务端防火墙未开放ntp服务端口,请检查防火墙并添加 123/udp 端口
- 服务端为可信任的互联网服务器,如国家授时中心,阿里云,腾讯云,各大高校,等,则排查客户端环境,如是否有互联网访问权限,是否有出口防火墙规则,等
其他时间相关命令
date
查看与设置系统时间
#查看date帮助信息 [root@localhost ~]# date --help #查看系统时间 [root@localhost ~]# date 2023年 06月 30日 星期五 14:00:07 CST #设置系统时间 [root@localhost ~]# date -s "20230629 14:00:00" 2023年 06月 29日 星期四 14:00:00 CST [root@localhost ~]# date 2023年 06月 29日 星期四 14:00:01 CST
hwclock
查看与设置硬件时间,系统时间与硬件时间同步
#查看hwclock帮助信息 [root@localhost ~]# hwclock --help #或 hwclock -h #查看硬件时间 [root@localhost ~]# hwclock --show 2023年06月30日 星期五 14时03分54秒 -0.146147 秒 #设置硬件时间 [root@localhost ~]# hwclock --set --date "20230629 14:00:00" [root@localhost ~]# hwclock --show 2023年06月29日 星期四 14时00分02秒 -0.239951 秒 #设置系统时间同步到硬件时间,即以系统时间为准 [root@localhost ~]# hwclock --systohc #或 hwclock -w [root@localhost ~]# hwclock --show 2023年06月30日 星期五 14时04分43秒 -0.739986 秒 #设置硬件时间同步到系统时间,即以硬件时间为准 [root@localhost ~]# hwclock --hctosys #或 hwclock -s
附录:参考教程