home   articles   forum   masthead  
Published at 28.5.2001
作者: Ronny Ziegler
Translator: Lau Po Yu
Languages: en de nl
Support Us!
 

時間伺服器

NIS-Installation 不管你的電腦有多昂貴,總無法放下內置時鐘不怎麼準確的感覺。工作數天後,它可能會與實際時間相差數秒...

 

永遠不用再設定你的時鐘了

作為網絡上的一台電腦,準確的時鐘是必須的。假如文件有多於一個複本,你怎麼確定哪一個是最新的版本?再者,很多保安日誌都會寫入時間印記,以確保資料封包不會被中途截取或更改。
但由於生產商使用較差的硬件,令時鐘在一段時間後變得過快或過慢,經常相隔數天便要重設時鐘,十分費時。

如果出色的編程員還未為這問題找到解決方法,可以在網絡上找一些特別的時間伺服器。那些伺服器時鐘大致以原子能時鐘直接調較,而且能夠透過一種特別的協定,將時間告知其他電腦。
不過實際上是更複雜的事情,你可能還未忘記,由伺服器往用戶端的資訊訊號,只能在有限的時間內傳送 (那是自愛因斯坦發表相對論開始已知的)。更加複雜的是,你要考慮互聯網永不會有同樣的速度...

時間的準確度很大程度在於所用的時間伺服器,可以準確至百萬分之一秒。
通常只有講求非常準確的時間印記的研究機構才需要這種精確度。
對「標準」的桌面電腦而言,十分之一秒的準確度已足夠。因此,高度精確的時間伺服器 (稱為 Stratum-1-Server) 是受密碼保護的,不是所有人也可以向伺服器提出請求,以免伺服器負荷過重。
向一台 stratum-1-server 而非原子時鐘或 GPS 訊號 (稱為 Stratum-2-Server) 取得訊號的時間伺服器大多供所有人使用 (沒有密碼保護),而且可以用作時間伺服器。

以下有一些時間伺服器可供選擇:

 

安裝

所需的軟件可以在 www.ntp.org 找到,同時,傳輸協定的新版本亦已面世。如 xntp3-x.xx 的封包使用舊的協定版本,而新版本則稱為 ntp-4.0.*.tar.gz。由於新版本 4 兼容「舊」版本,你可以 (而且應該) 使用較新的版本。
很多發行本都會跟來版本 3 ntp,但由於有保安漏洞,編譯原始碼的工夫是值得的。

下載原始碼套件及卸載至 /tmp 目錄後:

>> tar zxvf ntp-4.0.*.tar.gz -C /tmp/
  
只需執行 configure-script
>> cd /tmp/ntp-4.0.99k23/
  >> ./configure
  
完成這 script 後,系統會透過以下指令檢查編譯原始碼:
>> make
  
並透過以下指令將它們複製 (不需要的) 至預設的目錄:
>> make install
  
設定檔案 - 可以在 /etc/ntp.conf 找到 - 至少有以下數行:

/etc/ntp.conf
server timeserver1.uni-sonstwo.de
  driftfile /etc/ntp.drift
  


建議你輸入多於一個時間伺服器,讓軟件自行決定哪一個較準確。使用哪一個伺服器是它自己的原則,使用最近的一個應該是最好的。以下是一些供免費使用的德國時間伺服器:

server ntp0.fau.de
  server ntps1-0.uni-erlangen.de
  server ntps1-1.uni-erlangen.de
  server ntps1-1.rz.Uni-Osnabrueck.de
  
設定檔案將程式設定妥當後可立刻使用,只需利用以下選項,在 ntpd 子目錄執行 ( root 身份) 程式:
>> cd ntpd
  >> ./ntpd -d -l/var/log/ntp.log
  
你會看到類似如下的東西:

