Windows と Ubuntu のデュアルブートを使っている人なら、一度はこんな面白い問題に遭遇したことがあるはずだ。システムの時刻が同期されず、Linux から Windows に切り替えると、ちょうど8時間遅れているという問題だ。
実はこれ、Windows と Linux でハードウェアクロック(RTC)の時刻の解釈が異なることが原因だ。 マザーボードには時計チップが搭載されていて、物理的な時刻が保存されている。しかし、 Windows はハードウェアクロックに保存されている時刻がローカルタイム(現地時間)であると考える(例えば、タイムゾーンが UTC+8 なら、ハードウェアクロックは北京時間であるべき)。 Linux/Ubuntu はハードウェアクロックに保存されている時刻が UTC(協定世界時)であると考える。
仮にあなたのタイムゾーンが UTC+8(北京時間)だとする。実際の時刻が北京時間(ローカルタイム)の午後4時(16:00)の場合、対応する UTC 時刻は午前8時(08:00)になる。
ステップ1:Windows の場合
Windows を使用中、システム時刻は正しく16:00(午後4時)と表示される。
Windows はハードウェアクロックにローカルタイムを保存すべきだと考えている。そのため、16:00 をハードウェアクロックに書き込む。
ステップ2:再起動して Ubuntu に入る
パソコンを起動し、Ubuntu に入る。
Ubuntu はハードウェアクロックを読み取るが、デフォルトではハードウェアクロックに UTC 時刻が保存されていると見なす。その結果、16:00 と読み取る。
Ubuntu はこう考える:「おや、ハードウェアクロックには UTC 時刻が16:00と書いてある。自分のタイムゾーンは UTC+8 だから、ローカルタイムは UTC に8時間を足したものだな。」
計算:16:00(UTC だと思っている時刻) + 8時間 = 翌日の午前0時(00:00)。
Ubuntu は起動後にインターネット経由で自動的に時刻同期(NTP)を行う。ネットワークに接続すると、こう気づく:「あれ?ハードウェアクロックから計算したローカルタイム(00:00)が、ネットワークの標準時刻(16:00)と8時間ずれているぞ。」
そこで、Ubuntu は賢いことをする:
- システム時刻を自動的に正しいネットワーク時刻(16:00)に修正する。
- 同時に、将来の一貫性を保つため、この修正後の UTC を使ってハードウェアクロックを更新する。
- この時点で、ハードウェアクロックの数値は Ubuntu によって16:00から08:00に変更される。
ステップ3:再起動して Windows に戻る(時刻がずれる)
再度パソコンを再起動し、Windows に戻る。
- Windows はハードウェアクロックを読み取るが、依然としてハードウェアクロックにはローカルタイムが保存されていると見なす。その結果、08:00 と読み取る。
- Windows が起動時に自動でネットワーク時刻同期を行えない場合は、手動での修正が必要になる。そのため、この時刻をそのままローカルタイムの午前8時として表示してしまう。
デュアルブートの面白い話
デュアルブートの面白い話