Jun 062007
 

如果说有什么是在服务器部署过程中最重要然而却最容易被忽视的地方,恐怕就只有系统时间了。这玩意看来简单,但实际上大多数系统服务都直接或间接依赖于它,一台时钟不准确的服务器给出的任何结果都有可能是不可信的。所以在近几年的操作系统发行版中,都不约而同的加入了网络校时的功能。然而对于大多数sysadmin来说,这方面还是最容易忽略的。因此这里提倡,无论是在多么无关紧要的系统部署项目中,服务器上线后的第一件事情,一定不要忘记设定一个稳定的事件源并保证持续可靠的校时。


这里要注意的很关键的一点,就是校时并不是一个一次性工作,也就是说绝对不是系统安装好对照手表上的“北京时间”将系统时间设置好就算万事大吉了的。因为有很多内部或外部因素都会导致系统时间逐渐地出现误差,例如RTC晶片本身的误差,重负载系统导致的时钟滴答丢失等等等等都可能成为时间漂移的因素,因此不可能有一劳永逸绝对精准的时间,只能是持续不断地实施校时。
网络上的标准时间服务器,是挂接了专用的硬件来保证本地时间的准确,并向外发布NTP服务的,因此我们所谓的网络校时只不过是通过NTP协议链接到这些时间服务器,并取回准确时间。目前常用的方法有两种,一种是类似ntpdate工具这样周期性得连接某时间服务器并修改本地时间,这是最简单有效的方法,所要做的不过是将一条ntpdate命令加入到cron中去,一般以小时为单位运行这个命令来实现时间同步。这对于普通状况应该是足够了。象Windows,Ubuntu的桌面版本都是用此类机制实现的,一般来说,以数小时间隔对时不会有任何问题。但是在某些比较极端情况下,例如某个不合格的RTC可能跑1个小时就有5s误差这种的残疾系统,以此类方式对时会导致突然的时间跃迁,在对时完成的瞬间会产生时间突然超前或滞后5s的情况。如果此时恰好在运行高度时间敏感的程序,则可能导致程序出现不可预料的后果。因此也就有了第二种对时方法:ntpd。

ntpd是一个守护进程,它通过对比本地时间与时间服务器的时间差,来进行渐次逼近地对时,也就是说一次修正很小的误差,通过多次修正慢慢逼近准确的时间,所以能避免前面方式的缺陷,因此,在服务器环境下,使用ntpd方式会更好一些,在下认为,即使是只有单独一台服务期的情况下,也尽量使用只为本机服务的ntpd来进行网络校时,而不要使用ntpdate方式。

废话说完,开始实干,以FreeBSD系统为例,具体配置如下:

FreeBSD本身已经带有了ntpd服务,所以直接写配置文件启用即可。

1,修改/etc/rc.conf,加入一行ntpd_enable=”YES”。

2修改/etc/ntp.conf,按照自己要求写入配置选项。如果无此文件新建即可,范例配置文件附下。

3运行/etc/rc.d/ntpd start启动服务。

范例配置文件在此,取自RedHat发行版,使用了ntp.org的时间服务期作为源,限制只为本机服务,可谓适应性非常广的配置了,用于其他系统的ntpd配置也完全可以:

restrict default nomodify notrap noquery #default acl
restrict 127.0.0.1

server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

# — OUR TIMESERVERS —–
server 0.pool.ntp.org
server 1.pool.ntp.org
server 2.pool.ntp.org

到此就算架设完工,不过还有以下几点需要注意:

 1,启动ntpd之前需要运行ntpdate pool.ntp.org先同步一下时间,避免因为系统时间与时间服务期时间相差太大导致渐次逼近无法实施而造成的ntpd运行失败。

2,如果此ntpd服务需要对网络内其他服务期开放校时服务,可以加一条acl实现,如下:

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

3,启动或者重启ntpd成功后过一段时间才会进行真正的校时服务,大约是320s吧,要记住效果不是立即出现的。

4,可以通过ntpq -p命令来检查当前ntpd服务状态,注意看输出的表格中st这一项值,必须小于16,16代表无法连接时间服务器,如果都为16,则对时不能完成,需要检查网络原因。

5,ntpd服务需要开放对udp端口123的访问。

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>