是否可以在 Busybox 系统上检查 NTPd 状态?

是否可以在 Busybox 系统上检查 NTPd 状态?

我需要知道基于 Busybox 的小型嵌入式 Linux 系统中当前日期/时间是否可靠。

我正在运行 Busybox ntpd,但显然没有程序可以查询状态。

在更传统的 Linux 安装中,我会使用 ntpdc、ntpq、ntpstat 甚至 timedatectl,但这些在 Busybox/Buildroot 系统上均不可用。

我还可以做些什么?

答案1

BusyBox 不提供查询正在运行的 BusyBox NTP 守护进程的状态所需的 IPC/RPC 接口,因此即使您安装了上述查询实用程序之一,它们也无法与 BusyBox 通信ntpd

按照另一个答案中提到的那样运行ntpd -w只会ntpd从头开始启动另一个 BusyBox 实例,而这个新实例不会与已经运行的ntpd进程对话。

但是,还有另一种方法可以从 BusyBox 获取状态信息ntpd,即使用它的程序/脚本接口。请参阅 -S 标志:

~# ntpd --help
BusyBox v1.30.1 () multi-call binary.

Usage: ntpd [-dnqNwl] [-I IFACE] [-S PROG] [-p PEER]...

NTP client/server

        -d      Verbose (may be repeated)
        -n      Do not daemonize
        -q      Quit after clock is set
        -N      Run at high priority
        -w      Do not set time (only query peers), implies -n
        -S PROG Run PROG after stepping time, stratum change, and every 11 min
        -p PEER Obtain time from PEER (may be repeated)
        -l      Also run as server on port 123
        -I IFACE Bind server to IFACE, implies -l

指定的程序将根据不同的时间事件定期执行,并且 NTP 信息将作为参数提供给程序及其环境。我找不到有关此接口的信息,因此在这种情况下源代码似乎是文档:

https://git.busybox.net/busybox/tree/networking/ntpd.c

查找该函数,您会发现它使用作为参数和作为环境变量来run_script()调用外部程序。actionstratumfreq_drift_ppmpoll_intervaloffset

您的嵌入式 Linux 发行版很可能已经连接到此接口。在我的 OpenWrt 盒子上ntpd运行的是此命令行:

/usr/sbin/ntpd -n -N -S /usr/sbin/ntpd-hotplug -p 0.openwrt.pool.ntp.org -p 1.openwrt.pool.ntp.org -p 2.openwrt.pool.ntp.org -p 3.openwrt.pool.ntp.org

如您所见,程序接口正在挂接到 OpenWrt 的 procd 热插拔支持。在 OpenWrt 中,这意味着您可以添加 NTP 脚本,/etc/hotplug.d/ntp但提供给脚本的信息仍然相同,请参阅此处的 NTP 部分:

https://openwrt.org/docs/guide-user/base-system/hotplug

答案2

ntpd -w将提供一些信息,例如当前与 NTP 服务器的偏移量是多少。

相关内容