恩特普德

恩特普德

我想使用通用ntpd守護程序來測試虛擬機器是否保留時間,而不讓它實際運行調整時鐘。

我在 macOS 系統上的 VirtualBox 中執行 Solaris 11.4(Oracle 針對 Intel 的標準映像),但無法正確同步。我突然意識到,虛擬機很可能已經使用 VirtualBox Guest Additions 來執行此操作(我不知道這是如何工作的),並且我可能會因為ntpd在來賓中運行而打亂時間。

ntpd為了測試這一點,我想我應該在 Solaris VM 中進行設置監視器一些公共時間伺服器,但以某種方式阻止它修改本地時鐘。這樣我就可以查看loopstatspeerstats記錄隨時間的變化情況,以了解本地時鐘是否真正保持正確的時間。

問題是我找不到任何關於如何停止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 不太可能有一種模式可以正確維護這些參數的值而不進行即時調整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

相關內容