一、概述
NTP服务器的阶层概念
网络时间按照NTP服务器的等级进行传播,根据离基准时间的远近将不同服务器归纳到不同的层中(Stratum),单个Stratum层的总数限制在15
0层(Stratum 0):表示高精度设备,例如原子钟、GPS时钟等,0层也称为参考时钟
1层(Stratum 1):这些设备和0层的设备相连,误差仅为微秒
2层(Stratum 2):这些设备和1层的设备通过网络相连
依次类推...,时间是按NTP的层级进行传播的(Peer之间是同层级传播)
NTP服务为C/S架构,NTP客户端请求NTP服务端,通过交互往返的数据包,客户端能够根据这个结果计算出准确的时间,客户端为了保证计算结果的精确度、可靠度,一般建议NTP服务客户端配置最少3个NTP服务器地址
列举部分NTP协议的软件实现
- ntpdate:运行一次ntpdate命令,进行一次时间同步(该命令不是守护进程设计)
- ntp:NTP协议的实现,可充当NTP Client、NTP Server(守护进程设计)
- chrony:一个较新的NTP协议的实现,可充当NTP Client、NTP Server,Chrony相比ntp来说同步时间速度更快,精度更准,也是目前推荐的实现(守护进程设计)
二、ntpdate命令
ntpdate命令是一个客户端NTP程序,该程序并不是守护进程设计,ntpdate软件的绝大部分功能都已在ntpd中有包含,且ntpdate会逐渐进行退役
ntpdate设计用来通过指定的ntp服务器获取时间,并设置本地的时间,ntpdate的准确性、可靠性取决于服务器的数量,轮询查询的次数、间隔(该命令需要root权限执行)
#安装ntpdate
CentOS中执行 yum install ntpdate
Ubuntu中执行 apt install ntpdate
#ntpdate语法如下
ntpdate [ -46bBdqsuv ] [ -a key ] [ -e authdelay] [ -k keyfile ] [ -o version ] [ -p samples ] [ -t timeout ] [ -U user_name] server [ ... ]
#ntpdate命令选项解释如下:(可通过man ntpdate查看)
-4 仅使用IPv4
-6 仅使用IPv6
-a key 启用认证,并指定认证需要的密钥(默认禁用该功能)
-B 强制每次都使用adjtime()系统调用调整时间,即使偏移量+-500ms,默认情况下+-500ms使用settimeofday(),该情况下同步时间可能会超过1-2小时
-b 强制使用settimeofday()系统调用调整时间,而不是使用adjtime()调用来设置时间,在启动脚本中调用可以使用此选项
-d 启用调试模式,ntpdate将会完成所有动作,但是不修改本地时间,打印的输出信息可能会对调试很有帮助
-e authdelay 指定身份验证功能的处理延迟为authdelay,以秒和分为单位,给数字通常足够小,对于大多数用途来说可以忽略不记
-k keyfile 指定身份验证的密钥路径,默认为/etc/ntp/keys,该文件应该采用ntpd中所描述的格式
-o version 指定传出数据包的ntpd整数形式的版本号,可以为1、2,默认为4,该选项允许与较旧的NTP版本一起使用
-p samples 指定从每个服务器获取的样本数,可以是1-8,默认为4
-q 仅查询,不设置clock
-s 从标准输出转义日志输出到syslog,这主要是为了方便cron脚本而设计
-t timeout 指定从服务器收到响应的超时时间,可以是秒,分,该值四舍五入为0.2秒的倍数,默认值为1s
-u ntpdate为传出数据包使用非特权端口,当处于防火墙背后且知名端口被防火墙阻断时很有用,-d选项始终使用非特权端口
-v 显示更多详细信息
-U user_name ntpdate不使用root权限,并将用户ID更改为user_name,并将GroupID更改为server_user的主要组
ntpdate可以根据需要来手动设置时间,或者设置开机脚本达到每次启动时运行一次,也可以使用cron脚本来周期性运行ntpdate命令(带cron脚本的ntpdate不能替代ntpd,ntpd使用了很多复杂的算法来最大限度提高时间的准确性、可靠性,ntpdate不会约束本地主机的时钟频率,ntpdate的准确性是有限的)
使用ntpdate和NTP服务器同步一次时间
[root@ ~]# ntpdate 172.16.32.254
6 May 10:54:35 ntpdate[2614]: adjust time server 172.16.32.254 offset 0.031896 sec
将同步好的Linux Kernel时间写入BIOS硬件时钟,以便重启后保持时间准确
hwclock -w
(可选)可以在cron中设置每2个小时运行一次
0 */2 * * * root /usr/sbin/ntpdate 172.16.32.254 > /dev/null 2>&1
若本机上运行了ntpd服务的话,无法再通过ntpdate命令来设置日期
三、ntpd守护进程、服务
使用ntpd守护能够自动调整时间
#安装ntpd守护进程
CentOS系统中执行 yum install ntp
Ubuntu系统中执行 apt install ntp
安装完成之后,该服务可用systemd进行管理
#在CentOS中ntp服务的服务名和Ubuntu中有点不一样
#CentOS中该service文件为
/usr/lib/systemd/system/ntpd.service
#Ubuntu中该service文件为
/lib/systemd/system/ntp.service
#当使用systemd进行管理的时候,注意名称区别(CentOS中服务名带d,Ubuntu中不带)
systemctl enable ntpd.service
systemctl enable ntp.service
systemctl start ntpd.service
systemctl start ntp.service
3.1 ntpd配置文件
ntpd的服务配置文件路径为/etc/ntp.conf