在Linux上使用NTP保持精確的時(shí)間
如何保持正確的時(shí)間,如何使用 NTP 和 systemd 讓你的計(jì)算機(jī)在不濫用時(shí)間服務(wù)器的前提下保持同步。
它的時(shí)間是多少?
讓 Linux 來(lái)告訴你時(shí)間的時(shí)候,它是很奇怪的。你可能認(rèn)為是使用 time
命令來(lái)告訴你時(shí)間,其實(shí)并不是,因?yàn)?time
只是一個(gè)測(cè)量一個(gè)進(jìn)程運(yùn)行了多少時(shí)間的計(jì)時(shí)器。為得到時(shí)間,你需要運(yùn)行的是 date
命令,你想查看更多的日期,你可以運(yùn)行 cal
命令。文件上的時(shí)間戳也是一個(gè)容易混淆的地方,因?yàn)楦鶕?jù)你的發(fā)行版默認(rèn)情況不同,它一般有兩種不同的顯示方法。下面是來(lái)自 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
有些顯示年,有些顯示時(shí)間,這樣的方式讓你的文件更混亂。GNU 默認(rèn)的情況是,如果你的文件在六個(gè)月以內(nèi),則顯示時(shí)間而不是年。我想這樣做可能是有原因的。如果你的 Linux 是這樣的,嘗試用 ls -l --time-style=long-iso
命令,讓時(shí)間戳用同一種方式去顯示,按字母順序排序。請(qǐng)查閱 如何更改 Linux 的日期和時(shí)間:簡(jiǎn)單的命令 去學(xué)習(xí) Linux 上管理時(shí)間的各種方法。
檢查當(dāng)前設(shè)置
NTP —— 網(wǎng)絡(luò)時(shí)間協(xié)議,它是保持計(jì)算機(jī)正確時(shí)間的老式方法。ntpd
是 NTP 守護(hù)程序,它通過(guò)周期性地查詢公共時(shí)間服務(wù)器來(lái)按需調(diào)整你的計(jì)算機(jī)時(shí)間。它是一個(gè)簡(jiǎn)單的、輕量級(jí)的協(xié)議,使用它的基本功能時(shí)設(shè)置非常容易。systemd 通過(guò)使用 systemd-timesyncd.service
已經(jīng)越俎代庖地 “干了 NTP 的活”,它可以用作 ntpd
的客戶端。
在我們開(kāi)始與 NTP “打交道” 之前,先花一些時(shí)間來(lái)了檢查一下當(dāng)前的時(shí)間設(shè)置是否正確。
你的系統(tǒng)上(至少)有兩個(gè)時(shí)鐘:系統(tǒng)時(shí)間 —— 它由 Linux 內(nèi)核管理,第二個(gè)是你的主板上的硬件時(shí)鐘,它也稱為實(shí)時(shí)時(shí)鐘(RTC)。當(dāng)你進(jìn)入系統(tǒng)的 BIOS 時(shí),你可以看到你的硬件時(shí)鐘的時(shí)間,你也可以去改變它的設(shè)置。當(dāng)你安裝一個(gè)新的 Linux 時(shí),在一些圖形化的時(shí)間管理器中,你會(huì)被詢問(wèn)是否設(shè)置你的 RTC 為 UTC(世界標(biāo)準(zhǔn)時(shí)間)時(shí)區(qū),因?yàn)樗械臅r(shí)區(qū)和夏令時(shí)都是基于 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
表明了你的計(jì)算機(jī)的 RTC 是使用 UTC 時(shí)間的,雖然它把該時(shí)間轉(zhuǎn)換為你的本地時(shí)間。如果它被設(shè)置為本地時(shí)間,它將顯示 Hardware clock is on local time
。
你應(yīng)該有一個(gè) /etc/adjtime
文件。如果沒(méi)有的話,使用如下命令同步你的 RTC 為系統(tǒng)時(shí)間,
$ sudo hwclock -w
這個(gè)命令將生成該文件,內(nèi)容看起來(lái)類(lèi)似如下:
$ cat /etc/adjtime
0.000000 1516661953 0.000000
1516661953
UTC
新發(fā)明的 systemd 方式是去運(yùn)行 timedatectl
命令,運(yùn)行它不需要 root 權(quán)限:
$ 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 時(shí)間。那么怎么改成使用本地時(shí)間?這里有許多種方法可以做到。最簡(jiǎn)單的方法是使用一個(gè)圖形配置工具,比如像 openSUSE 中的 YaST。你也可使用 timedatectl
:
$ timedatectl set-local-rtc 0
或者編輯 /etc/adjtime
,將 UTC
替換為 LOCAL
。
systemd-timesyncd 客戶端
現(xiàn)在,我已經(jīng)累了,但是我們剛到非常精彩的部分。誰(shuí)能想到計(jì)時(shí)如此復(fù)雜?我們甚至還沒(méi)有了解到它的皮毛;閱讀 man 8 hwclock
去了解你的計(jì)算機(jī)如何保持時(shí)間的詳細(xì)內(nèi)容。
systemd 提供了 systemd-timesyncd.service
客戶端,它可以查詢遠(yuǎn)程時(shí)間服務(wù)器并調(diào)整你的本地系統(tǒng)時(shí)間。在 /etc/systemd/timesyncd.conf
中配置你的(時(shí)間)服務(wù)器。大多數(shù) Linux 發(fā)行版都提供了一個(gè)默認(rèn)配置,它指向他們維護(hù)的時(shí)間服務(wù)器上,比如,以下是 Fedora 的:
[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org 1.fedora.pool.ntp.org
你可以輸入你希望使用的其它時(shí)間服務(wù)器,比如你自己的本地 NTP 服務(wù)器,在 NTP=
行上輸入一個(gè)以空格分隔的服務(wù)器列表。(別忘了取消這一行的注釋?zhuān)?code>NTP= 行上的任何內(nèi)容都將覆蓋掉 FallbackNTP
行上的配置項(xiàng)。
如果你不想使用 systemd 呢?那么,你將需要 NTP 就行。
配置 NTP 服務(wù)器和客戶端
配置你自己的局域網(wǎng) NTP 服務(wù)器是一個(gè)非常好的實(shí)踐,這樣你的網(wǎng)內(nèi)計(jì)算機(jī)就不需要不停查詢公共 NTP 服務(wù)器。在大多數(shù) Linux 上的 NTP 都來(lái)自 ntp
包,它們大多都提供 /etc/ntp.conf
文件去配置時(shí)間服務(wù)器。查閱 NTP 時(shí)間服務(wù)器池 去找到你所在的區(qū)域的合適的 NTP 服務(wù)器池。然后在你的 /etc/ntp.conf
中輸入 4 - 5 個(gè)服務(wù)器,每個(gè)服務(wù)器用單獨(dú)的一行:
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
它需要保存用于啟動(dòng)時(shí)使用時(shí)間服務(wù)器快速同步你的系統(tǒng)時(shí)鐘的信息。而日志也將保存在他們自己指定的目錄中,而不是轉(zhuǎn)儲(chǔ)到 syslog 中。如果你的 Linux 發(fā)行版默認(rèn)提供了這些文件,請(qǐng)使用它們。
現(xiàn)在去啟動(dòng)守護(hù)程序;在大多數(shù)主流的 Linux 中它的命令是 sudo systemctl start ntpd
。讓它運(yùn)行幾分鐘之后,我們?cè)俅稳z查它的狀態(tài):
$ 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
我不知道這些內(nèi)容是什么意思,但重要的是,你的守護(hù)程序已經(jīng)與時(shí)間服務(wù)器開(kāi)始對(duì)話了,而這正是我們所需要的。你可以去運(yùn)行 sudo systemctl enable ntpd
命令,永久啟用它。如果你的 Linux 沒(méi)有使用 systemd,那么,給你留下的家庭作業(yè)就是找出如何去運(yùn)行 ntpd
。
現(xiàn)在,你可以在你的局域網(wǎng)中的其它計(jì)算機(jī)上設(shè)置 systemd-timesyncd
,這樣它們就可以使用你的本地 NTP 服務(wù)器了,或者,在它們上面安裝 NTP,然后在它們的 /etc/ntp.conf
上輸入你的本地 NTP 服務(wù)器。
NTP 服務(wù)器會(huì)受到攻擊,而且需求在不斷增加。你可以通過(guò)運(yùn)行你自己的公共 NTP 服務(wù)器來(lái)提供幫助。下周我們將學(xué)習(xí)如何運(yùn)行你自己的公共服務(wù)器。