作者 | Carla Schroder
譯者 | qhwdw ? ? ? ? ? 共計翻譯:100 篇 貢獻時間:140 天
如何保持正確的時間,如何使用 NTP 和 systemd 讓你的計算機在不濫用時間伺服器的前提下保持同步。
它的時間是多少?
讓 Linux 來告訴你時間的時候,它是很奇怪的。你可能認為是使用 time
命令來告訴你時間,其實並不是,因為 time
只是一個測量一個行程運行了多少時間的計時器。為得到時間,你需要執行的是 date
命令,你想檢視更多的日期,你可以執行 cal
命令。檔案上的時間戳也是一個容易混淆的地方,因為根據你的發行版預設情況不同,它一般有兩種不同的顯示方法。下麵是來自 Ubuntu 16.04 LTS 的示例:
$ ls -l
drwxrwxr-x 5 carla carla 4096 Mar 27 2017 stuff
drwxrwxr-x 2 carla carla 4096 Dec 8 11:32 things
-rw-rw-r-- 1 carla carla 626052 Nov 21 12:07 fatpdf.pdf
-rw-rw-r-- 1 carla carla 2781 Apr 18 2017 oddlots.txt
有些顯示年,有些顯示時間,這樣的方式讓你的檔案更混亂。GNU 預設的情況是,如果你的檔案在六個月以內,則顯示時間而不是年。我想這樣做可能是有原因的。如果你的 Linux 是這樣的,嘗試用 ls -l --time-style=long-iso
命令,讓時間戳用同一種方式去顯示,按字母順序排序。請查閱 如何更改 Linux 的日期和時間:簡單的命令[1] 去學習 Linux 上管理時間的各種方法。
檢查當前設定
NTP —— 網路時間協議,它是保持計算機正確時間的老式方法。ntpd
是 NTP 守護程式,它透過週期性地查詢公共時間伺服器來按需調整你的計算機時間。它是一個簡單的、輕量級的協議,使用它的基本功能時設定非常容易。systemd 透過使用 systemd-timesyncd.service
已經越俎代庖地 “幹了 NTP 的活”,它可以用作 ntpd
的客戶端。
在我們開始與 NTP “打交道” 之前,先花一些時間來了檢查一下當前的時間設定是否正確。
你的系統上(至少)有兩個時鐘:系統時間 —— 它由 Linux 核心管理,第二個是你的主機板上的硬體時鐘,它也稱為實時時鐘(RTC)。當你進入系統的 BIOS 時,你可以看到你的硬體時鐘的時間,你也可以去改變它的設定。當你安裝一個新的 Linux 時,在一些圖形化的時間管理器中,你會被詢問是否設定你的 RTC 為 UTC(世界標準時間)時區,因為所有的時區和夏令時都是基於 UTC 的。你可以使用 hwclock
命令去檢查:
$ sudo hwclock --debug
hwclock from util-linux 2.27.1
Using the /dev interface to the clock.
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
...got clock tick
Time read from Hardware Clock: 2018/01/22 22:14:31
Hw clock time : 2018/01/22 22:14:31 = 1516659271 seconds since 1969
Time since last adjustment is 1516659271 seconds
Calculated Hardware Clock drift is 0.000000 seconds
Mon 22 Jan 2018 02:14:30 PM PST .202760 seconds
Hardware clock is on UTC time
表明瞭你的計算機的 RTC 是使用 UTC 時間的,雖然它把該時間轉換為你的本地時間。如果它被設定為本地時間,它將顯示 Hardware clock is on local time
。
你應該有一個 /etc/adjtime
檔案。如果沒有的話,使用如下命令同步你的 RTC 為系統時間,
$ sudo hwclock -w
這個命令將生成該檔案,內容看起來類似如下:
$ cat /etc/adjtime
0.000000 1516661953 0.000000
1516661953
UTC
新發明的 systemd 方式是去執行 timedatectl
命令,執行它不需要 root 許可權:
$ timedatectl
Local time: Mon 2018-01-22 14:17:51 PST
Universal time: Mon 2018-01-22 22:17:51 UTC
RTC time: Mon 2018-01-22 22:17:51
Time zone: America/Los_Angeles (PST, -0800)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
RTC in local TZ: no
表明它使用 UTC 時間。那麼怎麼改成使用本地時間?這裡有許多種方法可以做到。最簡單的方法是使用一個圖形配置工具,比如像 openSUSE 中的 YaST。你也可使用 timedatectl
:
$ timedatectl set-local-rtc 0
或者編輯 /etc/adjtime
,將 UTC
替換為 LOCAL
。
systemd-timesyncd 客戶端
現在,我已經累了,但是我們剛到非常精彩的部分。誰能想到計時如此複雜?我們甚至還沒有瞭解到它的皮毛;閱讀 man 8 hwclock
去瞭解你的計算機如何保持時間的詳細內容。
systemd 提供了 systemd-timesyncd.service
客戶端,它可以查詢遠端時間伺服器並調整你的本地系統時間。在 /etc/systemd/timesyncd.conf
中配置你的(時間)伺服器。大多數 Linux 發行版都提供了一個預設配置,它指向他們維護的時間伺服器上,比如,以下是 Fedora 的:
[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org
你可以輸入你希望使用的其它時間伺服器,比如你自己的本地 NTP 伺服器,在 NTP=
行上輸入一個以空格分隔的伺服器串列。(別忘了取消這一行的註釋)NTP=
行上的任何內容都將改寫掉 FallbackNTP
行上的配置項。
如果你不想使用 systemd 呢?那麼,你將需要 NTP 就行。
配置 NTP 伺服器和客戶端
配置你自己的區域網 NTP 伺服器是一個非常好的實踐,這樣你的網內計算機就不需要不停查詢公共 NTP 伺服器。在大多數 Linux 上的 NTP 都來自 ntp
包,它們大多都提供 /etc/ntp.conf
檔案去配置時間伺服器。查閱 NTP 時間伺服器池[2] 去找到你所在的區域的合適的 NTP 伺服器池。然後在你的 /etc/ntp.conf
中輸入 4 – 5 個伺服器,每個伺服器用單獨的一行:
driftfile /var/ntp.drift
logfile /var/log/ntp.log
server 0.europe.pool.ntp.org
server 1.europe.pool.ntp.org
server 2.europe.pool.ntp.org
server 3.europe.pool.ntp.org
driftfile
告訴 ntpd
它需要儲存用於啟動時使用時間伺服器快速同步你的系統時鐘的資訊。而日誌也將儲存在他們自己指定的目錄中,而不是轉儲到 syslog 中。如果你的 Linux 發行版預設提供了這些檔案,請使用它們。
現在去啟動守護程式;在大多數主流的 Linux 中它的命令是 sudo systemctl start ntpd
。讓它執行幾分鐘之後,我們再次去檢查它的狀態:
$ ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================
+dev.smatwebdesi 192.168.194.89 3 u 25 64 37 92.456 -6.395 18.530
*chl.la 127.67.113.92 2 u 23 64 37 75.175 8.820 8.230
+four0.fairy.mat 35.73.197.144 2 u 22 64 37 116.272 -10.033 40.151
-195.21.152.161 195.66.241.2 2 u 27 64 37 107.559 1.822 27.346
我不知道這些內容是什麼意思,但重要的是,你的守護程式已經與時間伺服器開始對話了,而這正是我們所需要的。你可以去執行 sudo systemctl enable ntpd
命令,永久啟用它。如果你的 Linux 沒有使用 systemd,那麼,給你留下的家庭作業就是找出如何去執行 ntpd
。
現在,你可以在你的區域網中的其它計算機上設定 systemd-timesyncd
,這樣它們就可以使用你的本地 NTP 伺服器了,或者,在它們上面安裝 NTP,然後在它們的 /etc/ntp.conf
上輸入你的本地 NTP 伺服器。
NTP 伺服器會受到攻擊,而且需求在不斷增加。你可以透過執行你自己的公共 NTP 伺服器來提供幫助。下週我們將學習如何執行你自己的公共伺服器。
透過來自 Linux 基金會和 edX 的免費課程 “Linux 入門”[3] 來學習更多 Linux 的知識。
via: https://www.linux.com/learn/intro-to-linux/2018/1/keep-accurate-time-linux-ntp
作者:CARLA SCHRODER[5] 譯者:qhwdw 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出