2017年10月28日 (土)

Docker for Windowsをアップデート/再インストールできない件

今年の春の頃からだったろうか、 家のPCのDocker for Windowsがアップデートできなくなりました。

アップデートを開始すると、 「Do you want to replace your current version of Docker for Windows with this new one 17.09.0-ce-win33(13620)?」というダイアログが出ます。 ここで「はい」を押そうが「いいえ」を押そうが、 次の瞬間「install canceled」と出て先へ進めなくなります。

一回Docker for Windowsをアンインストールして、 最新バージョンのインストーラーで再インストールを試みても同じ結果。

そのうち直るだろうと思って放っていましたが、 一向に直らない。 で、まじめに調べてみました。

対処法

レジストリの以下のキーを削除してからアップデート/再インストールを行います。

HKCR\Installer\UpgradeCodes\9CA3F2E62DBFCA74DB9BD0384695C460

最後の"9CA3F2E62DBFCA74DB9BD0384695C460"の値は、 ひょっとすると環境によって異なるかもしれません。 アップグレードコードの役割からすると、同じ値の場合が多いと思いますが。 確実を期したければ、後述の詳細をみて、確認してください。

詳細

Dockerのコミュニティフォーラムの以下のトピックを参考にしました。

Cannot uninstall Docker for Windows

ここではアンインストール時の問題として取り上げられています。 このトピックは2016年1月に始まっていますが、 長らく進展していませんでした。 キーになるのは、一年半以上も後の投稿です。

2017年10月12日 3:06のdjarvis8さんの投稿

Process MonitorでDocker for Windowsのインストーラーをモニタし、 片っ端からチェックして"HKCR\Installer\UpgradeCodes"下のキーを読んでいるのが問題だと突き止めたらしい。 すげえ。

というわけで、 私もProcess Monitorで問題のレジストリキーを探して、 それを削除したところ、無事Docker for Windowsを再インストールできました。

問題のレジストリキーは同じだとは思いますが、 環境や現在インストールされているバージョンによっては異なる可能性があります。 確実を期すならばProcess Monitorでインストーラーが実際に読もうとしている"HKCR\Installer\UpgradeCodes"下のキーを確認するとよいでしょう。 結構めんどくさいけど。

2017年4月 4日 (火)

PCの時計が1時間進む問題が発生したので調べてみた(もう答は出た、と思ったけどなんか混迷している)

昨日(4月3日)、私のPCの時計が1時間進んでいるのに気が付きました。 どうやら、同じ目にあっている人が多数いたようです。

「PCの時計が1時間ずれている」報告多数 (ITMedia)

気持ち悪いので少し調べてみました。 なんですけれど、今日タイムライン上で以下の記事を知りました。 答はこれで決まりでしょう。 (と思ったんだけど、今ちょっとわけわからん状態になっている。「で、どうするよ」の項で後述)

「PCの時計が1時間ずれている」の原因 (Tactful Answer)

ですが、せっかく簡単な実験などしていたので、 書き残しておきます。

  • 観察
  • 実験
  • で、どうするよ

観察

4月3日夜、家の帰ってPCをスリープから復帰させてしばらくして、時計が1時間ずれていることに気づきました。 家にPCが数台ありますが、自分のノートPC1台のみ時計が進んでました。

で、イベントログの「システム」でスリープ前後を見ると、 以下のようなログが残っていました。

時刻 ログ
2017/04/03 0:32:53
システムがスリープ状態になります。

スリープの理由: アプリケーション API
2017/04/03 0:32:54
システムがスリープ状態から再開されました。
2017/04/03 20:57:35
システム時刻は ‎2017‎-‎04‎-‎02T15:32:54.726613700Z から ‎2017‎-‎04‎-‎03T11:57:35.500000000Z に変更されました。

変更の理由: システム時刻がハードウェア クロックと同期されました。

時刻はUTCで出ていますが、 日本時間に直すと、 4/03 0:32にスリープしています。 その後、スリープから復帰し、直後にハードウェアクロックと同期しています。 この際のハードウェアクロックの時刻は20:57です。 「再開しました」ログのタイムスタンプが0:32:54なのは、クロック同期前なので、スリープ時点の時刻が出てしまっているのでしょう。

記録されたスリープ時の時刻は前夜の記憶通りで正しいものです。 一方、PCを再開したのは20時前でした。 つまり、復帰時にハードウェアクロックが1時間進んでいる。

復帰時のハードウェアクロックが進んでいるので、 OSではなくPCのクロックの問題なんだろうと思って、 以下のようなツイートをしました。

実験

で、今朝(4/04)、ちょっと実験をしてみました。 出勤前に、PCに以下の操作をしました。

  1. PCをLANから切り離す(WiFiも無効にする)
  2. PCを再起動し、Windowsは起動させず、BIOS画面で時間を4/02 23:30にする
  3. 電源を切る

夜、帰宅後に電源を投入し、そのままBIOS画面を出して時間を確認しました。 すると、予想通り、朝ずらした時間から予期される時間よりも1時間進んでいました。

LANに繋がず、OSも動かしていない状態で時計が進んだので、 OSもタイムサーバーも無関係。

この結果は、 冒頭に紹介した記事(「PCの時計が1時間ずれている」の原因 )の説明と整合します。

で、どうするよ

先の記事の説明に従って自分のPCを調べたところ、 確かにPCの"Daylight Savings Enable"設定が有効になっていました。 これが有効だと、4月と10月にPCのクロックがずれます。 つまり、この先も半年ごとに時間がずれることになります。 自分はツールで設定を変更するとして、 一般ユーザーとかどうするんだろうか。 これは多分工場出荷時の設定がこうなっているんだろうから、 メーカーのサポートに連絡した方がいいんだろうか、 とか思っていたところ、 Microsoftが修正(!)したとのニュースが。

「PCの時計が1時間ずれる」グローバルで発生「修正した」とMS (ITMedia)

いったい、どうやって? Windowsから"Daylight Savings Enable"を無効化してくれるのか? まさか、強制的に時刻同期させて終わりじゃないよな? 半年後またずれるし。

疑いをもちつつWindows Updateを試みましたが、 なにも落ちてきません。 念のため、先のツールで再チェックしましたが、 "Daylight Savings Enable"は有効のままです。

謎。しばらく様子見。

あともう一つ疑問があって、 なんで今回のみ騒ぎに? そういえば、このPCにしてから時計がずれていたことが以前にもあって、 「あれー」と思いながら時計を合わせたような覚えがぼんやりとあるんだけど、 今回これほど騒ぎになったのはなんでだろう? 最近よくPCに採用されているボードがこの設定になっているとか?