Messages
create_sockets(123)
  interface 
   OK
  interface 
   OK
  bind() fd 3, family 2, port 123, addr 0.0.0.0, flags=1
  bind() fd 6, family 2, port 123, addr 127.0.0.1, flags=0
  bind() fd 7, family 2, port 123, addr 192.168.1.11, flags=1
  bind() fd 8, family 2, port 123, addr 172.16.186.1, flags=1
  init_io: maxactivefd 8
  resolving ntp0.fau.de
  report_event: system event 'event_restart' (0x01) status 'sync_alarm,
       sync_unspec, 1 event, event_unspec' (0xc010)
  auth_agekeys: at 1 keys 1 expired 0
  peer_clear: at 2 assoc ID 0
  newpeer: 192.168.1.11->194.178.31.21 mode 3 vers 4 poll 6 10
         flags 1 1 ttl 0 key 00000000
  


日誌檔案 (/var/log/ntp.log) 應會有類似如下的記錄:

ntpd[1733]: logging to file /var/log/ntp.log
  ntpd[1733]: ntpd 4.0.99k23 Sam Apr 14 22:06:04 CEST 2001 (1)
  ntpd[1733]: signal_no_reset: signal 13 had flags 4000000
  ntpd[1733]: precision = 35 usec
  ntpd[1733]: kernel time discipline status 0040
  ntpd[1733]: frequency initialized -26.854 from /etc/ntp.drift
  
等候一會後, ntp 將系統時間設定至準確的值。過程都在細小的步驟進行,以免遺漏數秒或時間重覆而產生問題。
假如準確的時間與系統時鐘相差大於 1000 秒,npd 會假設是硬件時鐘出錯以外的更大問題,而不會設定時間,並自動關閉。縱然差別那麼大,仍要強行令 ntpd 設定時間,你可以使用 -g 選項啟動它。

要在電腦啟動時自動設定時鐘,只需將以下數行加到你的 /sbin/init.d/boot.local 檔案中 (當然還要按你的系統更改路徑)

/usr/local/ntp-4.0.99k23/ntpd/ntpd -g -l/var/log/ntp.log
  
或編寫一段 init-script。使用 SuSE 7.0 script 如下:

/sbini/init.d/ntpd
  . /etc/rc.status
  . /etc/rc.config
  
  base=${0##*/}
  link=${base#*[SK][0-9][0-9]}
  
  test $link = $base && START_FOO=yes
  test "$START_FOO" = yes || exit 0
  
  rc_reset
  case "$1" in
      start)
  	echo -n "Starting service nptd"
  
  	startproc /pfad/zu/ntp-4.0.99k23/ntpd/ntpd -g -l/var/log/ntp.log
  
  	# Remember status and be verbose
  	rc_status -v
  	;;
      stop)
  	echo -n "Shutting down service foo"
  	## Stop daemon with killproc(8) and if this fails
  	## set echo the echo return value.
  
  	killproc -TERM /pfad/zu/ntp-4.0.99k23/ntpd/ntpd
  
  	# Remember status and be verbose
  	rc_status -v
  	;;
      restart)
  	## If first returns OK call the second, if first or
  	## second command fails, set echo return value.
  	$0 stop  &&  $0 start
  
  	# Remember status and be quiet
  	rc_status
  	;;
      *)
  	echo "Usage: $0 {start|stop|restart}"
  	exit 1
  	;;
  esac
  rc_exit
  


 

網絡中的 NTP 

在大型的網絡中,令每一台工作站向官方的 Stratus-2-Server 取得正確的時間是沒有意義的。伺服器很容易會負荷過重,建議你本地網絡上選取一台伺服器作為時間伺服器 (就稱它為Stratus-3-)
運行 ntpd 的電腦就可以成為時間伺服器。

Time-Network

在更大型的網絡上,建立超過一台時間伺服器向不同的 Stratus-2- (甚至是 Stratus-1-) 伺服器取得時間,對伺服器的可靠性會有幫助。

假如本地網絡中擁有 IP 192.168.0.1 的電腦用作時間伺服器,用戶端的 /etc/ntpd.conf 只需包含這台電腦作伺服器:

/etc/ntpd.conf
server 192.168.0.1
  driftfile /etc/ntp.drift
  


因此即使官方的 Stratus-2-Server 刪除後,用戶端仍然能取得準確的時間。