时间服务器: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同步它们的时间呢?
- 首先,主机当然需要启动daemon;
- 之后,Client会向NTP Server发送校对时间的message;
- 然后,NTP Server会发送出当前标准时间给Client;
- 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