Linux_Windowsデュアルブート環境時における時刻ずれの解決

LinuxWindowsデュアルブート環境において、各OSでの表示時刻がずれる現象が発生することがある。
この現象を解決する方法をまとめる。

環境

  • Linux側の環境
    • Arch Linux (x86_64, Kernel 3.12-9-2)
    • systemd (208-11)
    • ntp (4.2.6.p5-18)

解決法

Windows側の時刻系を、UTCに設定する。

                  • -

Linux側の時刻系を、localtimeにする解決法もある。
しかし、ハードウェアクロックがlocaltimeだと、サマータイムの切替時に時刻がおかしくなることがあるらしい。
そのため、時刻系は、UTCを用いるのが望ましいと思われる。

設定手順

設定は、以下の手順で行う。

  1. Linux側で設定されている時刻系の確認
  2. Windows側の時刻系の設定

Linux側で設定されている時刻系の確認
systemdでは、時刻系は、デフォルトでUTCに設定されている。
従って、Linux側での設定は、基本的には必要無い。


念の為、Linux側の時刻系が、UTCに設定されているかどうかを確認しておく。
"RTC in local TZ: no"と表示されればOK。

$ timedatectl status | grep local
RTC in local TZ: no

もし、"RTC in local TZ: yes"と表示されたら、時刻系はlocaltimeに設定されている。
その場合は、以下のコマンドを用いて、時刻系をUTCに設定しておく。


$ timedatectl status | grep local
RTC in local TZ: yes
# timedatectl set-local-rtc false
$ !-2
RTC in local TZ: no

Windows側の時刻系の設定
レジストリの[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation]キーに、"RealTimeIsUniversal"という名称の、16進数の'1'のDWORD値を追加する。

                  • -

まず、管理者権限を持つユーザアカウントで、ログインをする。
次に、コマンドプロンプトを管理者で実行し、以下のコマンドを実行する。


> reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
最後に、再起動する。

復旧方法

Windows側の時刻系をlocaltimeに戻す手順をまとめる。

                  • -

レジストリに追加した"RealTimeIsUniversal"を削除する。

まず、管理者権限を持つユーザアカウントでログインをする。
次に、コマンドプロンプトを管理者で実行し、以下のコマンドを実行する。


> reg delete HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /f
最後に、再起動する。

原因

LinuxWindowsのそれぞれのOSにおいて、異なる時刻系を使用していることが原因である。

                  • -

コンピュータは、UTCとlocaltimeの2つの時刻系を用いて、時刻を管理している。

UTC(Universal Time Coordinated)
協定世界時GMT(グリニッジ標準時)とほぼ同義。
localtime
UTCタイムゾーンにおける時差を補正した時刻。

        • -

どの時刻系を既定として用いるのかは、OSによって異なる。
MacOSではUTCWindowsではlocaltime、Unix系では既定無し(UTCが使われることが多い)が、デフォルトとして設定されている。


OSは、起動時にCMOSからハードウェアクロックを読み出し、その時刻に設定された時刻系に基づいた修正を加え、システムクロックの時刻としている。
このとき、OSの時刻系がUTCであればロケールに基づいた時刻修正(Asia/Tokyoなら+0900)を行い、localtimeであれば修正を行わない。
また、OSは、シャットダウンする際に、現在のシステムクロックの時刻を、ハードウェアクロックとしてCMOSに書き込む。


したがって、OSの時刻系がUTCに設定されており、かつハードウェアクロックの時刻がlocaltimeの値である場合、時刻のずれが発生してしまう。
これは、タイムゾーンに基づいた時刻補正を既に行ったlocaltimeの値を、UTCと扱ってしまい、更に時刻補正を加えてしまうためである。

        • -

Linux_Windowsデュアルブート環境の場合、各OSの時刻系は、前述の通りデフォルトのままだと、Linux側はUTCWindows側はlocaltimeを用いているケースが多い。
そのため、この状況で、Windows側で時刻同期を行うと、Linux起動時に時刻ずれが発生してしまう。

参考サイト

  • ArchWiki: Time

https://wiki.archlinux.org/index.php/Time

  • ko-jiya528: 時刻設定にUTCを使う

http://ja.528p.com/linux/client/CA010-timezone.html

  • eのらぼらとり: パソコンの時計 ハードウェア クロックとシステム クロック

http://park12.wakwak.com/~eslab/pcmemo/clock/

雑感

  • GUI操作は、文章で説明しようとすると、けっこう難しい&くっそ面倒。
  • CUI操作は、コマンドをコピペすれば、とりあえず設定手順にはなるので、楽ちん。