剖析在Linux上使用NTP如何獲取精確的時(shí)間
2018-03-20 14:31:57
2683瀏覽
如何保持正確的時(shí)間,如何使用NTP和systemd讓你的計(jì)算機(jī)在不濫用時(shí)間服務(wù)器的前提下保持同步。
它的時(shí)間是多少
讓Linux來(lái)告訴你時(shí)間的時(shí)候,它是很奇怪的。你可能認(rèn)為是使用time命令來(lái)告訴你時(shí)間,其實(shí)并不是,因?yàn)閠ime只是一個(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)自Ubuntu16.04LTS的示例:
$ls-l
drwxrwxr-x5carlacarla4096Mar272017stuff
drwxrwxr-x2carlacarla4096Dec811:32things
-rw-rw-r--1carlacarla626052Nov2112:07fatpdf.pdf
-rw-rw-r--1carlacarla2781Apr182017oddlots.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í)間CoordinatedUniversalTime)時(shí)區(qū),因?yàn)樗械臅r(shí)區(qū)和夏令時(shí)都是基于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表明了你的計(jì)算機(jī)的RTC是使用UTC時(shí)間的,雖然它把該時(shí)間轉(zhuǎn)換為你的本地時(shí)間。如果它被設(shè)置為本地時(shí)間,它將顯示Hardwareclockisonlocaltime。
你應(yīng)該有一個(gè)/etc/adjtime文件。如果沒(méi)有的話,使用如下命令同步你的RTC為系統(tǒng)時(shí)間,
$sudohwclock-w
這個(gè)命令將生成該文件,內(nèi)容看起來(lái)類似如下:
$cat/etc/adjtime
0.00000015166619530.000000
1516661953
UTC
新發(fā)明的systemd方式是去運(yùn)行timedatectl命令,運(yùn)行它不需要root權(quán)限:
$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時(shí)間。那么怎么改成使用本地時(shí)間?這里有許多種方法可以做到。最簡(jiǎn)單的方法是使用一個(gè)圖形配置工具,比如像openSUSE中的YaST。你也可使用timedatectl:
$timedatectlset-local-rtc0
或者編輯/etc/adjtime,將UTC替換為L(zhǎng)OCAL。
systemd-timesyncd客戶端
現(xiàn)在,我已經(jīng)累了,但是我們剛到非常精彩的部分。誰(shuí)能想到計(jì)時(shí)如此復(fù)雜?我們甚至還沒(méi)有了解到它的皮毛;閱讀man8hwclock去了解你的計(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.org1.fedora.pool.ntp.org
你可以輸入你希望使用的其它時(shí)間服務(wù)器,比如你自己的本地NTP服務(wù)器,在NTP=行上輸入一個(gè)以空格分隔的服務(wù)器列表。(別忘了取消這一行的注釋)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
server0.europe.pool.ntp.org
server1.europe.pool.ntp.org
server2.europe.pool.ntp.org
server3.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中它的命令是sudosystemctlstartntpd。讓它運(yùn)行幾分鐘之后,我們?cè)俅稳z查它的狀態(tài):
$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
我不知道這些內(nèi)容是什么意思,但重要的是,你的守護(hù)程序已經(jīng)與時(shí)間服務(wù)器開(kāi)始對(duì)話了,而這正是我們所需要的。你可以去運(yùn)行sudosystemctlenablentpd命令,永久啟用它。如果你的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ù)器。
最后想要了解更多關(guān)于Linux發(fā)展前景趨勢(shì),請(qǐng)關(guān)注扣丁學(xué)堂
Linux培訓(xùn)官網(wǎng)、微信等平臺(tái),扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育平臺(tái)為您提供權(quán)威的Linux視頻教程系統(tǒng),通過(guò)千鋒扣丁學(xué)堂金牌講師在線錄制的
Linux視頻教程課程,讓你快速掌握Linux從入門到精通開(kāi)發(fā)實(shí)戰(zhàn)技能。扣丁學(xué)堂Linux技術(shù)交流群:422345477。
【關(guān)注微信公眾號(hào)獲取更多的學(xué)習(xí)資料】
查看更多關(guān)于“Linux培訓(xùn)資訊”的相關(guān)文章>>
標(biāo)簽:
Linux命令
Linux視頻教程
Linux培訓(xùn)
Linux在線學(xué)習(xí)
Linux在線視頻
Linux系統(tǒng)