Hatena::ブログ(Diary)

Varg

2014-03-04 (Tuesday)

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

LinuxとWindowsのデュアルブート環境において、各OSでの表示時刻がずれる現象が発生することがある。

この現象を解決する方法をまとめる。

環境

  • Linux_Windowsのデュアルブート可能なマシン
  • Linux側の環境
    • Arch Linux (x86_64, Kernel 3.12-9-2)
    • systemd (208-11)
    • ntp (4.2.6.p5-18)
  • Windows側の環境
    • Windows 7 (Pro, SP1)

解決法

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

最後に、再起動する。

原因

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

----------

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

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

-----

どの時刻系を既定として用いるのかは、OSによって異なる。

MacOSではUTC、Windowsではlocaltime、Unix系では既定無し(UTCが使われることが多い)が、デフォルトとして設定されている。


OSは、起動時にCMOSからハードウェアクロックを読み出し、その時刻に設定された時刻系に基づいた修正を加え、システムクロックの時刻としている。

このとき、OSの時刻系がUTCであればロケールに基づいた時刻修正(Asia/Tokyoなら+0900)を行い、localtimeであれば修正を行わない。

また、OSは、シャットダウンする際に、現在のシステムクロックの時刻を、ハードウェアクロックとしてCMOSに書き込む。


したがって、OSの時刻系がUTCに設定されており、かつハードウェアクロックの時刻がlocaltimeの値である場合、時刻のずれが発生してしまう。

これは、タイムゾーンに基づいた時刻補正を既に行ったlocaltimeの値を、UTCと扱ってしまい、更に時刻補正を加えてしまうためである。

-----

Linux_Windowsのデュアルブート環境の場合、各OSの時刻系は、前述の通りデフォルトのままだと、Linux側はUTC、Windows側は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操作は、コマンドをコピペすれば、とりあえず設定手順にはなるので、楽ちん。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

リンク元