デュアルブート時のLinuxとWindowsの時刻ズレを解消する
ubuntu18.04とwindows 10をデュアルブートしていると、時刻がずれる現象が起こったので解消方法をメモします。
結論
Linux側の時刻を調整することを前提とします。
以下コマンドで時刻ズレは解消されます。
sudo hwclock -D --systohc --localtime
補足説明あれこれ
システムクロックとハードウェアクロックの差は以下のサイトがわかりやすいです。
システムクロック
冒頭のコマンドはPCのハードウェアクロックの設定を変更するものです。ここで、PC内で使用される2つの時計を知っておく必要があります。
一つはシステムクロックといい、PC内で使用される唯一の時刻情報源としてOSが管理します。ファイルやフォルダの作成・更新日時やログ等に使用される重要な情報です。ただし、システムクロックはメモリ上で管理されるため、シャットダウンすると毎回消滅してしまいます。そこで、PCの電源が切れても時刻を保持できる仕組みとしてハードウェアクロックがあります。
ハードウェアクロック
ハードウェアクロック(RTC, CMOSクロックとも呼ばれる)はマザーボード上のICに実装され、電池によってPCの電源に関係なく稼働するようになっています。注意すべきなのが、ハードウェアクロックが持っている時刻情報をシステムクロックに使う際の処理がOSによって異なることです。OSによって以下のような違いがあります。
Linuxは起動時、NTPサーバを利用してUTCを取得し、ハードウェアクロックを更新するようです。つまりWindowsとLinuxの時刻ズレは、UTCに書き換えられたハードウェアクロックをWindowsがローカルタイムと解釈することで起こります。
そこで取り得る方法は2つです。
前者はレジストリを変更する必要があるため、後者の方法を取るほうが簡単ですね。
hwclockコマンド
以下サイトで詳細な説明が見られます。
冒頭のオプションだけ説明すると、
--systohc
:現在のシステムクロックでハードウェクロックを更新する--localtime
:ハードウェアクロックをローカルタイムとして解釈するように変更する--D
:デバッグ情報の表示(--debug
とも書く)
となります。Linux起動時は 「ハードウェアクロックをUTCに更新→システムクロックをUTCから換算」 されているため、システムクロックは正しいローカルタイムとなっています。その時刻でハードウェアクロックを更新し、規定をローカルタイムへ変更するわけですね。
timedatectlコマンド
timedatectl
コマンドで現在の時刻設定を確認できます。
timedatectl status
結果は、例えば以下のようになります。
Local time: Sat 2020-06-13 10:57:09 JST Universal time: Sat 2020-06-13 01:57:09 UTC RTC time: Sat 2020-06-13 10:57:09 Time zone: Asia/Tokyo (JST, +0900) System clock synchronized: yes systemd-timesyncd.service active: yes RTC in local TZ: yes Warning: The system is configured to read the RTC time in the local time zone. This mode can not be fully supported. It will create various problems with time zone changes and daylight saving time adjustments. The RTC time is never updated, it relies on external facilities to maintain it. If at all possible, use RTC in UTC by calling 'timedatectl set-local-rtc 0'.
RTC time(ハードウェアクロック)がLocal timeで書き換えられていることがわかります。
こっちのコマンドでも時刻の設定ができるようですが ここでは省略します。以下サイトが詳しそうです。