閱讀117 返回首頁    go 阿裏雲 go 技術社區[雲棲]


在 Ubuntu 中使用 NTP 進行時間同步

NTP 是通過網絡來同步時間的一種 TCP/IP 協議。通常客戶端向服務器請求當前的時間,並根據結果來設置其時鍾。

這個描述是挺簡單的,實現這一功能卻是極為複雜的 - 首先要有多層 NTP 服務器,第一層 NTP 服務器連接原子時鍾,第二層、第三層服務器則擔起負載均衡的責任,以處理因特網傳來的所有請求。另外,客戶端可能也超乎你想象的複雜 - 它必須排除通訊延遲,調整時間的同時不幹擾其它在服務器中運行的進程。幸運的是,所有的這些複雜性都進行了封裝,你是不可見也不需要見到的。

在 Ubuntu 中,是使用 ntpdate 和 ntpd 來同步時間的。

timedatectl

在最新的 Ubuntu 版本中,timedatectl 替代了老舊的 ntpdate。默認情況下,timedatectl 在係統啟動的時候會立刻同步時間,並在稍後網絡連接激活後通過 socket 再次檢查一次。

如果已安裝了 ntpdate / ntptimedatectl 會退而讓你使用之前的設置。這樣確保了兩個時間同步服務不會相互衝突,同時在你升級的時候還保留原本的行為和配置。但這也意味著從舊版本的發行版升級時 ntp/ntpdate 仍會安裝,因此會導致新的基於 systemd 的時間服務被禁用。

timesyncd

在最新的 Ubuntu 版本中,timesyncd 替代了 ntpd 的客戶端的部分。默認情況下 timesyncd 會定期檢測並同步時間。它還會在本地存儲更新的時間,以便在係統重啟時做時間單步調整。

通過 timedatectl 和 timesyncd 設置的當前時間狀態和時間配置,可以使用 timedatectl status命令來進行確認。


  1. timedatectl status
  2. Local time: Fri 2016-04-29 06:32:57 UTC
  3. Universal time: Fri 2016-04-29 06:32:57 UTC
  4. RTC time: Fri 2016-04-29 07:44:02
  5. Time zone: Etc/UTC (UTC, +0000)
  6. Network time on: yes
  7. NTP synchronized: no
  8. RTC in local TZ: no

如果安裝了 NTP,並用它替代 timedatectl 來同步時間,則 NTP synchronized 將被設置為 yes

timedatectl 和 timesyncd 用來獲取時間的 nameserver 可以通過 /etc/systemd/timesyncd.conf來指定,另外在 /etc/systemd/timesyncd.conf.d/ 下還有靈活的附加配置文件。

ntpdate

由於 timedatectl 的存在,各發行版已經棄用了 ntpdate,默認不再進行安裝。如果你安裝了,它會在係統啟動的時候根據 Ubuntu 的 NTP 服務器來設置你電腦的時間。之後每當一個新的網絡接口啟動時,它就會重新嚐試同步時間 —— 在這期間隻要其涵蓋的時間差不是太大,它就會慢慢偏移時間。該行為可以通過 -B/-b 開關來進行控製。


  1. ntpdate ntp.ubuntu.com

時間服務器

默認情況下,基於 systemd 的工具都是從 ntp.ubuntu.com 請求時間同步的。經典的基於 ntpd 的服務基本上都是使用 [0-3].ubuntu.pool.ntp.org 池中的 2.ubuntu.pool.ntp.org,還有ntp.ubuntu.com,此外需要的話還支持 IPv6。如果想強製使用 IPv6,可以使用ipv6.ntp.ubuntu.com,不過這並非默認配置。

ntpd

ntp 的守護進程 ntpd 會計算你的係統時鍾的時間偏移量並且持續的進行調整,所以不會出現時間差距較大的更正,比如說,不會導致不連續的日誌。該進程隻花費少量的進程資源和內存,但對於現代的服務器來說實在是微不足道的了。

安裝

要安裝 ntpd,在終端命令行中輸入:


  1. sudo apt install ntp

配置

編輯 /etc/ntp.conf —— 增加/移除 server 行。默認配置有以下服務器:


  1. # Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
  2. # on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
  3. # more information.
  4. server 0.ubuntu.pool.ntp.org
  5. server 1.ubuntu.pool.ntp.org
  6. server 2.ubuntu.pool.ntp.org
  7. server 3.ubuntu.pool.ntp.org

修改配置文件之後,你需要重新加載 ntpd


  1. sudo systemctl reload ntp.service

查看狀態

使用 ntpq 來查看更多信息:


  1. # sudo ntpq -p
  2. remote refid st t when poll reach delay offset jitter
  3. ==============================================================================
  4. +stratum2-2.NTP. 129.70.130.70 2 u 5 64 377 68.461 -44.274 110.334
  5. +ntp2.m-online.n 212.18.1.106 2 u 5 64 377 54.629 -27.318 78.882
  6. *145.253.66.170 .DCFa. 1 u 10 64 377 83.607 -30.159 68.343
  7. +stratum2-3.NTP. 129.70.130.70 2 u 5 64 357 68.795 -68.168 104.612
  8. +europium.canoni 193.79.237.14 2 u 63 64 337 81.534 -67.968 92.792

PPS 支持

從 Ubuntu 16.04 開始,ntp 支持 PPS 規範,給 ntp 提供了本地時間源,以提供更高的精度。查看下邊列出的鏈接來獲取更多配置信息。

原文發布時間為:2017-01-05

本文來自雲棲社區合作夥伴“Linux中國”

最後更新:2017-05-31 11:03:28

  上一篇:go  如何在 Ubuntu 環境下搭建郵件服務器(三)
  下一篇:go  如何在 Ubuntu 16.10 的 Unity 8 上運行老式 Xorg 程序