📄 0440ntp.htm
字号:
(UTC)与系统时间的误差</span><br />
<div class=block2>
了解了一些时区的概念之后,这里要谈的是『<span class=text_import2>什么是正确的时间</span>』。
在计算时间的时候,最准确的计算应该是使用『<span class=text_import2>原子震荡周期</span>』所计算的物理时钟了
(Atomic Clock, 也被称为原子钟),这也被定义为标准时间 (International Atomic Time)。而我们常常看见的
UTC 也就是 <span class=text_import2>Coordinated Universal Time (协和标准时间)</span>就是利用这种
Atomic Clock 为基准所定义出来的正确时间。例如 1999 年在美国启用的原子钟 NIST F-1,
他所产生的时间误差每两千年才差一秒钟!真的是很准呐!这个 UTC 标准时间是以 GMT
这个时区为主的喔!所以本地时间与 UTC 时间的时差就是本地时间与 GMT 时间的时差就是了!<br /><br />
事实上,在我们的身边就有很多的原子钟,例如石英表,还有电脑主机上面的 BIOS
内部就含有一个原子钟在纪录与计算时间的进行呐!不过由于原子钟主要是利用计算晶片 (crystal)
的原子震荡周期去计时的,这是因为每种晶片都有自己的独特的震荡周期之故。
然而因为这种晶片的震荡周期在不同的晶片之间多多少少都会有点差异性,
甚至同一批晶片也可能会或多或少有些许的差异(就连温度也可能造成这样的误差呢!),因此也就造成了 BIOS
的时间会三不五时的给他快了几秒或者慢了几秒。<br /><br />
或许您会认为,BIOS 计时器每天快个五秒也没有什么了不起的,不过如果您再仔细的算一算,会发现,一天快五秒,
那么一个月快2.5分钟,一年就快了 75 分钟了!所以说,呵呵!时间差是真的会存在的!
那么如果您的电脑真的有这样的情况,那要怎么来重新校正时间呢?那就需要『网路校时』
(Network Time Protocol, NTP) 的功能了!底下我们就谈一谈那个 NTP 的 daemon 吧!<br /><br />
</div>
<hr /><a NAME="theory_NTP"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">NTP 通讯协定</span><br />
<div class=block2>
如同前面说的,电脑主机主要是以 BIOS 内部的时间为主要的时间依据,而偏偏这个时间可能因为 BIOS
内部晶片本身的问题,而导致 BIOS 时间与标准时间 (UTC) 有一点点的差异存在!
所以为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步 (synchronize) 的工作就显的很重要了!<br /><br />
那么怎么让时间同步化呢?想一想,如果我们选择几部主要主机 (Primary server) 调校时间,让这些
Primary Servers 的时间同步之后,再开放网路服务来让 Client 端连线,并且提供 Client
端调整自己的时间,不就可以达到全部的电脑时间同步化的运作了吗!那么什么协定可以达到这样的功能呢?那就是
<span class=text_import2>Network Time Protocol</span> ,另外还有
Digital Time Synchronization Protocol (DTSS) 也可以达到相同的功能!<br /><br />
不过,到底 NTP 这个 daemon 是如何让 Server 与 Client 同步他们的时间呢?<br />
<ol><span class=text_import2>
<li>首先,主机当然需要启动这个 daemon ,之后,
<li>Client 会向 NTP Server 发送出调校时间的 message ,
<li>然后 NTP Server 会送出目前的标准时间给 Client ,
<li>Client 接收了来自 Server 的时间后,会据以调整自己的时间,就达成了网路校时咯!
</span></ol>
不过,在上面的步骤中您有没有想到一件事啊,那就是<span class=text_import2>如果 Client 到 Server
的讯息传送时间过长怎么办</span>?举例来说,我在台湾以 ADSL 的 PC 主机,连线到美国的 NTP Server
主机进行时间同步化要求,而美国 NTP Server 收到我的要求之后,就发送当时的正确时间给我,不过,
由美国将资料传送回我的 PC 时,时间可能已经延迟了 10 秒钟去了!这样一来,我的 PC
校正的时间是 10 秒钟前的标准时间喔!此外,如果美国那么 NTP 主机有太多的人喜欢上去进行网路校时了,所以
loading (负荷) 太重啦!导致讯息的回传又延迟的更为严重!那怎么办?<br /><br />
为了这些延迟的问题,有一些 program 已经开发了自动计算时间传送过程的误差,以更准确的校准自己的时间!当然啦,在
daemon 的部分,也同时以 server/client 及 master/slave 的架构来提供使用者进行网路校时的动作!所谓的
master/slave 就有点类似 DNS 的系统咯!举例来说,台湾的标准时间主机去国际标准时间的主机校时,
然后各大专院校再到台湾的标准时间校时,然后我们再到各大专院校的标准时间校时!这样一来,那几部国际标准时间主机
(Time server) 的 loading 就不至于太大,而我们也可以很快速的达到正确的网路校时的目的呢!台湾常见的
Time Server 有∶<br />
<ul><span class=text_import2>
<li>tock.stdtime.gov.tw
<li>time.stdtime.gov.tw
<li>clock.stdtime.gov.tw
<li>freq_f.stdtime.gov.tw
<li>tick.stdtime.gov.tw
</span></ul>
至于 ntp 这个 daemon 是以 port 123 为连结的埠口 (使用 UDP 封包),所以我们要利用 Time server
来进行时间的同步更新时,就得要使用 NTP 套件提供的 ntpdate 来进行 port 123
的连线喔!关于网路校时更多的说明,可以到 NTP 的官方网站上察看喔!<br />
<ul><a href="http://www.ntp.org" target="blank">http://www.ntp.org</a></ul>
</div>
</div>
<hr /><a NAME="server"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">NTP 伺服器的安装与设定</span><br />
<div class=block1>
NTP 伺服器也是一个很容易就可以架设成功的玩意儿,不过这个套件在不同的 distribution 上面可能有不一样的名称,
你要作的其实就是将他安装起来之后,规定一部上层 NTP 伺服器来同步化你的时间即可啊!
如果你只是想要进行你自己单部主机的时间同步化,别架设 NTP ,直接使用 NTP 用户端软体即可喔!<br /><br />
<hr /><a NAME="server_pkg"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">所需套件与套件结构</span><br />
<div class=block2>
在 CentOS 上头,你所需要的套件其实仅有 ntp 这个玩意儿而已,请自行使用 rpm 去找找看,
若没有安装,请拿出原版光碟来安装,或者利用 yum install ntp 即可啊!
万一找不到的话,那就用 Tarball 的方式来安装吧!请自行前往 ntp 官方网站下载原始码来安装先。
不过,我们还需要时区相关的资料档案,所以你需要的套件有∶<br />
<ul>
<li><span class=text_import1>ntp</span><br />
就是 NTP 伺服器的主要套件啦,包括设定档以及执行档等等,都是这个套件提供的;</li><br />
<li><span class=text_import1>tzdata</span><br />
套件名称为『 Time Zone data 』的缩写棉~主要提供了各个时区对应的显示格式。
</ul>
至于你需要的档案方面,主要有这几个玩意儿啦∶<br />
<ul>
<li><span class=text_import1>/etc/ntp.conf</span><br />
这个是 NTP daemon 的主要设定档,依据不同的版本放置的目录可能会不同,不过档名都是一样的!使用
locate ntp.conf 搜寻一下您的系统有没有这个档案吧!这也是 NTP 唯一的一个设定档案!</li><br />
<li><span class=text_import1>/usr/share/zoneinfo/</span><br />
这是个目录,这个目录是 Linux 本身提供的,而不是 NTP 所提供的。
在这个目录下的档案其实是规定了各主要时区的时间设定档案,例如台湾地区的时区设定档案在
/usr/share/zoneinfo/Asia/Taipei 就是了!这个目录里面的档案与底下要谈的两个档案 (clock 与 localtime)
是有关系的喔!</li><br />
<li><span class=text_import1>/etc/sysconfig/clock</span><br />
这个档案其实也不包含在 NTP 的 daemon 当中,因为这个是 linux 的主要时区设定档案啊!每次开机后
Linux 会自动的读取这个档案来设定自己系统所预设要显示的时间说!举个例子来说,
在我们台湾地区的本地时间设定中,这个档案内应该会出现一行『ZONE="Asia/Taipei"』的字样,
这表示我们的时间设定档案『要取用 /usr/share/zoneinfoe/Asia/Taipei 那个档案』的意思!</li><br />
<li><span class=text_import1>/etc/localtime</span><br />
这个档案就是『本地端的时间设定档』啦!刚刚那个 clock 档案里面规定了使用的时间设定档 (ZONE) 为
/usr/share/zoneinfo/Asia/Taipei ,所以说这就是本地端的时间了,此时 Linux 系统就会将 Taipei
那个档案复制一份成为 /etc/localtime ,所以未来我们的时间显示就会以 Taipei 那个时间设定档案为准。<br /><br />
好了,如果现在我这部主机搬到日本东京去了,那么我应该如何调整时间呢?其实什么调整都不需要,因为我们的
localtime 主要是分析与 UTC 时间的时差来显示的格式,所以,您只要将 /etc/sysconfig/clock 里面的 ZONE
设定成为 Asia/Tokyo 并且将 /usr/share/zoneinfo/Asia/Tokyo 复制成为 /etc/localtime
,呵呵!就能显示时间为日本东京的时间了!这样是否能够了解?</li><br />
<li><span class=text_import1>/bin/date</span><br />
这个是 Linux 系统上面常见的日期与时间输出指令,用途很广喔!除了输出时间外,也可以修改时间。</li><br />
<li><span class=text_import1>/sbin/hwclock</span><br />
这是一个 root 才能执行的指令,因为 Linux 系统上面 BIOS 时间与 Linux 系统时间是分开的,所以使用 date
这个指令调整了时间之后,还需要使用 hwclock 才能将修改过后的时间写入 BIOS 当中!</li><br />
<li><span class=text_import1>/usr/sbin/ntpd</span><br />
这就是 NTP 的主要 daemon 档案啦!得要启动他才能提供 NTP 服务。注意,这个指令预设会参考 /etc/ntp.conf
里面的设定喔!</li><br />
<li><span class=text_import1>/usr/sbin/ntpdate</span><br />
这个就是 Client 端用来连接 NTP Server 的主要执行档棉!如果您没有要启用 NTP 而仅想要使用 NTP Client
功能的话,那么只会用到这个指令而已啦!</li><br />
<li><span class=text_import1>/usr/sbin/ntptrace</span><br />
这个指令可以用来追踪某部时间伺服器的时间对应关系,这也是个很有用的指令喔!底下我们会介绍如何使用这支程式!
</ul>
接下来,我们先来谈一谈如何设计那个 /etc/ntp.conf 吧!<br /><br />
</div>
<hr /><a NAME="server_ntp.conf"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">主要设定档 ntp.conf 的处理</span><br />
<div class=block2>
如前所述,由于 NTP 时间伺服器采用类似阶层架构 (stratum) 来处理时间的同步化,
所以他使用的是类似一般 server/client 的主从架构。网路社会上面有提供一些主要与次要的时间伺服器,
这些均属于第一阶及第二阶的时间伺服器 (stratum-1, stratum-2) ,如下所示∶<br />
<ul>
<li>主要时间伺服器∶<a href="http://www.eecis.udel.edu/~mills/ntp/clock1a.html"
target="_blank">http://www.eecis.udel.edu/~mills/ntp/clock1a.html</a></li>
<li>次要时间伺服器∶<a href="http://www.eecis.udel.edu/~mills/ntp/clock2a.html"
target="_blank">http://www.eecis.udel.edu/~mills/ntp/clock2a.html</a></li>
</ul>
由于这些时间伺服器大多在国外,所以我们是否要使用这些伺服器来同步化自己的时间呢?
其实如果台湾地区已经有标准时间伺服器的话,用那部即可,不需要连线到国外啦!浪费频宽与时间啊!
而如前面提到的,台湾地区已经有第二阶的时间伺服器了,所以当然我们可以直接选择台湾地区的 NTP 主机即可。<br /><br />
<li><span class=text_import1>时间伺服器的阶层概念</span></li>
<div class=block2>
其实 NTP 的阶层概念与 DNS 很类似啦,当你架设一部 NTP 主机,这部 NTP 所向上要求同步化的那部主要主机为
stratum-1 时,那么你的 NTP 就是 stratum-2 棉!举例来说,如果我们的 NTP 是向台湾的 tock.stdtime.gov.tw
这部 stratum-2 的主机要求时间同步化,那我们的主机即为 stratum-3 ,如果还有其他的 NTP 主机向我们要求时间同步,
那么该部主机则会是 stratum-4 啦!就这样啊~
那最多可以有几个阶层?<span class=text_import2>最多可达 15 个阶层喔!</span><br /><br />
</div>
如果你评估一下,确定有架设 NTP 的需求时,我们可以直接选择台湾地区的上层 NTP 来同步化时间即可。
举例来说 tock.stdtime.gov.tw 这个国家单位的第二层主机 (stratum-2) 应该是比较适合的。
一般来说,我们在进行 NTP 主机的设定时,都会先选择多部上层的 Time Server 来做为我们这一部 NTP Server
的校正之用,选择多部的原因是因为<span class=text_import2>可以避免因为某部时间伺服器突然挂点时,
其他主机仍然可以提供我们的 NTP 主机来自我更新啊!然后我们的 NTP Server 才提供给自己的 Client
端更新时间</span>。如此一来,国家单位的 tock.stdtime.gov.tw 负载才不会太大,而我们的 Client
也可以很快速的达到校时的动作!<br /><br />
好了,我假设俺的 NTP 伺服器所需要设定的架构如下∶<br />
<ul>
<li>我的上层 NTP 伺服器共有 tock.stdtime.gov.tw, tick.stdtime.gov.tw, time.stdtime.gov.tw
三部,其中以 tock.stdtime.gov.tw 最优先使用 (prefer);
<li>不对 Internet 提供服务,仅允许来自内部网域 192.168.1.0/24 的查询而已;
<li>侦测一些 BIOS 时钟与 Linux 系统时间的差异并写入 /var/lib/ntp/drift 档案当中。
</ul>
好了,先让我们谈一谈如何在 ntp.conf 里面设定权限控制吧!<br /><br />
<hr /><li><span class=text_import1>利用 restrict 来管理权限控制</span></li>
<div class=block2>
在 ntp.conf 档案内可以利用『 restrict 』来控管权限,这个参数的设定方式为∶<br />
<table class="term"><tr><td class="term"><pre>
restrict [你的IP] mask [netmask_IP] [parameter]
</pre></td></tr></table>
其中 parameter 的参数主要有底下这些∶<br />
<ul>
<li><span class=text_import2>ignore</span><br />
拒绝所有类型的 NTP 连线;</li><br />
<li><span class=text_import2>nomodiy</span><br />
用户端不能更改 NTP 伺服器的时间参数,这即表示用户端不能使用 ntpc 与 ntpq 这两支程式来修改伺服器棉。
但用户端仍可透过这部主机来进行网路校时的;</li><br />
<li><span class=text_import2>noquery</span><br />
用户端不能够使用 ntpq, ntpc 等指令来查询时间伺服器,等于不提供 NTP 的网路校时棉;</li><br />
<li><span class=text_import2>notrap</span><br />
不提供 trap 这个远端事件登录 (remote event logging) 的功能。</li><br />
<li><span class=text_import2>notrust</span><br />
拒绝没有认证的用户端。
</ul>
那如果你没有在 parameter 的地方加上任何参数的话,这表示『<span class=text_import2>该 IP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -