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