我需要知道基于 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()
调用外部程序。action
stratum
freq_drift_ppm
poll_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
如您所见,程序接口正在挂接到 OpenWrt 的 procd 热插拔支持。在 OpenWrt 中,这意味着您可以添加 NTP 脚本,/etc/hotplug.d/ntp
但提供给脚本的信息仍然相同,请参阅此处的 NTP 部分:
答案2
ntpd -w
将提供一些信息,例如当前与 NTP 服务器的偏移量是多少。