「PCの時計が1時間ずれている」の原因の解説
先日公開した記事に割と反響がありまして、ブコメに疑問点などを上げてくださった方もいます。そこで(私の憶測を含みつつも)少し基本的な内容から解説を加えたいと思います。また最後に再発を防ぐためにどうすべきかについても私の考えを書きました。
- RTCとOS上の時刻について
- タイムゾーンや夏時間の扱いについて
- RTC の Daylight Savings Enable (DSE) という機能について
- なぜ今回多くのパソコンで1時間ずれが発生したか?
- 誰が DSE を有効にしてしまったのか?
- 再発を防ぐためにすべきこと
- 最後に
RTCとOS上の時刻について
RTCはパソコンに内蔵されているデジタル時計のようなものです。電源がOFFの間も時刻が消えてしまわないようにコイン電池で動作しています。
OSは起動時にRTCから現在時刻を取得します。逆にOS上で時刻を修正した場合はRTCに時刻を書き込みます。また、RTCはさほど精度が高くないこともあり、定期的にインターネット上のNTPサーバーから現在時刻を取得しRTCに書き込むということも行われます。最近のWindowsではデフォルトでマイクロソフトのNTPサーバーを参照しています。
タイムゾーンや夏時間の扱いについて
RTCにはタイムゾーンや夏時間を扱う仕組みは一般にはありませんので、OS側でタイムゾーンや夏時間を管理することになります。(実はRTCに夏時間を扱う仕組みがあって誤発動したというのが今回の原因なのですが)
MacやLinuxでは、RTCにはUTC(協定世界時)を設定しておきOS側でタイムゾーンや夏時間の時差を足し引きしてローカルタイムを表示しているようです。
Windowsでは、タイムゾーンを変更したり夏時間をまたいだ時に、RTCにローカルタイムを設定しなおすという方法を取っているようです。
RTC の Daylight Savings Enable (DSE) という機能について
現代のOSでは上で述べたようにタイムゾーンや夏時間を管理しているのですが、昔(DOSとかの時代?)はOSはそんな賢い機能はなくRTCの時刻がそのままローカルタイムでした。そんな時代に夏時間を扱うためにハードウェア的に実装されたのが DSE という機能です。
前回の記事であげたIntel 82371ABの仕様にあるように、この機能が有効の場合、RTCの時刻が4月の第一日曜日の1:59:59の次に3:00:00に1時間進みます。逆に10月の最終日曜日に1時間戻ります。
ブコメで「夏時間の切り替えは3月なのになぜ4月に?」というものがありましたが、良い指摘で、実は4月の第一日曜日に切り替えるのは (仕様書にも書いてありますが) 1987年の米国の法律によるもので2007年に法律が変わったため現在は使われていません。このことも DSE が今回の時刻ずれの原因だと考える理由の一つです。
またブコメで「日本のタイムゾーンにしていれば夏時間は自動的にオフになるはず」というものがありましたが、DSEの設定値はOS上の夏時間の設定とは無関係です。OSは上で述べたように夏時間を管理していますのでRTCが勝手に1時間進んだり遅れたりすることは想定していないはずです。したがって現代のパソコンではDSEは無効になっているのが正しいです。
なぜ今回多くのパソコンで1時間ずれが発生したか?
(マイクロソフトの)NTPサーバー上でDSEを原因とする時刻ずれが発生し、1時間ずれた時刻が配信されたからだと考えます。去年の10月には起きていなかったことから、ここ半年以内に新規導入したNTPサーバーでDSEが有効になってしまっているのだと思います。
DSEによる時刻ずれ自体は過去にも起きているようで、例えば2016年4月4日にもパソコンの時刻が1時間ずれた事例があるようです。
2016/04/04頃にWindowsの時刻が1時間くらい進んだ件の対処方法 - わかりやすい
誰が DSE を有効にしてしまったのか?
ブコメで「BIOSのせいじゃねーか」というものがありましたが、私もBIOSの不具合なのではないかと考えています。BIOSの設定画面にDSEの設定があるわけではないと思いますが、BIOSがハードウェアを初期化するときに、DSEを無効に設定すべきなのではないかと思います。
少なくとも2015年以前にはあまり話題になっていないと思うので、ここ最近に発売されたパソコンでこの不具合をもつものがある程度存在するというのが現状なのではないかと思います。特定のメーカーのものなのかなどは分かりません。
ちなみに、前の記事でCMOSの Offset 0xB の Bit0 が…と書きましたがこのビットが1だからといって DSE が動作するわけではないようです。私が手持ちのパソコンで試してみたところ動作しませんでした。ハードウェア的にDSEが動作しないものもあるのかもしれません。
再発を防ぐためにすべきこと
ここは私の憶測に基づく提案です。
NTPサーバーの管理者さん (含むマイクロソフト)
今回ずれた時刻を配信したNTPサーバーはDSEが有効である可能性が高いです。現在時刻を修正するだけだと10月にまたずれた時刻を配信してしまいます。
基本的には、サーバーのハードウェアを提供しているベンダーに問い合わせてDSEを無効にする方法を提供してもらうのが良いのではないかと思います。(BIOSアップデートなど)
ベンターの対応が期待できないなら、仕方ないので前の記事の方法でDSEを無効にしてください。。。(お勧めしません)
今回時刻がずれたパソコンをお使いの方
ずれた原因は2つ考えられます。1つは「NTPサーバーからずれた時刻を取得したため」、もう1つは「そのパソコンのDSEが有効になっているため」です。
前者であれば特に対応不要ですが、後者であればまた10月に時刻がずれてしまいます。
原因の判別方法は2つ考えられます。
- NTPサーバーからの取得を無効にした上で、現在時刻を2017/04/02 01:55にして電源を切る。10分ほどしたら起動して2:05になっていればOK。3:05になっていたらDSEが有効。
- 前の記事に書いた方法で RW-Everything で CMOS Offset 0xB の Bit0を見る。1ならDSE有効。
DSEが有効だった場合ですが、こちらもパソコンのメーカーに問い合わせるのが良いのではないかと思いますが、最悪、前の記事の方法で無効にできると思います。(繰り返しますが、お勧めではないです)
マイクロソフトに期待すること
出来れば Windows Update で 「DSEが有効になっていたら無効にする」というパッチを配信してもらえるとみんなハッピーだと思います。
最後に
今年の10月の最終日曜日(2017年10月29日) に時刻がずれるパソコンが発生しないことを強く願ってこの記事を書かせていただきました。NTPサーバー管理者やパソコンベンダー、マイクロソフトには適切な対応をぜひお願いします。
「PCの時計が1時間ずれている」の原因
さらに追記を書きました。
----
追記
マイクロソフトが修正したと明らかにしたそうです。原因は明らかにしていません。
http://www.itmedia.co.jp/news/spv/1704/04/news069.html
おそらく今回時刻がずれた件は、2パターンあって
- NTPサーバーのDaylight Savings Enableの設定が有効になっていて時刻がずれ、ずれた時刻が配信された。
- ローカルのDaylight Savings Enableの設定が有効になっていてずれた。
マイクロソフトが対応したのが1.だけだとすると2.が原因でずれたマシンは10月にもまたずれてしまうのではないかと心配です。
上記は完全に憶測なので、マイクロソフトには原因の詳細を明らかにしてほしいです。
----
ITmedia で「PCの時間が1時間ずれている」報告多数という記事が出ていて、「現時点で原因は不明だ」となっています。
NTPサーバーの不具合によりずれたと予想されていますが、NTPサーバーではなくパソコン側の問題かも知れません。
パソコンには、RTC (Real-Time Clock) が搭載されているのですが、RTCの仕様に Daylight Savings Enable という設定があります。
この設定が有効だと4月の第一日曜日と10月の最終日曜日に1時間ずれます。2017年4月2日はこの条件に当てはまっています。今回1時間ずれてしまった実機では10月にも1時間ずれてしまうことが予想されます。
Daylight Savings Enable (DSE). 1=Enable. 0=Disable. When DSE=1, daylight savings is enabled on two special hour updates per year. One is on the first Sunday in April, where time increments from 1:59:59 AM to 3:00:00 AM. The other is the last Sunday in October when the time first reaches 1:59:59 AM, it is changed to 1:00:00 AM.
参考: http://www.intel.com/Assets/PDF/datasheet/290562.pdf
下記の方法でDaylight Savings Enable が有効になってしまっていないか確認してみてください。(ちょっと危険な作業なので自己責任でお願いします)
- RW-Everything を入手し、起動する。
http://rweverything.com/ -
Specific → IO Index/Data → CMOS - 70/71 を選択します。
- (00, 0B) の欄をダブルクリックしてBit0が1になっていた場合は、Daylight Savings Enable が有効になってしまっています。
-
"0" に書き換えれば、今後は発生しなくなるはずです。
pptTeX
pptTeX がダウンロードできなくなっておりご迷惑をおかけしました。
最新版はこちらで公開しております。
http://naitaku.github.io/pptTeX/
東工大ポータル自動ログインスクリプト2009年度版
マトリックスコード入力画面が変わってしまったので,
修正しました.
ダウンロード
おまけとしてVPNに接続するスクリプトもついています☆
説明http://d.hatena.ne.jp/naitaku/20081007/1223402800
*追記(09/01/29)
またログインページが変更されてしまいましたので更新しました.
なんでちまちま変更されるかなぁ...