ろぐれこーど

限界組み込みエンジニアの学習記録とちょっぴりポエム

デュアルブート時のLinuxとWindowsの時刻ズレを解消する

ubuntu18.04とwindows 10をデュアルブートしていると、時刻がずれる現象が起こったので解消方法をメモします。

結論

Linux側の時刻を調整することを前提とします。

以下コマンドで時刻ズレは解消されます。

sudo hwclock -D --systohc --localtime

補足説明あれこれ

システムクロックとハードウェアクロックの差は以下のサイトがわかりやすいです。

パソコンの時計 ハードウェアクロックとシステムクロック

システムクロック

冒頭のコマンドはPCのハードウェアクロックの設定を変更するものです。ここで、PC内で使用される2つの時計を知っておく必要があります。

一つはシステムクロックといい、PC内で使用される唯一の時刻情報源としてOSが管理します。ファイルやフォルダの作成・更新日時やログ等に使用される重要な情報です。ただし、システムクロックはメモリ上で管理されるため、シャットダウンすると毎回消滅してしまいます。そこで、PCの電源が切れても時刻を保持できる仕組みとしてハードウェアクロックがあります。

ハードウェアクロック

ハードウェアクロック(RTC, CMOSクロックとも呼ばれる)はマザーボード上のICに実装され、電池によってPCの電源に関係なく稼働するようになっています。注意すべきなのが、ハードウェアクロックが持っている時刻情報をシステムクロックに使う際の処理がOSによって異なることです。OSによって以下のような違いがあります。

  • Windows
    • ハードウェアクロックをローカルタイムと規定
  • Linux
    • 設定でローカルタイム/UTCの認識を切り替え
    • デフォルトではハードウェアクロックをUTCと規定

Linuxは起動時、NTPサーバを利用してUTCを取得し、ハードウェアクロックを更新するようです。つまりWindowsLinuxの時刻ズレは、UTCに書き換えられたハードウェアクロックをWindowsがローカルタイムと解釈することで起こります。

そこで取り得る方法は2つです。

  • ハードウェアクロックをUTCと解釈させるようにWindowsの設定を変更する
  • ハードウェアクロックをローカルタイムと解釈させるようにLinuxの設定を変更する

前者はレジストリを変更する必要があるため、後者の方法を取るほうが簡単ですね。

hwclockコマンド

以下サイトで詳細な説明が見られます。

manpages.ubuntu.com

冒頭のオプションだけ説明すると、

  • --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で書き換えられていることがわかります。

こっちのコマンドでも時刻の設定ができるようですが ここでは省略します。以下サイトが詳しそうです。

qiita.com