Time

必須將 CMOS 時鐘設置為本地時間(由於 DOS 雙引導),timedatectl 或 hwclock 似乎一直將 CMOS(硬體)時鐘設置為 UTC!

  • October 19, 2021

這太瘋狂了。

我有一個雙引導系統,一個作業系統是 FreeDOS(它無法處理除本地時間以外的 CMOS 時鐘),另一個是 Linux Mint 17。

該系統的使用方式是我們坐在 Linux 中等待“觸發器”(軟體觸發器)開始測試。測試是在 FreeDOS 下完成的,因此腳本在 Linux 中設置了所有內容,然後將系統設置為引導 FreeDOS 並執行測試,然後重新引導回 Linux。這種情況從每隔幾分鐘一次到每隔幾天一次。

我們注意到有時時鐘會完全搞砸。看來我們進入了“將 CMOS 時鐘設置為 UTC”的循環;載入 CMOS 時鐘,假設它是本地時間(bam,提前 8 小時);將 CMOS 時鐘設置為 UTC(再增加 8 小時!!!);重複’。

在兩個系統中,無論我們從一個系統啟動到另一個系統的頻率如何或很少,時鐘都是正確的,這是絕對的要求(嗯,絕對需要)。

我在 Linux 端設置了 NTP,它通常工作正常。

顯然我處於 11 分鐘模式。

以下是將硬體(CMOS)時鐘設置為本地時間後發生的情況,然後等待 11 分鐘並再次查看:

tjr2pc1 ~ # date ;timedatectl status ; sleep 660 ; date;timedatectl status
Thu Feb  4 12:03:33 MST 2016
     Local time: Thu 2016-02-04 12:03:33 MST
 Universal time: Thu 2016-02-04 19:03:33 UTC
       RTC time: **Thu 2016-02-04 12:03:33**
       Timezone: America/Phoenix (MST, -0700)
    NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: yes
     DST active: n/a

Warning: The RTC is configured to maintain time in the local time zone.     This
        mode is not fully supported and will create various problems     with time
    zone changes and daylight saving adjustments. If at all possible use
    RTC in UTC, by calling 'timedatectl set-local-rtc 0'.
Thu Feb  4 12:14:33 MST 2016
     Local time: Thu 2016-02-04 12:14:33 MST
 Universal time: Thu 2016-02-04 19:14:33 UTC
       RTC time: **Thu 2016-02-04 19:14:33**
       Timezone: America/Phoenix (MST, -0700)
    NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: yes
     DST active: n/a
-----------------

請注意,CMOS 時鐘突然變為 UTC 時間!*請停下來

我什至嘗試安裝 fake-hwclock,這仍然發生。我什至將 /sbin/hwclock 重命名為 /sbin/real_hwclock 以試圖讓核心不理會損壞的 CMOS。

回顧:我們的目標是讓時間在 FreeDOS 和 Linux 中都有效。

我不在乎這是否意味著 Linux 將 CMOS 時鐘設置為 UTC,然後在關機時將其恢復為本地時間,或者我是否可以以某種方式強制 Linux 將其設置為本地時間而不是 UTC。或者,如果我能讓 Linux 完全忽略 CMOS 時鐘(這就是我安裝 fake_hwclock 的原因——我希望這樣做。不)。我不在乎如何,我只需要在 Linux 關閉後將 CMOS 時鐘設置為正確的本地時間(以便 FreeDOS 獲得正確的時間)。(由於過於復雜而無法打擾大家的原因,無法在 FreeDOS 下執行網路,因此我可以使用 ntp 或腳本或其他東西來自動正確設置時間。並讓“轉到 FreeDOS 腳本”編寫腳本在 FreeDOS 下設置時間和日期是愚蠢的,但我將這樣做只是為了停止與愚蠢作鬥爭)

我告訴timedatectl過CMOS時鐘是當地時間。

/etc/default/rcS說:

UTC=no

然而,每隔 11 分鐘就會有人(我假設是核心)將 CMOS 時鐘設置為 UTC 時間!即使我明確表示它應該是當地時間。

而且,是的,自從將 rcS 設置為 UTC=no 後,我已經重新啟動(多次)。是否還有另一個配置文件可以讓核心單獨保留 CMOS 時鐘,或者強制將其設置為本地時間?

更新:我在“11 分鐘模式”中發現了一些有趣的東西,包括 reddit 上的一個問題,它談到了這件事,並指責 ntp 和 adjtimex(核心內部,而不是執行檔)。目前還沒有解決方案,我將編寫一個每分鐘執行一次的 cron 作業,並將硬體時鐘強制返回到本地時間。(我討厭使用這樣的大錘,但我真的需要時間來糾正 - 盡快,因為我​​們的時鐘完全搞砸了(一台電腦的時間慢了 12 小時以上(奇怪),一台快 7 小時,還有一台幾乎提前一天半!就從周五到週一!)

好的,首先,我不明白為什麼我對這個問題投了反對票。

無論如何,我終於在 3 年後找到了解決方案:

確保 /etc/adjtime 有 ‘LOCAL’ 而不是 ‘UTC’(在我的例子中,它是文件的最後一行)。

確保 /etc/hardwareclock 中包含“localtime”(在我的情況下,這是一個新文件,並且只有該行)。

執行上述操作似乎關閉了核心中的“NTP 同步”標誌,這使核心在關閉時無法將 UTC 時間寫入 CMOS 時鐘。因此,核心很可能不會將系統時間保存在 CMOS 時鐘中(我尚未驗證這一點)。但是,上述 2 項更改似乎關閉了“11 分鐘模式”。

這是’timedatectl’的輸出:

rusty@quigon2 ~ $ timedatectl
Local time: Wed 2019-01-30 14:18:53 MST
Universal time: Wed 2019-01-30 21:18:53 UTC
RTC time: Wed 2019-01-30 14:18:50
Time zone: America/Phoenix (MST, -0700)
Network time on: yes
NTP synchronized: no
RTC in local TZ: yes

Warning: The system is configured to read the RTC time in the local time zone.
...blah blah...

(請注意上面的“NTP 同步”資訊)。

如果您想與 NTP 同步(通過 ntpd 或 rdate 或其他方式),那就另當別論了。(我使用 cron 作業來 rdate 和 hwclock –systohc 每 30 分鐘…)

使用某些特定選項執行 timedatectl 可能會對上述文件執行上述更改,我尚未對此進行測試。

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