时间服务器:NTP服务器

计算机内部所记录的时钟是记载于BIOS(CMOS)内的,但如果计算机上面的CMOS电池没电了,或者是某些特殊的原因导致BIOS数据被清除,此时计算机的时间就会不准。

1、关于时区与网络校时的通信协议

1.1、什么是时区?

地球分成了24个时区。一个时区就是15度,又由于是以格林尼治时间(GMT时间)为标准时间,在格林尼治以东的地区时间是比较早的,而以西的时间比较晚北京在格林尼治以东,因此北京时间会比GMT时间快8个小时(GMT+8)

BIOS会隔三差五地快/慢几秒,这是系统时间不可避免的误差,为了避免这样的误差,就需要网络校时了。

1.2、NTP通信协议

Linux系统的计时方式主要从1970年1月1日开始计算总秒数的。date命令,有个+%s的参数,可以取得总秒数,这个就是软件时钟。但硬件时钟主要是以BIOS内部的时间为依据的,而偏偏这个时间可能会因为BIOS内部芯片的问题,而导致BIOS时间与标准时间(UTC)存在误差。

NTP这个daemon如何让Server与Client同步它们的时间呢?

  1. 首先,主机当然需要启动daemon;
  2. 之后,Client会向NTP Server发送校对时间的message;
  3. 然后,NTP Server会发送出当前标准时间给Client;
  4. Client接收了来自Server的时间后,会据此调整自己的时间,这样就实现了网络校时。

**我国的授时中心服务器(ntp.ntsc.ac.cn)的IP地址为114.118.7.163,至于NTP是以port 123为连接的端口,采用UDP数据报

1.3、NTP服务器的层次概念

由于NTP时间服务器采用类似分级架构来处理时间的同步化,所以它使用的是类似一般Server/Client的主从架构。类似于DNS。

stratum-2向stratum-1同步时间,我们配置了一条NTP服务器向stratum-2同步时间,那我们的那台NTP服务器就是stratum-3。


2、NTP服务器的安装与配置

2.1、所需要的软件与软件结构

仅需要ntp这个软件

[root@server ~]# yum install ntp -y

不过我们还需要与时区相关的数据文件,所以需要下面的软件:

[root@server ~]# yum install tzdata -y

所需要的相关配置文件:

所需要的相关配置文件

说明

/etc/ntp.conf

NTP服务器的主要配置文件

/usr/share/zoneinfo/

由tzdata提供,为各时区的时间格式对应文件。例如,我国的时区对应文件就是/usr/share/zoneinfo/Asia/Shanghai

/etc/sysconfig/clock

设置时区是否使用UTC时钟的配置文件。每次开机后Linux会自动读取这个文件来设置自己系统所默认要显示的时间。举个例子来说,在我国的本地时间设置中,这个文件应该会出现一行“ZONE="Asia/Shanghai”的字样,这表示我们的时间配置文件是使用/usr/share/zoneinfo/Asia/Shanghai那个文件

/etc/localtime

就是本地端的时间配置文件。刚刚那个clock文件里面规定了使用的时间配置文件(ZONE)为/usr/share/zoneinfo/Asia/Shanghai,所以说这就是本地端的时间了,此时Linux会将Shanghai那个文件复制一份成为/etc/localtime

至于常用的时间服务器与修改时间的命令,主要有以下几个:

常用的时间服务器与修改时间的命令

说明

/usr/bin/date

用于Linux时间(软件时间)的修改与显示的命令

/usr/sbin/hwclock

用于BIOS时钟(硬件时钟)的修改与显示

/usr/sbin/ntpd

主要提供NTP服务的程序,配置文件为/etc/ntp.conf

/usr/sbin/ntpdate

用于客户端的时间校时,如果不要启动NTP而仅想要使用NTP Client的话,就是用这个命令

2.2、主配置文件ntp.conf的处理

