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

Zio*_*yte 5 monitoring busybox ntpd

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

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

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

我还可以做些什么?

小智 3

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

正如另一个答案中提到的那样运行ntpd -w只会从头开始另一个 BusyBoxntpd实例,并且这个新实例不会与已经运行的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
Run Code Online (Sandbox Code Playgroud)

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

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

查找该函数run_script(),您可以看到它actionstratum、 、freq_drift_ppmpoll_interval作为offset环境变量作为参数调用外部程序。

您的嵌入式 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
Run Code Online (Sandbox Code Playgroud)

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

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