1、linux ntp server
在信息化系统建设中,会有很多的服务器和工作站,而这些机器的时间不一致就会造成很多的不准确。 本文介绍了NTP,通过NTP来使网络中的机器时间达到一致。
2、NTP简介
2.1定义
NetworkTimeProtocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。
2.2原理
NTP提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。按照离外部UTC源的远近将所有服务器归入不同的Stratum(层)中。Stratum-1在顶层,有外部UTC接入,而Stratum-2则从Stratum-1获取时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数限制在15以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum-1的时间服务器是整个系统的基础。 计算机主机一般同多个时间服务器连接,利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间。即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。 为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。
3、Linux系统下的NTP
Linux系统下已经有ntp相关的软件包,所以在linux下使用NTP是很方便的。
3.1安装
首先,先检查两机的ntp是否已经安装:
rpm-qa|grepntp
如果没有安装可以自行去安装
rpm-ivhntp-4.2.2p1-5.el5.rpm
3.2服务配置
nptd是即做为Server,也做为client运行的,所以只有一个配置文件/etc/ntp.conf。ntp.conf里主要可以使用如下几个命令:restrict,server,driftfile,keys
3.2.1设置上级服务器(server)
server是设定上级服务器用的,可以设置多个上级服务器,以更好的校准时间。
server命令的格式是: serve r[IPorhostname][prefer]
其中[IPorhostname]为上级时间服务器的IP或者域名,主机名: 可以是192.168.12.177形式,或者http://time.nist.gov再或者ntpserver这样的形式。后面的[prefer]参数是可选的,加上prefer后,ntpserver和上级时间服务器同步时会优先先访问加了prefer这行的进行同步。
pool.ntp.org: the internet cluster of ntp servers 是NTP的官方网站,在这上面我们可以找到离我们城市最近的NTPServer.NTP建议我们为了保障时间的准确性,最少找两个个NTPServer。
如: server http://0.cn.pool.ntp.org
server http://1.cn.pool.ntp.org
http://server2.cn.pool.ntp.org
在启动NTP服务器之前先和这些服务器做一个同步,使得我们机器的时间尽量接近标准时间
.这里我们可以用ntpdate命令代码:
#ntpdate http://0.cn.pool.ntp.org
6Jul01:21:49ntpdate[4528]:steptimeserver213.222.193.35offset-38908.575181sec
#ntpdate http://0.cn.pool.ntp.org
6Jul01:21:56ntpdate[4530]:adjusttimeserver213.222.193.35offset-0.000065sec
假如你的时间差的很离谱的话第一次会看到调整的幅度比较大,所以保险起见可以运行两次.那么为什么在打开NTP服务之前先要手动运行同步呢?
a)因为根据NTP的设置,如果你的系统时间比正确时间要快的话那么NTP是不会帮你调 整的,所以要么你把时间设置回去,要么先做一个手动同步
b)当你的时间设置和NTP服务器的时间相差很大的时候,NTP会花上较长一段时间进行 调整.所以手动同步可以减少这段时间
3.2.2设置自己为时间服务器(restrict)
restrict 是设定哪台client机器可以和ntpserver进行同步,具有什么样的权限。
先来看restrict的格式为: restrict[客户端IP] mask[netmask_IP] [parameter] 客户端IP,就是都是哪几台client机器要和这台ntpserver进行同步的ip地址最后的parameter可以有如下几个参数:
ignore:拒绝连接到 ntpserver
nomodiy:可以连接到ntpserver,但是不能对ntpserver进行时间上的修改
noquery:不提供对ntpserver查询时间,也就是拒绝和ntpserver进行时间同步
notrap:不提供trap远程登录功能
notrust:对没有认证的客户端不提供服务对于默认的client拒绝所有的操作代码:
restrict default kod nomodify notrap nopeer noquery
允许本机地址一切的操作代码: restrict127.0.0.1
最后我们允许局域网内所有client连接到这台服务器同步时间.但是拒绝让他们修改服务器上的时间代码:
restrict 192.168.1.0 mask 255.255.255.0 nomodify
3.2.3杂项
driftfile 是用来指定记录时间差异的文件 我们每一个systemclock的频率都有小小的误差,这个就是为什么机器运行一段时间后会不精确.NTP会自动来监测我们时钟的误差值并予以调整.但问题是这是一个冗长的过程,所以它会把记录下来的误差先写入driftfile.这样即使你重新开机以后之前的计算结果也就不会丢失了 keys是用来指定认证key文件的(这里不用)。
3.3启动管理服务
# /etc/init.d/ntpd start
#chkconfig--level35ntpdon 服务启动后不能再进行手工同步
3.3.1 查看NTP服务的运行状况 现在我们已经启动了NTP的服务,但是我们的系统时间到底和服务器同步了没有呢?为此NTP提供了一个很好的查看工具:ntpq(NTPquery) 我建议大家在打开NTP服务器后就可以运行ntpq命令来监测服务器的运行.这里我们可以使用watch命令来查看一段时间内服务器各项数值的变化代码:
#watch ntpq -p
Every2.0s:ntpq-pSatJul700:41:452007
remote refid st t when poll reach delay offset jitter +193.60.199.75193.62.22.982u52643778.57810.203289.032
*mozart.musicbox192.5.41.412u546437719.301-60.218292.411
现在我就来解释一下其中的含义
remote:它指的就是本地机器所连接的远程NTP服务器
refid:它指的是给远程服务器(e.g.193.60.199.75)提供时间同步的服务器
st:远程服务器的级别.由于NTP是层型结构,有顶端的服务器,多层的RelayServer再到客户端.所以服务器从高到低级别可以设定为1-16.为了减缓负荷和网络堵塞,原则上应该避免直接连接到级别为1的服务器的
.t:这个.....我也不知道啥意思^_^
when:我个人把它理解为一个计时器用来告诉我们还有多久本地机器就需要和远程服务器进行一次时间同步
poll:本地机和远程服务器多少时间进行一次同步(单位为秒).在一开始运行NTP的时候这个poll值会比较小,那样和服务器同步的频率也就增加了,可以尽快调整到正确的时间范围.之后poll值会逐渐增大,同步的频率也就会相应减小
reach:这是一个八进制值,用来测试能否和服务器连接.每成功连接一次它的值就会增加
delay:从本地机发送同步要求到服务器的roundtriptime
offset:这是个最关键的值,它告诉了我们本地机和服务器之间的时间差别.offset越接近于0,我们就和服务器的时间越接近
jitter:这是一个用来做统计的值.它统计了在特定个连续的连接数里offset的分布情况.简单地说这个数值的绝对值越小我们和服务器的时间就越精确 那么大家细心的话就会发现两个问题:第一我们连接的是http://0.uk.pool.ntp.org为什么和remoteserver不一样?第二那个最前面的+和*都是什么意思呢? 第一个问题不难理解,因为NTP提供给我们的是一个clusterserver所以每次连接的得到的服务器都有可能是不一样.同样这也告诉我们了在指定NTPServer的时候应该使用hostname而不是IP 第二个问题和第一个相关,既然有这么多的服务器就是为了在发生问题的时候其他的服务器还可以正常地给我们提供服务.那么如何知道这些服务器的状态呢?这就是第一个记号会告诉我们的信息
* 它告诉我们远端的服务器已经被确认为我们的主NTPServer,我们系统的时间将由这台机器所提供+ 它将作为辅助的NTPServer和带有*号的服务器一起为我们提供同步服务.当*号服务器不可用时它就可以接管
- 远程服务器被clusteringalgorithm认为是不合格的NTPServer
x 远程服务器不可用 了解这些之后我们就可以实时监测我们系统的时间同步状况了
4、实际操作中遇到的问题: 渐变与跳变阀值
1、在client端,首先配置ntpd.conf文件,添加server ip(时间服务提供商的ip或者主机名),可以指定多个
启动ntpd服务:/etc/init.d/ntpd start
此时ntp服务启动,通过udp的123端口与server端通信,开始时间同步
2、client和server的时间同步有两种情况:时间跳变(time step)和渐变(time slew)
跳变是指在client和server间时间差过大时(默认128ms),瞬间调整client端的系统时间
渐变是指时间差较小时,通过改变client端的时钟频率,进而改变client端中“1秒”的“真实时间”,保持client端时间连续性。
举个例子,如果client端比server端慢10s,通过ntpd,client端的中每1秒现实时间是1.0005秒!虽然client端的时间仍然是1秒1秒增加的,通过调整每秒的实际时间,直到与serrver的时间相同。在这个例子中,10s/0.0005s=20000s,20000s/60/60=5.55555小时,即需要5个多小时才能消除10s的误差。
在linux中,很多应用软件依赖系统的时间连续性来正确工作,系统时间的跳变将导致软件出现意想不到的问题,所以时间渐变才是ntpd的主要应用场景。
3、那么怎么禁止ntpd的时间跳变,只采用时间渐变呢?
刚开始通过man ntpd,尝试在ntpd启动配置(/etc/sysconfig/ntpd)中加-x选项:
-xNormally, the time is slewed if the offset is less than the step threshold, which is 128 ms by default, and stepped if above the threshold. This option forces the time to be slewed in all cases. If the step threshold is set to zero, all offsets are stepped, regardless of value and regardless of the -x option. In general, this is not a good idea, as it bypasses the clock state machine which is designed to cope with large time and frequency errors Note: Since the slew rate is limited to 0.5 ms/s, each second of adjustment requires an amortization interval of 2000 s. Thus, an adjustment of many seconds can take hours or days to amortize. This option can be used with the -q option.
结果发现-x只是提高了时间跳变的阈值,在client与server时间差小于600秒时,时间的调整使用渐变,大于600秒,时间调整使用跳变形式。
查了很多资料,最后确定在ntp配置文件/etc/ntp.conf中添加字段
1、tinker panic 600
这句话的意思是在时间差大于600秒的情况下,ntpd进程自动关闭,ntpd退出时会向/var/log/messages中写入log
在时间差过大时,应该由用户手动设置系统时间或者调用ntpdate命令,这样能避免因为时间跳变出现的问题。
2、 tinker panic 0
这可以保证ntpd在时间差较大时依然工作
5、实际操作中遇到的问题: 创建机器时间
在Linux中有硬件时钟与系统时钟两种时钟。硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟。系统时钟则是指kernel中的时钟。所有Linux相关指令与函数都是读取系统时钟的设定。因为存在两种不同的时钟,那么它们之间就会存在差异。当Linux启动时,系统时钟会去读取硬件时钟的设定,之后系统时钟即独立运作。
用date命令对系统时间进行设置后,并不会去修改硬件时钟,所以系统重启后,系统时间还算会去读取硬件时间,这就是为何date设置失效到原因。
因此,需要在设置系统时间后,将系统时间同步到硬件时钟。