NTP时间服务器
时间:2010-10-03 来源:fzguon
一、 概念
在正式介绍NTP服务器之前,先将有关时区、系统时间、硬件时间等概念介绍一下。
时区:地球是圆的,所以同一个时刻,在地球的一边是白天一边是黑夜。而人类使用一天24小时的制度,所以在地球对角的两边就应该差了 12 的小时。由于同一个时间点上面,整个地球的时间都不一样,为了解决这个问题,所以地球就被分成 24 个时区。
GMT: 这 24 个时区是依据“经纬度”来进行定位,而经度为零的地点在英国“格林威治”这个城市所在纵剖面上,(注:所谓的纵剖面就是由南极切到北极的直线,而横切面就是与赤道平行的切线)。在格林威治以东的区域时间是比较快的(+小时),而以西的地方当然就是较慢(-小时)。
以北京为例,因为北京在格林威治的东方 (大概120东经),因此北京时间会比 GMT 时间快 8 小时 (GMT + 8)。当格林威治时间为零点,北京就已经是早上八点了。
系统时间:表示系统内运行的时间
硬件时间:指硬件设备中,如BIOS的时间。系统时间由硬件时间和系统时区进行设置。系统在启动的时候,会从硬件设备中读取硬件时间,并根据系统时区进行修改,然后写入到系统时间内。同样,系统关闭时,也会读取系统时间,然后写入硬件时间。
UTC(协和标准时间):在计算时间时,最准确的计算应该是使用“原子震动周期”所计算的物理时间(Atomic Clock),也被称为原子钟,由原子钟计算的时间被定义为标准时间(Interational Atomic Time)。而UTC时间就是利用这种物理时钟为基准所定义出来的正确时间。
二、NTP通信协议
计算机主要是以 BIOS 内部的时间为主要的时间依据,而偏偏这个时间可能因为 BIOS 内部芯片本身的问题,而导致 BIOS 时间与标准时间 (UTC) 有一点点的差异存在。所以,为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步(synchronize)的工作就显的很重要了。
那么怎么让时间同步化?如果我们选择几部主要主机(Primary server) 调校时间,让这些Primary Servers的时间同步之后,再开放网络服务来让 Client 端联机,并且提供Client端调整Client自己的时间,就可以达到全部的计算机时间同步化的运作。
NTP协议是通过Server和Client的方式进行的,通讯的过程是:
1. 首先,主机需要启动这个NTP服务
2. Client 会向 NTP Server发送出调校时间的message
3. 然后 NTP Server 会送出目前的标准时间给Client
4. Client 接收了来自Server的时间后,会据以调整自己的时间,以实现网络校时。
虽然网络上有很多公开的NTP服务器,但在使用的时候需要注意。由于网络传输是有延时的,当Client对一个延时比较厉害的服务器发送请求后,直到最后Client获得时间,期间可能会出现一个由于网络延时导致的的时间差。所以,建议大家选择离自己最近的NTP服务器作为校验的标准。
三、NTP服务器设置文件
1. /etc/ntp.conf:这个是NTP daemon的主要设文件,也是 NTP 唯一的设定文件。
2. /usr/share/zoneinfo/:在这个目录下的文件其实是规定了各主要时区的时间设定文件,例如北京地区的时区设定文件在 /usr/share/zoneinfo/Asia/Beijing 就是了。这个目录里面的文件与底下要谈的两个文件(clock 与localtime)是有关系的。
3. /etc/sysconfig/clock:这个文件其实也不包含在NTP 的 daemon 当中,因为这个是 linux 的主要时区设定文件。每次开机后,Linux 会自动的读取这个文件来设定自己系统所默认要显示的时间。
4. /etc/localtime:这个文件就是“本地端的时间配置文件”。刚刚那个clock 文件里面规定了使用的时间设置文件(ZONE) 为 /usr/share/zoneinfo/Asia/Beijing ,所以说,这就是本地端的时间了,此时, Linux系统就会将Beijing那个文件另存为一份 /etc/localtime文件,所以未来我们的时间显示就会以Beijing那个时间设定文件为准。
5. /etc/timezone:系统时区文件
6. /bin/date:这个是 Linux 系统上面常见的日期与时间输出指令,用途很广。除了输出时间外,也可以修改时间
7. /sbin/hwclock:这是一个 root 才能执行的指令,因为 Linux 系统上面 BIOS 时间与 Linux 系统时间是分开的,所以使用date指令调整了时间之后,还需要使用 hwclock 才能将修改过后的时间写入 BIOS 当中。
8. /usr/sbin/ntpd:这就是 NTP 的主要 daemon 文件。得要启动他才能提供 NTP 服务。注意,这个指令默认会参考/etc/ntp.conf 里面的设定。
9. /usr/sbin/ntpdate:这个就是Client 端用来连接NTP Server 的主要执行文件。如果您没有要启用NTP 而仅想要使用NTP Client功能的话,那么只会用到这个指令。
10. /usr/sbin/ntptrace:这个指令可以用来追踪某台时间服务器的时间对应关系。
四、系统时间自动变更的问题
有时候会发现服务器在每次重启后,时间会自动的变更,以至带来很多的麻烦。(例如日志记录混乱,OA系统登记信息错误等)导致这样的问题基本上有两个:
1. 服务器硬件造成的,如电池电量不够;
2. 系统问题,通常是因为时区错误。
让我们以一个实际例子为例:
系统:红旗 DC Server 5.0 for x86
通常,由于我们所在的时区是GMT +8(中国),所以,出现问题会发现这样的情况: [root@linux ~] # date 042519302006 Tue Apr 25 19:31:00 CST 2006 [root@linux ~] # hwclock –r Tue Apr 25 11:31:36 2006 -0.432139 seconds
也就是,系统时间比硬件时间增加了8小时。 [root@linux ~] # cat /etc/timezone Asia/Beijing 接下来,查看系统时间的配置文件 [root@linux ~] # cat /etc/sysconfig/clock ZONE="Asia/Beijing" UTC=false ARC=false 要保证上述的Zone环境配置是对应的。然后修改本地时间文件: [root@linux ~] # cd /usr/share/zoneinfo/Asia/ [root@linux ~] # cp Beijing /etc/localtime 拷贝正确的本地时间文件(或链接) 最后,把硬件时间重新设置为系统时间,然后重新启动,以生效: [root@linux ~] # hwclock --hctosys 如果现在我这部主机搬到日本东京去了,那么应该如何调整时间呢? [root@linux ~] # rm /etc/localtime [root@linux ~] # cp –a /usr/share/zoneinfo/Asia/Tokyo /etc/localtime [root@linux ~] # vi /etc/sysconfig/clock ZONE=“Asia/Tokyo” UTC=false ARC=false |
在 NTP Server 的设定上面,其实最好不要对 Internet 无限制的开放,尽量仅提供您自己内部的 Client 端联机进行网络校时就好。此外, NTP Server 总也是需要网络上面较为准确的主机来自行更新自己的时间啊,所以在我们的 NTP Server 上面也要找一部最靠近自己的 Time Server 来进行自我校正。事实上, NTP 这个服务也是 Server/Client 的一种模式。
接下来,谈一谈如何在ntp.conf里设置权限控制。
[root@linux ~]# vi /etc/ntp.conf # 1. 关于权限设定部分 # 权限的设定主要以 restrict 这个参数来设定,主要的语法为: # restrict IP mask netmask_IP parameter # 其中 IP 可以是软件地址,也可以是 default ,default 就类似 0.0.0.0 # 至于 paramter 则有: # ignore :关闭所有的 NTP 联机服务 # nomodify:表示 Client 端不能更改 Server 端的时间参数,不过,
# Client 端仍然可以透过 Server 端来进行网络校时。 # notrap :不提供trap这个远程事件登入 # 如果 paramter 完全没有设定,那就表示该 IP (或网域)“没有任何限制”
restrict default nomodify notrap noquery # 关闭所有的 NTP 要求封包 server 1.pool.ntp.org server 2.pool.ntp.org server cn.pool.ntp.org prefer #其他设置值,以系统默认值即可 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift 然后修改一下/etc/sysconfig/ntpd OPTIONS=“-u ntp:ntp –p /var/run/ntpd.pid” SYNC_HWCLOCK=yes #将它改成yes,这样BIOS的时间也会跟着改变的 |
在启动NTP服务前,先对提供服务的这台主机手动的校正一次时间咯。(因为启动服务器,端口会被服务端占用,就不能手动同步时间了)
[root@linux ~] # ntpdate cn.pool.ntp.org
25 Apr 14:33:51 ntpdate[8310]: step time server 80.85.129.2 offset 6.655976 sec 然后,启动ntpd服务: [root@linux ~] # service ntpd start 或 [root@linux ~] # /etc/init.d/ntpd start 查看端口: [root@linux ~] # netstat -ln|grep 123 udp 0 0 192.168.228.153:123 0.0.0.0:* udp 0 0 127.0.0.1:123 0.0.0.0:* udp 0 0 0.0.0.0:123 0.0.0.0:* udp 0 0 :::123 :::* |
[root@linux ~] # ntpstat
synchronized to NTP server(127.127.1.0) at stratum 11 time correct to within 950ms polling server every 64 s #改指令可列出NTP服务器是否与上层联机。由上述输出结果可知,时间校正约 #为950*10(-6)秒。且每隔64秒会主动更新时间。 |
常见的错误:
25 Apr 15:30:17 ntpdate[11520]: no server suitable for synchronization found
其实,这不是一个错误。而是由于每次重启NTP服务器之后大约要3-5分钟客户端才能与server建立正常的通讯连接。当此时用客户端连接服务端就会报这样的信息。一般等待几分钟就可以了。
[root@linux ~] # ntptrace –n 127.0.0.1
127.0.0.1:stratum 11, offset 0.000000,synch distance 0.950951 222.73.214.125:stratum 2,offset –0.000787,synch distance 0.108575 209.81.9.7:stratum 1,offset 0.000028,synch distance 0.00436,refid ‘GPS’ #这个指令可以列出目前NTP服务器(第一层)与上层NTP服务器(第二层)彼此之间的 #关系 [root@linux ~] # ntpq –p |