在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 -ldrwxrwxr-x 5 carla carla 4096 Mar 27 2017 stuffdrwxrwxr-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è)月以?xún)?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ò)周期性地查詢(xún)公共時(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 的客戶(hù)端。
在我們開(kāi)始與 NTP “打交道” 之前,先花一些時(shí)間來(lái)了檢查一下當(dāng)前的時(shí)間設(shè)置是否正確。
你的系統(tǒng)上(至少)有兩個(gè)時(shí)鐘:系統(tǒng)時(shí)間 —— 它由 Linux  內(nèi)核管理,第二個(gè)是你的主板上的硬件時(shí)鐘,它也稱(chēng)為實(shí)時(shí)時(shí)鐘(RTC)。當(dāng)你進(jìn)入系統(tǒng)的 BIOS  時(shí),你可以看到你的硬件時(shí)鐘的時(shí)間,你也可以去改變它的設(shè)置。當(dāng)你安裝一個(gè)新的 Linux 時(shí),在一些圖形化的時(shí)間管理器中,你會(huì)被詢(xún)問(wèn)是否設(shè)置你的  RTC 為 UTC(世界標(biāo)準(zhǔn)時(shí)間)時(shí)區(qū),因?yàn)樗械臅r(shí)區(qū)和夏令時(shí)都是基于 UTC 的。你可以使用 hwclock 命令去檢查:
$ sudo hwclock --debughwclock from util-linux 2.27.1Using the /dev interface to the clock.Hardware clock is on UTC timeAssuming hardware clock is kept in UTC time.Waiting for clock tick......got clock tickTime read from Hardware Clock: 2018/01/22 22:14:31Hw clock time : 2018/01/22 22:14:31 = 1516659271 seconds since 1969Time since last adjustment is 1516659271 secondsCalculated Hardware Clock drift is 0.000000 secondsMon 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)有的話(huà),使用如下命令同步你的 RTC 為系統(tǒng)時(shí)間,
$ sudo hwclock -w
這個(gè)命令將生成該文件,內(nèi)容看起來(lái)類(lèi)似如下:
$ cat /etc/adjtime0.000000 1516661953 0.0000001516661953UTC
新發(fā)明的 systemd 方式是去運(yùn)行 timedatectl 命令,運(yùn)行它不需要 root 權(quán)限:
$ timedatectlLocal time: Mon 2018-01-22 14:17:51 PSTUniversal time: Mon 2018-01-22 22:17:51 UTCRTC time: Mon 2018-01-22 22:17:51Time zone: America/Los_Angeles (PST, -0800)Network time on: yesNTP synchronized: yesRTC 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 客戶(hù)端
現(xiàn)在,我已經(jīng)累了,但是我們剛到非常精彩的部分。誰(shuí)能想到計(jì)時(shí)如此復(fù)雜?我們甚至還沒(méi)有了解到它的皮毛;閱讀 man 8 hwclock 去了解你的計(jì)算機(jī)如何保持時(shí)間的詳細(xì)內(nèi)容。
systemd 提供了 systemd-timesyncd.service 客戶(hù)端,它可以查詢(xún)遠(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ù)器和客戶(hù)端
配置你自己的局域網(wǎng) NTP 服務(wù)器是一個(gè)非常好的實(shí)踐,這樣你的網(wǎng)內(nèi)計(jì)算機(jī)就不需要不停查詢(xún)公共 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.driftlogfile /var/log/ntp.logserver 0.europe.pool.ntp.orgserver 1.europe.pool.ntp.orgserver 2.europe.pool.ntp.orgserver 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 -premote 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ì)話(huà)了,而這正是我們所需要的。你可以去運(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ù)器。















 
 
 









 
 
 
 