使用 adjtimex 檢查 11 分鐘核心模式的狀態
我有一個 Debian Buster 系統,它沒有編譯核心,
CONFIG_RTC_SYSTOHC
因為我不想打開 11 分鐘核心模式。但是,我想檢查此更改是否真的有效。所以我檢查了命令
status
輸出中的欄位。欄位是或adjtimex --print
。status``24577``0b110000000000001
根據此處的手冊頁- https://linux.die.net/man/8/adjtimex ,該欄位的
64
位似乎是,根據此處:https://access.redhat.com/solutions/ 55432表示開啟。status``not set``11-minute mode
這與我使用
CONFIG_RTC_SYSTOHC
as編譯核心時的預期相矛盾not set
。如何可靠地檢查 11 分鐘模式是否實際關閉,或者我是否adjtimex
錯誤地解釋了輸出?
(只是為了清除閱讀此答案的任何人可能造成的混淆:Linux 執行時,(通常)有兩個時鐘:“主”時鐘是系統時鐘,通常是基於 CPU 的。另一個時鐘是持久硬體時鐘(RTC)。當系統關閉時,系統時鐘會失去時間,只有持久的硬體時鐘才能保持正確的掛鐘時間。)
欄位的
64
位的主要含義是“系統時鍾正在/未被NTP或其他時間源同步”。11 分鐘模式過去與此緊密耦合:如果系統時鍾正在同步,則 RTC 將每 11 分鐘更新一次;如果沒有,那就不會了。status``adjtimex
CONFIG_RTC_SYSTOHC
稍後添加了每 11 分鐘禁用系統時鐘到 RTC 傳輸的選項。禁用
CONFIG_RTC_SYSTOHC
會切斷系統時鐘同步和 RTC 11 分鐘更新之間的連接。您可以查看相關的核心原始碼,在 Debian Buster 的標準 4.19.xx 核心中是sync_rtc_clock()
kernel /time/ntp.c 第 #532 行中的函式。可以看到 whenCONFIG_RTC_SYSTOHC
沒有設置,函式提前返回,什麼都不做:static void sync_rtc_clock(void) { unsigned long target_nsec; struct timespec64 adjust, now; int rc; if (!IS_ENABLED(CONFIG_RTC_SYSTOHC)) <--- If CONFIG_RTC_SYSTOHC is not enabled, return; <--- return immediately. ktime_get_real_ts64(&now); adjust = now; if (persistent_clock_is_local) adjust.tv_sec -= (sys_tz.tz_minuteswest * 60); /* * The current RTC in use will provide the target_nsec it wants to be * called at, and does rtc_tv_nsec_ok internally. */ rc = rtc_set_ntp_time(adjust, &target_nsec); if (rc == -ENODEV) return; sched_sync_hw_clock(now, target_nsec, rc); }
換句話說,禁用實際上
CONFIG_RTC_SYSTOHC
是11-minute mode
一個無操作。更具實驗性的是,您可以使用核心分析工具在 11 分鐘的適當倍數內監控該
rtc_set_time()
函式,並查看它被呼叫的頻率。如果你發現答案是 0 次,你就會知道硬體 RTC 時鐘沒有被 11 分鐘模式或其他任何東西調整。