计算机时间是否同步是一个简单但很重要的命题,因为很多应用都要求计算机之间的时间一致,譬如VPN的构建、AD域的认证,log日志的排错等均需要时间同步,因此,早在1985年就诞生了NTP协议,它的全称是network time protocol(网络时间协议),被广泛用于计算机时间同步。它是一个协议,任何人都可以根据这个协议开发时间同步的软件,最著名的实现是ntp.org维护的同名套件,然而OpenBSD的开发人员对这个套件并不感冒,于是他们另起炉灶,重新开发了OpenNTPd,它旨在实现:

  1. 合理地保证时间的精确性;

  2. 安全;

  3. 配置简单;

  4. 遵循BSD协议;

读者可能会对第一条产生困惑,什么叫合理地保证时间的精确性,OpenBSD的开发人员认为,没有必要尽最大的可能保证时间的精确性,只要做到一般精确(+-0.25秒)就可以了,但必须保证代码的简洁和安全。

安装

OpenBSD4.9默认安装就已包含了OpenNTPD,因此OpenBSD的用户可以省略安装这个步骤。

配置

OpenNTPd的配置文件只有一个/etc/ntpd.conf,配置也非常简单

listen on *
# listen on后面跟的是提供时间同步的IP地址,假如需要在所有IP地址上提供服务,
# 则用“*”代替;假如不需要向外提供时间同步则注释掉该选项。

server time-a.nist.org
server time-b.nist.org

servers asia.pool.ntp.org

# server
# server后面跟的是时间服务器域名或IP地址,OpenNTPD将调用dns client解析该域名,
# 假如在该域名解析出多个IP地址,OpenNTPD会优先跟第一个进行同步,万一第一个失效,
# 则OpenNTPD会再尝试跟第二个进行同步,至此最后一个。

# 假如有多个时间服务器,可以写多条server语句,譬如上面的time-a.nist.org
# 和time-b.nist.org,OpenNTPD将同这两个时间服务器进行同步;

# servers
# 它的作用跟多条server语句的作用相似,譬如asia.pool.ntp.org,
# 这是一个ntp.org维护的时间服务器群,连续执行
# hostname asia.pool.ntp.org就会解析出多个不同的IP地址,
# OpenNTPD将同所有解析出来的时间服务器进行同步。

为了方面说明,上面的例子过于冗余,实际上只用一条`servers asia.pool.ntp.org`足以满足大部分用户的需求。

中国科学院国家授时中心的公共服务意识很差劲,我google了整个Internet都找不到一个官方的时间服务器地址,倒是看到有推销其生产的时间同步设备。相反,美国这方面就做得很好。因此在本例中就选用美国的两个时间服务器。

自启动配置

/etc/rc.conf
ntpd_flags="-s" (1)
1 -s的意思当开机后,ntpd进程立刻将系统时间变更为正确的时间,而不是通过drift慢慢的将系统时间更新至正确的时间。

启动

$ doas /usr/sbin/ntpd -s

验证

  • 查看端口

    $ doas netstat -an | grep 123
    udp          0      0  10.168.1.11.20808      158.108.7.157.123
    udp          0      0  10.168.1.11.1328       59.106.180.168.123
    udp          0      0  10.168.1.11.5548       140.109.1.4.123
    udp          0      0  10.168.1.11.21989      129.6.15.29.123
    udp          0      0  10.168.1.11.13848      129.6.15.28.123
    udp          0      0  10.168.1.11.123        *.*
  • 查看进程

    $ doas ps axu | grep ntpd
    _ntp      9379  0.0  0.1   636   968 ??  Ss    11:43AM    0:00.04 ntpd: ntp engine (ntpd)
    _ntp      7130  0.0  0.1   768   932 ??  Is    11:43AM    0:00.05 ntpd: dns engine (ntpd)
    root     26733  0.0  0.1   552   772 ??  Is    11:43AM    0:00.00 ntpd: [priv] (ntpd)
  • 查看日志

    $ doas grep ntpd /var/log/messages
    
    Jun  6 10:44:29 openbsd ntpd[16964]: ntp engine ready
    Jun  6 10:44:49 openbsd ntpd[16964]: peer 184.171.168.106 now valid
    Jun  6 10:44:51 openbsd ntpd[16964]: peer 173.8.198.243 now valid
    Jun  6 10:44:59 openbsd ntpd[16964]: peer 173.9.142.98 now valid
    Jun  6 10:45:58 openbsd ntpd[2936]: adjusting local clock by 14.875577s
    Jun  6 10:48:40 openbsd ntpd[2936]: adjusting local clock by 14.072775s
    Jun  6 10:51:23 openbsd ntpd[2936]: adjusting local clock by 13.266602s
    Jun  6 10:54:40 openbsd ntpd[2936]: adjusting local clock by 12.294596s
    Jun  6 10:58:58 openbsd ntpd[2936]: adjusting local clock by 11.006576s
    Jun  6 11:00:06 openbsd ntpd[2936]: adjusting local clock by 10.671895s
    Jun  6 11:02:45 openbsd ntpd[2936]: adjusting local clock by 9.885871s
    Jun  6 11:05:21 openbsd ntpd[2936]: adjusting local clock by 9.109984s
    Jun  6 11:07:31 openbsd ntpd[2936]: adjusting local clock by 8.468130s
    Jun  6 11:10:42 openbsd ntpd[2936]: adjusting local clock by 7.521360s
    Jun  6 11:13:23 openbsd ntpd[2936]: adjusting local clock by 6.723380s
    Jun  6 11:15:35 openbsd ntpd[2936]: adjusting local clock by 6.071997s
    Jun  6 11:18:51 openbsd ntpd[2936]: adjusting local clock by 5.095530s
    Jun  6 11:20:26 openbsd ntpd[2936]: adjusting local clock by 4.630313s
    Jun  6 11:24:50 openbsd ntpd[2936]: adjusting local clock by 3.321498s
    Jun  6 11:28:38 openbsd ntpd[2936]: adjusting local clock by 2.186491s
    Jun  6 11:30:11 openbsd ntpd[2936]: adjusting local clock by 1.731629s
    Jun  6 11:34:30 openbsd ntpd[2936]: adjusting local clock by 0.440410s
    Jun  6 11:35:00 openbsd ntpd[2936]: adjusting local clock by 0.295056s
    Jun  6 11:37:44 openbsd ntpd[16964]: clock is now synced