Linux

使用 adjtimex 檢查 11 分鐘核心模式的狀態

  • February 28, 2022

我有一個 Debian Buster 系統,它沒有編譯核心,CONFIG_RTC_SYSTOHC因為我不想打開 11 分鐘核心模式。但是,我想檢查此更改是否真的有效。

所以我檢查了命令status輸出中的欄位。欄位是或adjtimex --printstatus``24577``0b110000000000001

根據此處的手冊頁- https://linux.die.net/man/8/adjtimex ,該欄位的64位似乎是,根據此處:https://access.redhat.com/solutions/ 55432表示開啟。status``not set``11-minute mode

這與我使用CONFIG_RTC_SYSTOHCas編譯核心時的預期相矛盾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_SYSTOHC11-minute mode一個無操作。

更具實驗性的是,您可以使用核心分析工具在 11 分鐘的適當倍數內監控該rtc_set_time()函式,並查看它被呼叫的頻率。如果你發現答案是 0 次,你就會知道硬體 RTC 時鐘沒有被 11 分鐘模式或其他任何東西調整。

引用自:https://unix.stackexchange.com/questions/692367