はじめに
LinuxとWindowsをデュアルブートさせた際に、Linuxを使ってからWindowsを起動させると、時刻が数時間単位でずれていることはないだろうか。
数秒程度ならば、少なくとも日常使いにおいてはある程度許容できるが、数時間単位のずれとなるとかなりの支障になることは明らかである。
本記事ではそのような現象を解決するための具体的な方法と、根本の原因について解説する。
解決方法
結論から述べると、Linux側で以下のコマンドを実行することで解消する。
sudo timedatectl set-local-rtc 1
時刻がずれる原因
LinuxとWindowsをデュアルブートさせた際に時刻がずれる原因としては、両者それぞれのシステムクロックによるハードウェアクロックの解釈方法が異なるためである。
ハードウェアクロックとシステムクロックについて
ハードウェアクロックとは、パソコンの集積回路上に搭載されている時計のことである。時刻情報に関してはCMOSに保存されている。一方のシステムクロックとは、OSのカーネルが管理している時計のことである。
ハードウェアクロックはコンピュータの電源を切っても、マザーボード上にある電池によって動作しているため、時刻情報が常に更新されている。しかしシステムクロックは主記憶装置上で時刻を管理しているため、コンピュータの電源を切るとその時刻情報を保持できずに失ってしまう。そこでOSの起動時にハードウェアクロックの情報をシステムクロックに反映させることで、時刻情報を取得している。
そして我々がディスプレイ上で見る時刻情報というのは、まさにそのシステムクロックから取得した時刻情報である。
LinuxとWindowsで異なるハードウェアクロックの解釈方法
LinuxとWIndowsではシステムクロックによるハードウェアクロックの解釈方法が異なっており、それが今回のタイトルにもなっているデュアルブート時に発生する時刻ずれの原因になっている。
Linuxの場合はOSの起動時に、UTC(いわゆるイギリスでの時刻)をNTPサーバから取得し、その時刻情報をハードウェアクロックに設定している。その後システムクロックは、ハードウェアクロックから取得した時刻情報はUTCと解釈しているため、その時刻情報をローカルタイムに合わせて調整する。一方Windowsの場合は、OSの起動時にハードウェアクロックに設定する時刻情報はローカルタイムであるため、システムクロックはその時刻情報をローカルタイムと解釈して、そのままの値で取得したものを設定している。
デュアルブートさせていた場合
今回はローカルタイムに日本時間を設定していることを前提に話す。
デュアルブートさせていた場合、Linuxを起動させると上記の仕組みにしたがって、ハードウェアクロックはUTCを設定する。そしてシステムクロックはその時刻情報を基に、ローカルタイムに合わせて調整をする。ローカルタイムが日本時間に設定されている場合は+9hして調整する。その後Linuxを終了させてWindowsを起動した場合、Windowsのシステムクロックは時刻情報を得るために、ハードウェアクロックの時刻情報を取得する。
Windowsの場合はハードウェアクロックの時刻情報 = ローカルタイムと解釈しているため、そのままの時刻情報をシステムクロックに設定する。しかし先ほどLinuxを起動した際に、ハードウェアクロックには日本の時刻から-9hずれているUTCが設定されている(両者OSが使っているハードウェアクロックは同一のもの)。つまりこのとき、ハードウェアクロックの時刻情報をそのまま反映させたWIndowsのシステムクロックの時刻情報は、ローカルタイムから-9hずれたものになってしまっているのだ。これがLinuxとWindowsをデュアルブートさせたときに発生する時刻ずれの原因である。
解決方法
以上の仕組みを踏まえると、解決方法としては以下の2つのやり方が思いつく。
- Linux側でハードウェアクロックに設定する時刻情報をローカルタイムのものにする。
- Windows側でハードウェアクロックに設定する時刻情報をUTCのものにする。
この2つのうち前者のほうが比較的お手軽にできるため、本記事では前者のやり方を採用する。
後者のやり方を採用した場合はレジストリの編集が必要となり、より複雑な作業が必要になるため、あまりおすすめしない。
Linux側でハードウェアクロックにローカルタイムを設定させる方法としては、冒頭でも紹介した以下のコマンドを実行することである。
sudo timedatectl set-local-rtc 1
このコマンド文の意味を解説すると
- timedatectl
時計やタイムゾーンを設定するコマンド - set-local-rtc 1
RTC(いわゆるハードウェアクロックのこと)をローカルタイムに設定するか否か。"set-local-rtc <bool>"の"<bool>"の部分が0の場合は、ハードウェアクロックにUTCを、1の場合はローカルタイムを設定する。
よってこのコマンドを実行することで、Linux側でハードウェアクロックにローカルタイムを設定できる。
その後Linuxを終了させWindowsを起動しても、Windows側の時刻がずれる現象は解消されているはずだ。
終わりに
本記事ではLinuxとWindowsをデュアルブートさせたときに発生する時刻がずれる現象への解決方法と、その原因について解説した。
本記事で解説した解決方法などを実践しない限りは解消されない現象であることから、デュアルブート後にほとんどの人たちが遭遇する現象であると思われる。
この記事を読んで救われた読者が一人でも増えれば、筆者としてはとても嬉しい限りである。