WindowsとLinuxのデュアルブート時に時刻がおかしくなることの対応

WindowsLinuxデュアルブートしていると、どちらか(おもにWindows)の時刻がおかしくなることがある。

これは、PC本体の時計(RTC/Real time clock または HWClock/Hardware clock)の取り扱いが異なるためだ。

  • Windows : Localtime(現地時間)
  • Linux : 多くの場合UTC(世界協定時)

どちらかに統一するべきなのだが、どちらかというとUTCのほうが望ましいぽい。(夏時間やうるう秒などの対応が根拠とされる)

参考情報

Windows での設定

なので、今回はWindows側の設定を変更することにする。

まず、管理者モードでターミナルを開く。 次に下記のコマンドを実行する。単純にコピー&ペーストでよい。 コマンドの内容としては、reg コマンドで RTCをUTCで扱うフラグ(RealTimeIsUniversal)を追加する、というものになる。

reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /d 1 /t REG_DWORD /f

その後再起動すればよい。

RTCをUTCとして取り扱うようになるだけで、利用上の影響は全くない。

これで、単一PC上におけるWindowsLinuxの相互運用時の問題がひとつ減る。 なお、動作確認はWindows 11 Pro と Ubuntu 22.04 LTS で行っている。 (Windows 7以降ならおおむね大丈夫だと思われるが、実際はWindows XP以降くらいは対応しているようだ)

RealTimeIsUniversal についての補足

RealTimeIsUniversal は「非公式に公認」というようなよくわからないステータスらしい。

そもそもRTCをLocaltimeとして扱うのは、ケンブリッジ大学のMarkus Kuhnが「危険な古い MS-DOS の慣行」という強い言葉で批判している。

even today all Microsoft operating systems still continue with the dangerous old MS-DOS practice of running the RTC in local time

(現在でもすべての Microsoft オペレーティング システムは、RTC を現地時間で実行するという危険な古い MS-DOS の慣行を続けています。)

IBM PC Real Time Clock should run in UT

現在は修正されたようだが、RealTimeIsUniversalを有効にしているとRTCを変更できない不具合もあったようだ。 (RealTimeIsUniversal レジストリ エントリが Windows で有効になっている場合は、システム時刻を変更することはできません。 - Microsoft サポート

DOS時代の作法をずっと維持しているというのは、歴史的経緯と後方互換を重視するマイクロソフトらしい話ではある。まあ、MS-DOSのころはUTCではなくGMTグリニッジ標準時/Greenwich Mean Time)って呼ばれてたし、スタンドアロンだし、国外などへの持ち運びもほぼしないのだからタイムゾーンについてもほぼ考える必要がなかったしね。

参考