我有一个嵌入式系统,它使用 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
。这里有一个例子:
- https://developers.redhat.com/blog/2017/02/22/how-to-build-a-stratum-1-ntp-server-using-a-raspberry-pi/和
127.127.20.0
- https://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html#ntp-conf和
127.127.28.0
如果这对您来说也不可用,因为时间设备实际上并未连接到 NTP 服务器盒,那么您可以编写自己的内核模块来根据传入数据包模拟硬件时钟。
但到目前为止,您最好的选择是使用其他人为此目的构建的驱动程序。如果可能的话,您应该将 GNSS 接收器连接到实际运行 ntpd 的盒子上,以允许 ntpd 在需要时自动获取时间。