2.2.1、利用restrict来管理权限控制
restrict [你的IP] mask [netmask_IP] [parameter]
其中parameter的参数有以下这些:
ignore:拒绝所有的ntp连接
nomodify:客户端不能使用ntpc和ntpq来修改服务器的时间参数,但客户端仍可以校时
noquery:客户端不能使用ntpq、ntpc等命令来查询时间服务器,等于不提供NTP的网络校时
notrap:不提供trap这个远程事件登录的功能
notrust:拒绝没有认证的客户端
2.2.2、利用server设置上层NTP服务器
server [IP or hostname] [prefer]
2.2.3、以diftfile记录时间差异
diftfile [可以被ntpd写入的目录与文件]
diftfile后面要接完整的路径文件名
该文件不能是连接文件
该文件需要设置成ntpd这个daemon可以写入的权限
该文件所记录的数值单位为百万分之一秒(ppm)
2.2.4、keys[key_file]

还可以通过秘钥系统来给客户端认证。

经过上面的说明,我们可以修改配置文件:

[root@server zoneinfo]# vim /etc/ntp.conf
#1、先处理权限方面的问题,包括放行上层服务器以及开放局域网用户来源
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
restrict 10.0.0.0 mask 255.0.0.0 nomodify
#2、设置主机来源
server ntp.ntsc.ac.cn prefer
#3、默认时间差异分析文件与暂时用不到的keys等,不需要更改
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys

2.3、NTP的启动与观察

[root@server zoneinfo]# systemctl start ntpd
[root@server zoneinfo]# systemctl enable ntpd
[root@server zoneinfo]# netstat -tulnp | grep ntp
udp        0      0 172.16.0.1:123          0.0.0.0:*                           9501/ntpd
udp        0      0 10.0.0.185:123          0.0.0.0:*                           9501/ntpd
udp        0      0 127.0.0.1:123           0.0.0.0:*                           9501/ntpd
udp        0      0 0.0.0.0:123             0.0.0.0:*                           9501/ntpd
udp6       0      0 fe80::4ee5:c165:393:123 :::*                                9501/ntpd
udp6       0      0 fe80::70ba:a631:42f:123 :::*                                9501/ntpd
udp6       0      0 ::1:123                 :::*                                9501/ntpd
udp6       0      0 :::123                  :::*                                9501/ntpd

通常启动NTP服务器后在15分钟内才会和上层NTP服务器顺利连接上。那如何确认NTP服务器顺利地更新了自己的时间呢?

[root@server zoneinfo]# ntpstat
synchronised to NTP server (114.118.7.163) at stratum 3
   time correct to within 1270 ms
   polling server every 64 s
[root@server zoneinfo]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*114.118.7.163   210.72.145.18    2 u    8   64   75   18.479    1.973  30.684

3、客户端的时间更新方法

3.1、Linux手动校时工作:date、hwclock

#软件时钟
[root@client ~]# date MMDDhhmmYYYY
选项与参数:
MM:月份
DD:日期
hh:小时
mm:分钟
YYYY:公元年
#硬件时钟
[root@client ~]# hwclock [-rm]
选项与参数:
-r:读出目前BIOS的时间
-w:将目前Linux的时间写入BIOS中

3.2、Linux的网络校时

可利用NTP的客户端程序,即ntpdate这个程序就能够进行时间的同步化。不过,因为NTP服务器本身就会与上层时间服务器进行时间的同步化,所以默认情况下,NTP服务器不可以使用ntpdate!也就是说ntpdate与ntpd不能同时使用

[root@client ~]# ntpdate [-dv] [NTP IP/hostname]
选项与参数:
-d:进入排错模式,可以显示出更多的信息
-v:显示更详细的信息
[root@client ~]# ntpdate 10.0.0.185
21 Jul 15:57:51 ntpdate[4845]: adjust time server 10.0.0.185 offset 0.059189 sec

定期去服务器校时,可以使用crontab,不过更好的办法是修改/etc/ntp.conf,启动ntpd服务:

[root@client ~]# vim /etc/ntp.conf
restrict 10.0.0.185
server 10.0.0.185
[root@client ~]# systemctl restart ntpd
[root@client ~]# systemctl enable ntpd