
在我們的生產環境中,我面臨 ntpd 的問題。我正在為我們的生產盒啟用 NTP 功能並觀察到一個問題。
我們在盒子的初始化過程中啟動 ntpd 守護程式。在此期間沒有網路連線。下面是我的小ntp.conf
文件
driftfile /etc/ntp.drift
logconfig =syncstatus
server pool.ntp.org iburst
一旦介面出現,我們的盒子就可以連接到網路。那次我看到 ntpd 不同步時鐘。當我這樣做時ntpq -c as
,我明白了no association id's found
。我確實等了將近30分鐘,但還是得到了no association id's found
我必須重新啟動 ntpd。重新啟動後,ntpd 同步時鐘,一切正常。但如果我重新啟動我的盒子,同樣的問題就會發生。一旦盒子出現並且互聯網可以訪問,我必須再次重新啟動 ntpd。
有人遇到類似的問題嗎?
我應該延遲啟動 ntpd 直到時間介面出現嗎?
更新
我做了一些更多的實驗,並用此更改替換了server pool.ntp.org iburst
ntpdpool pool.ntp.org iburst
自動同步時鐘。我不必重新啟動 ntpd。所以這給我帶來了另一個問題。
當我替換server
為時發生了什麼pool
?
我應該始終使用pool
關鍵字而不是server
?
我應該什麼時候使用pool
以及什麼時候應該使用server
?
我做了一些研究,發現
pool is the same as server, except it resolves one name into several addresses and uses them all
如果他們在做同樣的事情,那麼為什麼server pool.ntp.org iburst
對我不起作用卻pool pool.ntp.org iburst
起作用了。
更新
正如建議的那樣,我已經使用了pool
,server
但我的時鐘仍然無法在啟動時同步。以前no association id's found
會出現,但使用池後它會顯示清單。
GW:/admin# ntpq -c lpeer
remote refid st t when poll reach delay offset jitter
===================================================================== =========
time.google.com .POOL. 16 p - 64 0 0.000 +0.000 0.002
GW:/admin# ntpq -np
remote refid st t when poll reach delay offset jitter
time.google.com .POOL. 16 p - 64 0 0.000 +0.000 0.002
GW:/admin# ntpq -c as
ind assid status conf reach auth condition last_event cnt
===========================================================
1 34173 8811 yes none none reject mobilize 1
GW:/admin# ntpq -c "rv 34173"
associd=34173 status=8811 conf, bcast, sel_reject, 1 event, mobilize,
srcadr=0.0.0.0, srcport=0, srchost="time.google.com", dstadr=0.0.0.0,
dstport=0, leap=11, stratum=16, precision=-19, rootdelay=0.000,
rootdisp=0.000, refid=POOL, reftime=(no time), rec=(no time), reach=000,
unreach=0, hmode=3, pmode=0, hpoll=6, ppoll=10, headway=0,
flash=1400 peer_dist, peer_unreach, keyid=0, offset=+0.000, delay=0.000,
dispersion=16000.000, jitter=0.002,
filtdelay= 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00,
filtoffset= +0.00 +0.00 +0.00 +0.00 +0.00 +0.00 +0.00 +0.00,
filtdisp= 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0 16000.0
我看到閃存狀態為1400
。1400
我無法1400
在 ntp 文件中找到閃存狀態是什麼意思?
更新
它開始工作了。我替換iburst
為minpoll 3 maxpoll 4
,之後它就可以重新啟動了。我用過這樣的池子 pool pool.ntp.org minpoll 3 maxpoll 4
。我不確定這個改變有什麼不同。
我還讀到我們應該避免使用 minpoll 和 maxpoll。
Too frequent for a sustained period and public NTP services may block you. ntpd is already good at dynamically selecting the pool interval.
不管怎樣,謝謝大家對我的幫助。
答案1
當您向 ntpd 提供伺服器時,它會在啟動時將主機名稱解析為 IP 位址,並嘗試使用該 IP 位址來同步時間。如果該主機名稱無法解析,則會將其刪除。即使它確實解析了它,它也不會記住主機名,只記住 IP 位址。
如果您線路中的伺服器server
是具有固定 IP 位址(而非動態池)的本機主機,您可以將主機名稱替換為真實 IP 位址,並且即使網路未啟動,也不應將其刪除啟動。
如果您向 ntpd 提供一個池,它會保留主機名稱(並以 標記它.POOL.
)。它會定期(包括在啟動時)解析 DNS 中的主機名,並將其獲得的任何 IP 新增為單獨的項目,並刪除一些最不利的 IP。
ntpq -np
您可以使用以下命令或等效命令查看其中一些內容ntpq -n -c peers
請注意,所有這些還存在計時問題和 ntpd 版本問題。這個確切的問題已作為 ntpd 中的錯誤提交,並且有多個修復版本。如果失敗,某些版本的 ntpd 會延遲主機名稱解析,但最終可能會放棄;因此,如果您透過短暫中斷網路並重新連線進行測試,則可能不會出現該問題。此外,ntp 使用輪詢演算法,該演算法會以指數方式增加可存取和不可存取主機的主機輪詢時間(取決於您的時鐘穩定性和主機作為時間同步的有用性),上限為1024 秒(32分鐘),因此如果網路可達性發生變化,它可能需要很長時間才能注意到。 (輪詢時間和間隔列於ntpq -np
)
此外,一些引導啟動腳本使用 ntpdate 或類似工具從 ntp.conf 將系統時鐘設定為伺服器,以便在 ntpd 啟動之前部分同步時鐘。這是一次嘗試,如果失敗,ntpd 可能會以嚴重錯誤的時鐘啟動。如果只是輕微錯誤,ntp 會修復它,但如果嚴重錯誤,ntpd 可能會拒絕同步時鐘,並且在某些情況和 ntpd 版本中,可能會崩潰或退出。某些版本的 ntpd 有自己的一次性時鐘大步長選項。