
我想使用通用ntpd
守護程序來測試虛擬機器是否保留時間,而不讓它實際運行調整時鐘。
我在 macOS 系統上的 VirtualBox 中執行 Solaris 11.4(Oracle 針對 Intel 的標準映像),但無法正確同步。我突然意識到,虛擬機很可能已經使用 VirtualBox Guest Additions 來執行此操作(我不知道這是如何工作的),並且我可能會因為ntpd
在來賓中運行而打亂時間。
ntpd
為了測試這一點,我想我應該在 Solaris VM 中進行設置監視器一些公共時間伺服器,但以某種方式阻止它修改本地時鐘。這樣我就可以查看loopstats
和peerstats
記錄隨時間的變化情況,以了解本地時鐘是否真正保持正確的時間。
問題是我找不到任何關於如何停止ntpd
調整本地時鐘的提示。
我過去也想在我使用openntpd
(來自 OpenBSD)進行實際計時的系統上執行此操作。然後,守護ntpd
程式就可以坐在後台進行監視,而不會進行幹擾。但當時我也找不到任何方法來實現這個目標。
答案1
恩特普德
了解你必須使用 ntpd,據我所知唯一的選擇是:
禁用 ntp
如上所見手冊ntp.conf
頁可以禁用 ntp回饋迴路,或者,通俗地說:刪除計算時間伺服器和本地時鐘之間的時間校正的能力。ntp.conf
啟動該選項所需的行是:
disable ntp
注意:使用此選項時,ntpd 向其他要求時間參考的系統提供的時間可能是錯誤的/關閉的。使用一行來deny
拒絕來自其他系統的所有時間查詢似乎是合理的,除非您想要監視來自外部系統的時間漂移(使用拒絕並允許外部系統的 IP)。
筆記:我並不完全清楚系統時鐘實際上是由 ntpd“自由運行”的。然而,它是一個已記錄的選項,因此如果 ntpd 不符合記錄的內容,那麼它就是一個錯誤。
明薩內
minsane minsane
這是時脈選擇演算法可用的候選者的最小數量,以便為聚類演算法產生一個或多個真實嵌合體。如果可用數量少於此數量,時鐘不受紀律,任其自由運行。
這是透過設定一行( in ntp.conf
)來完成的,例如:
tos minsane 100
或其他一些高數字(大於可用或已使用的伺服器)。
注意:我不清楚內核漂移值是否重置為 0 以避免時鐘值緩慢變化。額外設定disable kernel
禁用內核紀律功能可能是合理的。
有關的
ntpd-qn
當ntpd
伺服器運作時ntpq -pn
,可以報告 ntpd 伺服器在保持系統時鐘同步方面的工作情況。這是記錄時差的另一種方法。
ntpdate-q
該包ntpdate
(被標記為已棄用)可用於檢查時差:
ntpdate -q 'pool.ntp.org' # marked as deprecated.
使用ntpdate -qu 'pool.ntp.org'
該命令不需要 root 權限即可運行(-u
意味著“使用非特權網路連接埠”,但可執行檔案必須可供使用者存取)。
sntp
有一個簡單的程式可以查詢(如果沒有使用 -s 或 -S 選項則不會更改):
sntp pool.ntp.org
日期
該程式rdate
能夠顯示遠端時間(和本地時間):
rdate -np pool.ntp.org; date
其中-n
表示:使用 SNTP (RFC 2030) 代替(預設)RFC 868 時間協定;並且,僅列印結果,無需進行任何實際更改。
然而,該程式僅限於整秒(而不是分數)的分辨率。並且,它在solaris中沒有選項
慢性的
ntp(chrony)的替換包可以在不設定係統時鐘的情況下執行時差測試:
chronyd -Q 'pool pool.ntp.org iburst'
我相信這些都是檢測(不改變)互聯網ntp時間和系統時間之間的時間差的方法。
答案2
我懷疑這是ntpd
開箱即用的可能:
- 它的核心
ntpd
並沒有保留「第三個」時鐘。(其中前兩個是系統時鐘和單調時鐘)。 - 從功能上
ntpd
來說,不僅要對當前時間進行調整,還可以調整控制系統時脈運轉速度的參數。隱含地寫它是為了監視這些調整的效果。
將這兩個放在一起,ntpd 不太可能有一種模式可以正確維護這些參數的值而不進行即時調整A時鐘,唯一可用的時鐘是系統時鐘。
在你的問題中,不清楚你是否真正需要ntpd
。任何 [S]NTP 客戶端都可以。
如果您對一點程式碼感到滿意,那麼您也許可以將一些東西組合在一起,為您輪詢伺服器,而無需重新校準系統時鐘。
例如,有一個用於 python 的 NTP 庫,名為ntplib。用於列印 60 秒輪詢偏移量的腳本可能如下所示:
import ntplib
import sys
import time
def main(*args):
ntp_client = ntplib.NTPClient()
while True:
for server in args:
try:
response = ntp_client.request(server, version=3)
print(response.offset)
time.sleep(60)
except ntplib.NTPException:
print("query failed: {}".format(server))
if __name__ == "__main__":
if len(sys.argv) == 1:
# Do not use this server for commertial software without permission
main('pool.ntp.org')
else:
main(sys.argv[1:])
將其放入文件中ntp_check.py
。確保您已安裝 ntplib 或pip install ntplib
特定於發行版的 ( apt-get install python3-ntplib
)。然後用以下方式調用它:
python3 ntp_check.py