中古で買ってきたThinkCentre M720q TinyにRocky Linux8.6をインストールした。搭載しているCPUはCore i5-8500Tなので、第8世代のCore i5であり、開発時のコードネームはCoffee Lake。

インストール自体はすんなり終わったけど、よく見てると、まぁ、時計がズレまくっている。timedatectlコマンドの結果を確認してみると、NTPで調整してみても、結果的にRTC time(リアルタイムクロック)の時刻がすさまじい勢いで進んでしまうので、chronydが同期をあきらめてしまうようなレベルでズレていた。

時計がズレるという事象で思いついたのが、マザーボード上のCMOS電池、CR2032の電力が無くなっているのかなと思いついて、CR2032電池を交換してみたがなにも解消しない。まぁ、なんとなくハマった実感はあったのでいろいろと調べてみるとこの記事を見つけた。

Linux Kernel Disables Coffee Lakes HPET On The Grounds That It Is “Unreliable”

この記事によると、Linuxが利用できるClocksource(時間を計測するための情報源?例えば、1秒の経過を正確に把握するための情報源ってところだおるか)にはいくつかあって、CPUを情報源とするTSC(Time Stamp Counter)や、マザーボード上のチップを情報源とするHPET(High Precision Event Timer)、ACPIを情報源とするACPI-PM(ACPI Power Management Timer)などがあるみたいんだけど、Coffee LakeとIce Lakeの世代のHPETはぶっ壊れているらしく、PCが低電力状態に状態になった時にLinuxカーネルのClocksourceの監視機構で問題が起きるらしい。

こんなエラーメッセージが出るとして紹介されているメッセージ(確かに似たようなのが、ウチのThinkCentre M720q Tinyでも出てた)はこんな感じで、壊れているのはHEPTなのにTSCが壊れているようなメッセージになっていてややこしい。

clocksource: timekeeping watchdog on CPU7: Marking clocksource ‘tsc’ as unstable because the skew is too large:
clocksource: ‘hpet’ wd_now: 54b0f25 wd_last: 4e9fe44 mask: ffffffff
clocksource: ‘tsc’ cs_now: 3e0e2debe0 cs_last: 3daab92440 mask: ffffffffffffffff
tsc: Marking TSC unstable due to clocksource watchdog
TSC found unstable after boot, most likely due to broken BIOS. Use ‘tsc=unstable’.
sched_clock: Marking unstable (4024083039, -219)<-(4075977403, -51894628) clocksource: Switched to clocksource hpet

この問題、2019年11月にLinusさんがコミットしたパッチで回避されているらしいけど、Rocky Linux8.6のカーネルには未反映なんだろうか。

とりあえず、ワークアラウンドとして、/etc/default/grubに書かれている起動時のカーネルオプションにHEPTを無効化するnoheptを追加して、それを反映させて再起動することが挙げられていた。うちのThinkCentre M720qでも同じことをやってみたら時計のズレが収まった…とりあえず、めでたしめでたし。

参考: