2017年5月19日金曜日

仮想環境のRHEL7およびCentOS7で起動時に時刻が9時間ずれる問題のメモ


【定義】
 BIOS時間 = hwclock = RTC time(Real Time Clock)
 OS時間 = SYSTEM時刻 = Universal time = UTC(Linux)
 Local time = (OS時間+9時間) = Asia/Tokyo (JST, +0900)


【前提】
・RHEL6 の時刻同期の仕組み (ntpd)
Red Hat Enterprise Linux 6 では、hwclock コマンドは毎回のシステムのシャットダウン
または再起動時に自動的に実行されますが、これは Red Hat Enterprise Linux 7 では実行されません。
システムクロックが Network Time Protocol (NTP) または Precision Time Protocol (PTP) で同期される場合、
カーネルは自動的に 11分ごとにハードウェアクロックをシステムクロックに同期します。
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Configuring_the_Date_and_Time-hwclock.html

※RHEL6 の時は自動的にOS時間でBIOSの時間を上書き修正していた


・LinuxとWindowsのハードウェアクロックの扱いは違う
Linux ディストリビューションのほとんどは、ハードウェア クロックを UTC として扱うのが既定です。
Windows マシンは、ハードウェア クロックにローカル時刻を格納します。
タイムゾーンの設定が日本であれば、GMT+9:00 (=UTC+9:00) の時刻がハードウェア クロックに格納されています。
http://yamanxworld.blogspot.jp/2010/01/linux-9.html

※Linuxは起動時に BIOS時間をUTCの前提で採用し+9時間したものをローカル時間として利用する。
 Windowsは起動時にBIOS時間をそのままローカル時間として採用する。




・WindowsはBIOS時間でOS時間を設定する
NTP サーバーに対するアクティブな接続が存在しない場合、システム時刻が BIOS クロックと同期され、
時刻の差異が 60 秒を超えた場合に、システム時刻が BIOS クロックに合わせて自動的に修正されます。
https://social.technet.microsoft.com/Forums/ja-JP/7d33c109-4d56-4420-be54-e589a890d206/windowsbiosrtc?forum=w7itprogeneralja
https://support.microsoft.com/ja-jp/help/946033/the-system-time-may-differ-from-the-bios-time-on-a-windows-based-computer-that-supports-high-precision-event-timer



【仮説】
・前提から推測される現象の説明

・仮想環境に異なるOSが混在するケースのシーケンス
Windowsシャットダウン
 WindowsゲストによりBIOS時間がローカル時間(UTC+9:00)として設定される
Linux起動
 LinuxゲストではBIOS時間(Windowsによってローカル時間に設定済み)に +9:00 した値をOS時間として採用する
 起動時に ntpdate が実行される場合、OS時間は(UTC+9:00)で正しく修正される
 11分毎に(ntpdの場合)ローカル時間(UTC+9:00)をBIOS時間に継続して上書き設定する
WindowsではBIOS時間とOS時間が常に9時間ずれた状態で稼動している


・仮想環境に異なるOSが混在するケースのシーケンス(RHEL7およびCentOS7のケース)
Windowsシャットダウン
 WindowsゲストによりBIOS時間がローカル時間(UTC+9:00)として設定される
Linux起動
 LinuxゲストではBIOS時間(Windowsによってローカル時間に設定済み)に +9:00 した値をOS時間として採用する
 LinuxのOS時間はローカル時間+9:00で稼動するためずれが生じる
WindowsではBIOS時間とOS時間にずれが無い状態で稼動している



【対策】
・LinuxとWindowsでは、システム時間に採用するソースの扱いが仕様として異なることが原因である
対策としては以下の手法が考えられる

「Linux起動時にBIOSから取得される値は、Windowsによって設定されたローカル時間である」を正とした場合
・カーネル起動時およびシャットダウン時のシステムログの時刻がBIOS時間+9:00された時刻が記録される可能性があるがこれは無視する
・OS起動時にNTPサーバーの時刻でシステム時間の強制同期を行い、BIOS時間は考慮しない

「Linux起動時にBIOSから取得される値は、UTC時間である」を正とした場合
・Windowsを再起動したタイミングでBIOS時間がローカル時間に修正されているため、都度(Linux側から)UTC時間に修正する
 ただし、WindowsゲストはBIOS時間に影響を受けておりntpサービスが途切れた場合に不具合がある
・Linuxの起動時のみBIOS時間をUTCに修正する


その他
・仮想のハードウェアにWindowsとlinuxを混在させない(LinuxのみであればホストをUTCにすれば解決)
・ホスト側でゲストからの時刻修正を受け付けない(LinuxはUTCとしてBIOS時間を取得することはできない)
・ゲスト起動中にOS時間とBIOS時間が徐々にずれていく現象は仮想ホストにおけるRTCのエミュレーションによる差分が生じるためとされ、本事象とは関係がない
 http://d.hatena.ne.jp/dayflower/20071210/1197254725

いじょ。

.