扣丁學堂之Linux上使用NTP如何獲取精確的時間分享
如何保持正確的時間,如何使用NTP和systemd讓你的計算機在不濫用時間服務器的前提下保持同步。

它的時間是多少
讓Linux來告訴你時間的時候,它是很奇怪的。你可能認為是使用time命令來告訴你時間,其實并不是,因為time只是一個測量一個進程運行了多少時間的計時器。為得到時間,你需要運行的是date命令,你想查看更多的日期,你可以運行cal命令。文件上的時間戳也是一個容易混淆的地方,因為根據你的發行版默認情況不同,它一般有兩種不同的顯示方法。下面是來自Ubuntu16.04LTS的示例:
$ls-l
drwxrwxr-x5carlacarla4096Mar272017stuff
drwxrwxr-x2carlacarla4096Dec811:32things
-rw-rw-r--1carlacarla626052Nov2112:07fatpdf.pdf
-rw-rw-r--1carlacarla2781Apr182017oddlots.txt
有些顯示年,有些顯示時間,這樣的方式讓你的文件更混亂。GNU默認的情況是,如果你的文件在六個月以內,則顯示時間而不是年。我想這樣做可能是有原因的。如果你的Linux是這樣的,嘗試用ls-l--time-style=long-iso命令,讓時間戳用同一種方式去顯示,按字母順序排序。請查閱如何更改Linux的日期和時間:簡單的命令去學習Linux上管理時間的各種方法。
檢查當前設置
NTP——網絡時間協議,它是保持計算機正確時間的老式方法。ntpd是NTP守護程序,它通過周期性地查詢公共時間服務器來按需調整你的計算機時間。它是一個簡單的、輕量級的協議,使用它的基本功能時設置非常容易。systemd通過使用systemd-timesyncd.service已經越俎代庖地“干了NTP的活”,它可以用作ntpd的客戶端。
在我們開始與NTP“打交道”之前,先花一些時間來了檢查一下當前的時間設置是否正確。
你的系統上(至少)有兩個時鐘:系統時間——它由Linux內核管理,第二個是你的主板上的硬件時鐘,它也稱為實時時鐘(RTC)。當你進入系統的BIOS時,你可以看到你的硬件時鐘的時間,你也可以去改變它的設置。當你安裝一個新的Linux時,在一些圖形化的時間管理器中,你會被詢問是否設置你的RTC為UTC(世界標準時間CoordinatedUniversalTime)時區,因為所有的時區和夏令時都是基于UTC的。你可以使用hwclock命令去檢查:
$sudohwclock--debug
hwclockfromutil-linux2.27.1
Usingthe/devinterfacetotheclock.
HardwareclockisonUTCtime
AssuminghardwareclockiskeptinUTCtime.
Waitingforclocktick...
...gotclocktick
TimereadfromHardwareClock:2018/01/2222:14:31
Hwclocktime:2018/01/2222:14:31=1516659271secondssince1969
Timesincelastadjustmentis1516659271seconds
CalculatedHardwareClockdriftis0.000000seconds
Mon22Jan201802:14:30PMPST.202760seconds
HardwareclockisonUTCtime表明了你的計算機的RTC是使用UTC時間的,雖然它把該時間轉換為你的本地時間。如果它被設置為本地時間,它將顯示Hardwareclockisonlocaltime。
你應該有一個/etc/adjtime文件。如果沒有的話,使用如下命令同步你的RTC為系統時間,
$sudohwclock-w
這個命令將生成該文件,內容看起來類似如下:
$cat/etc/adjtime
0.00000015166619530.000000
1516661953
UTC
新發明的systemd方式是去運行timedatectl命令,運行它不需要root權限:
$timedatectl
Localtime:Mon2018-01-2214:17:51PST
Universaltime:Mon2018-01-2222:17:51UTC
RTCtime:Mon2018-01-2222:17:51
Timezone:America/Los_Angeles(PST,-0800)
Networktimeon:yes
NTPsynchronized:yes
RTCinlocalTZ:no
RTCinlocalTZ:no表明它使用UTC時間。那么怎么改成使用本地時間?這里有許多種方法可以做到。最簡單的方法是使用一個圖形配置工具,比如像openSUSE中的YaST。你也可使用timedatectl:
$timedatectlset-local-rtc0
或者編輯/etc/adjtime,將UTC替換為LOCAL。
systemd-timesyncd客戶端
現在,我已經累了,但是我們剛到非常精彩的部分。誰能想到計時如此復雜?我們甚至還沒有了解到它的皮毛;閱讀man8hwclock去了解你的計算機如何保持時間的詳細內容。
systemd提供了systemd-timesyncd.service客戶端,它可以查詢遠程時間服務器并調整你的本地系統時間。在/etc/systemd/timesyncd.conf中配置你的(時間)服務器。大多數Linux發行版都提供了一個默認配置,它指向他們維護的時間服務器上,比如,以下是Fedora的:
[Time]
#NTP=
#FallbackNTP=0.fedora.pool.ntp.org1.fedora.pool.ntp.org
你可以輸入你希望使用的其它時間服務器,比如你自己的本地NTP服務器,在NTP=行上輸入一個以空格分隔的服務器列表。(別忘了取消這一行的注釋)NTP=行上的任何內容都將覆蓋掉FallbackNTP行上的配置項。
如果你不想使用systemd呢?那么,你將需要NTP就行。
配置NTP服務器和客戶端
配置你自己的局域網NTP服務器是一個非常好的實踐,這樣你的網內計算機就不需要不停查詢公共NTP服務器。在大多數Linux上的NTP都來自ntp包,它們大多都提供/etc/ntp.conf文件去配置時間服務器。查閱NTP時間服務器池去找到你所在的區域的合適的NTP服務器池。然后在你的/etc/ntp.conf中輸入4-5個服務器,每個服務器用單獨的一行:
driftfile/var/ntp.drift
logfile/var/log/ntp.log
server0.europe.pool.ntp.org
server1.europe.pool.ntp.org
server2.europe.pool.ntp.org
server3.europe.pool.ntp.org
driftfile告訴ntpd它需要保存用于啟動時使用時間服務器快速同步你的系統時鐘的信息。而日志也將保存在他們自己指定的目錄中,而不是轉儲到syslog中。如果你的Linux發行版默認提供了這些文件,請使用它們。
現在去啟動守護程序;在大多數主流的Linux中它的命令是sudosystemctlstartntpd。讓它運行幾分鐘之后,我們再次去檢查它的狀態:
$ntpq-p
remoterefidsttwhenpollreachdelayoffsetjitter
=========================================================
+dev.smatwebdesi192.168.194.893u25643792.456-6.39518.530
*chl.la127.67.113.922u23643775.1758.8208.230
+four0.fairy.mat35.73.197.1442u226437116.272-10.03340.151
-195.21.152.161195.66.241.22u276437107.5591.82227.346
我不知道這些內容是什么意思,但重要的是,你的守護程序已經與時間服務器開始對話了,而這正是我們所需要的。你可以去運行sudosystemctlenablentpd命令,永久啟用它。如果你的Linux沒有使用systemd,那么,給你留下的家庭作業就是找出如何去運行ntpd。
現在,你可以在你的局域網中的其它計算機上設置systemd-timesyncd,這樣它們就可以使用你的本地NTP服務器了,或者,在它們上面安裝NTP,然后在它們的/etc/ntp.conf上輸入你的本地NTP服務器。
NTP服務器會受到攻擊,而且需求在不斷增加。你可以通過運行你自己的公共NTP服務器來提供幫助。下周我們將學習如何運行你自己的公共服務器。
最后想要了解更多關于Linux發展前景趨勢,請關注扣丁學堂Linux培訓官網、微信等平臺,扣丁學堂IT職業在線學習教育平臺為您提供權威的Linux視頻教程系統,通過千鋒扣丁學堂金牌講師在線錄制的Linux視頻教程課程,讓你快速掌握Linux從入門到精通開發實戰技能。扣丁學堂Linux技術交流群:659974587。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。












