自宅のデスクトップPCで Windows と Linux でデュアルブートに仕立てている。Windows Update した際エラーが発生し、ハードウェアクロックがずれていることに気づいた。原因はマザーボードのボタン電池が切れてしまったためであった。
例によっていろいろ検索しながら何とか自己解決した。備忘録を兼ねて書き留めておく。素人の生兵法ゆえ正しくない内容も含まれる可能性はある。
Windows Update に失敗した
自宅のPCで Windows 10, Windows 10 Insider Preview, Ubuntu 16.10, Debian testing (stretch) の四種類でデュアルブートを構成している(四種類でも通常デュアルブートと言うようである)。
先月 Insider Preview で新しいビルドのインストールに失敗したので Microsoft のサイトから iso ファイルをダウンロードしなおして I.P. のみ再インストールしたのだが今にして思うとハードウェアクロックが狂っていたのが原因だったかもしれない。とにかくエラーログ等を確かめずに再インストールしてしまったので、そのときの原因はわからない。
ところが今月になってまた、今度は Windows 10 の方でも Update に失敗してしまった。エラーコードを失念してしまったが検索してみたところハードウェアクロックが正しくないために発生するエラーのようであった。私のデスクトップPCは5年前にネットの BTO で購入したもので BIOS 起動である。普段使わない時はシャットダウンしおいてあるのだが、それ以来起動のたびに BIOS の設定画面を表示させて時刻を確認してみたのだが、シャットダウンすると時計が数時間前に戻ってしまう。
マザーボードのボタン電池交換
もしやと思ってマザーボードのボタン電池を交換し、ついでに CMOS クリアして再設定してみた。今度は数回再起動を繰り返してみても一度設定した時刻が変わることはなかった。やはりマザーボードのボタン電池が切れていたことが原因であった。ところで交換したボタン電池の形式は CR2032 。私が検索した範囲ではマザーボードの内蔵電池としてよく使われるもののようだ。
Linux, Windows デュアルブート特有の時刻問題
ところでいろいろ検索していて気がついたのだが、 Linux と Windows をデュアルブートにしておくと時刻が9時間変わるという問題がよく発生するようだ。
正しいかどうかちょっと自信がないのだが、検索してみて私が理解したのは以下のようなことだ。
一般に PC では起動時から積算するシステムクロックとハードウエアの時刻である RTC (Real Time Clock)が区別され、個々に存在する。先に述べたように私の PC では内蔵電池切れにより RTC が狂っていたようだが、起動時にシステムクロックを NTPサーバに同期させていたせいか(?)デスクトップに表示される時刻はいつも正しく、しばらくこれに気づかなかった。
Linux では RTC を UTC (協定世界時)に設定することもできるし、ローカルタイムに設定することもできる。ローカルタイムは通常はPCが所属するタイムゾーンの時刻で、日本の場合はJST (日本標準時)で UTC とちょうど+9時間ずれている。一方 Windows は RTC にローカルタイムを書き込む。そこで Linux と Windows をデュアルブートにしておき、特に Linux 側でRTC として UTC を設定しておくと OS の選択の変更時に9時間のずれが発生するようである。
これを避けるためにデュアルブートを設定する際は Linux で RTC として ローカルタイム(日本国内の場合は JST)を設定しておくようだが、Windows 側を UTC にしておく設定方法もあるそうだ。
How to Fix Time Differences in Ubuntu 16.04 & Windows 10 Dual Boot | UbuntuHandbook
欧米では夏時間 (DST) が導入されている国もあり、Linux サーバなどシャットダウンせずに長期運用する場合などではどうやら RTC を UTC にしておくほうが一般的のようだ。
Ubuntu 16.04 以降のRTCの設定
私はもちろん Linux の RTC をローカルタイムにしておいたのだが、 Ubuntu の場合 16.04 以降はそれ以前の設定方法と異なるらしいので注意が必要だ。例えば 16.04 以降は "/etc/default/rcS" というファイルはない。
RTC を ローカルタイムにするにはターミナルなどで以下のコマンドを実行する。
timedatectl set-local-rtc 1 --adjust-system-clock
このコマンドの 1 を 0 にすると UTC の設定である。次のコマンドで確認できる。
timedatectl
ところでこのままでは RTC が書き換わらない。 [ これに気づくのに半日(涙) ]
hwclock --systohc --localtime
とするとシステムクロックをローカルタイムとして RTC に同期させる。オプションを --hctosys とすると逆に RTC をシステムクロック に同期させられる。
私は以下の記事を参考にした。
Ubuntu で起動直後だけ時刻が9時間ずれる パソコン鳥のブログ/ウェブリブログ
マザーボードの内蔵電池切れという私が未経験だった事態を経験し、またいくらか勉強になった。そういえば検索した中に「マザーボードの電池は5年くらいもつ」という記事をみかけたのだが奇しくも私の場合5年めにして電池切れとなった。
ホント言うとマザーボードやCPUを買い換えてPCリニューアルしたいところなのだが、まだまだ子育てなどいろいろ入用なので、内蔵電池の入れ替えで我慢している。嗚呼。