恩特普德

恩特普德

我想使用通用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。确保您已安装 ntplibpip install ntplib或特定发行版 ( apt-get install python3-ntplib)。然后用以下方式调用它:

python3 ntp_check.py

相关内容