如何在不引用其他服务器的情况下设置 ntpd 服务器时间?

如何在不引用其他服务器的情况下设置 ntpd 服务器时间?

我有一个嵌入式系统,它使用 NTP 在本地同步 UTC。系统中的客户端之一充当其他客户端的时间参考。我想您可以将其视为层 0。此“NTP 服务器”上的程序可能会从许多潜在时间源之一获取设置时间的消息,例如 GPS 系统或通过 UI 设置新时间的人。新时间并非以 NTP 端口 123 上的实际 NTP 消息形式出现。

我一直在寻找如何设置 ntpd 时间但没有成功。我正在考虑popen()做点什么应该可以解决问题,但互联网似乎都集中在如何调整外部服务器的时间,而不是配置本地系统。

如何在不引用外部 NTP 服务器的情况下设置 ntpd 服务器时间?


作为示例用例,时间源可能是以下之一:docs.novatel.com/oem7/Content/Home.htm(GNSS 接收器)。这只是一种可能的配置。其他客户使用自己单独的时间源。它不包括 NTP 服务器,因此我必须从头开始实现一个。

答案1

时间是一个比许多人意识到的复杂得多的话题。虽然看起来您所需要做的只是“设定时间ntpd”,但实际上还有很多事情需要考虑。

对您的问题的一个真正盲目(糟糕)的答案可能是简单地使用设置系统时间clock在命令行上或stime来自一个程序。这是可行的,因为 NTP 不存储它自己的内部时钟。但这样做可能不会产生您真正想要的结果。

NTP 不仅设置当前系统时间并将其分发给客户端,它还跟踪时钟中的错误,使其能够在轮询另一个时间源之间进行调整。简单地设置当前时间不会通知 NTP 错误,因此不会更新 NTP 用来调整系统时钟的“频率”。

如果您唯一的实时来源是某人设置系统时间可能是您唯一的选择。

如果您希望使用 GPS 作为服务器的时间源ntpd,那么正确的术语是您尝试将其配置ntpd层1服务器。


在阅读了一些关于这个问题的文章后,似乎ntpd确实有一种内置的方式来与包括 GPS 在内的硬件时钟进行通信。 它是使用虚拟地址范围配置的127.127.0.0/16。这里有一个例子:

如果这对您来说也不可用,因为时间设备实际上并未连接到 NTP 服务器盒,那么您可以编写自己的内核模块来根据传入数据包模拟硬件时钟。

但到目前为止,您最好的选择是使用其他人为此目的构建的驱动程序。如果可能的话,您应该将 GNSS 接收器连接到实际运行 ntpd 的盒子上,以允许 ntpd 在需要时自动获取时间。

相关内容