Monitoring

是否可以在 Busybox 系統上檢查 NTPd 狀態?

  • July 22, 2020

我需要知道目前日期/時間在基於 Busybox 的小型嵌入式 Linux 系統中是否可靠。

我有 Busybox ntpd 正在執行,但顯然沒有程序可以查詢狀態。

在更傳統的 Linux 安裝中,我會使用 ntpdc、ntpq、ntpstat 甚至 timedatectl,但在這個 Busybox/Buildroot 系統上這些都不可用。

我還可以做些什麼?

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

指定的程序將根據不同的時間事件定期執行,並且 NTP 資訊作為 args 提供給程序及其環境。我找不到有關此介面的資訊,因此在這種情況下,原始碼似乎是文件:

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 hotplug 支持掛鉤。在 OpenWrt 中,這意味著您改為添加 NTP 腳本,/etc/hotplug.d/ntp但提供給腳本的資訊仍然相同,請參閱此處的 NTP 部分:

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

引用自:https://serverfault.com/questions/845814