当たり前だと思っているかもしれないけれど

Windowsしか使っていない人にはある程度の不満(例えば勝手に唐突に行われるとか)はあるのかもしれないが、一方「そういうものだ」という刷り込みが働くため、「おかしい」と感じないかもしれない。

だが、LinuxerがたまにWindowsを使うと本当に腹立たしい

  • なぜ勝手に行うのか
  • なぜ具体的に何をどう更新するのか言わないのか
  • なぜ再起動を要求するのか
  • 挙げ句なぜ勝手に再起動してしまうのか(しかも他のアプリケーションを無視して)
  • なぜこんなにも時間がかかるのか
  • なぜその場で更新を完了せずにシャットダウン時に更新するのか (シャットダウンを遅らせてしまうのか)
  • しかもなぜシャットダウン時にすら完了せずに次回起動時にさらに遅らせるのか
  • なぜに「構成に失敗」するのか
  • なぜ直接に書き戻さず同様の工程を経てさらに事態を悪化させるのか
  • しかも依存関係にあるものを更新しようとしてその依存関係が満たせずに「失敗する」ということを繰り返す
  • 大体依存関係にあるとしても順番に適用するようにすれば良いだけではないか
  • なぜユーザーがわざわざ時間をかけて設定したものをリセットしてしまうのか
  • いくらなんでも時間がかかりすぎ。ダウンロードも異常な時間がかかるし、アップデートの適用は人生を消耗させる
  • さらにはプログレスバーが機能していない

Linuxならそんなことはない

Linuxといっても方式は色々なのだけど、私はArch Linuxが最も優れていると思う。

Arch Linuxの場合は次のようになる。

アップデートの実行

アップデートはユーザーが手動で行う。

もっとも、ジョブスケジューラに登録して自動的に行うようにしても良いし、その方法は簡単だ。 少なくともWindowsで自動化する方法(現在は問答無用の自動なので自動化する意味もないが)よりはずっと簡単だ。

通知もされないが、通知アプレットを導入することで通知してもらうこともできる。 一般的にはupdate-notifierやOctopi Appletを使う。

アップデートはコマンド一発である

# pacman -Syu

コマンド大っきらいという人ならPamacなりOctopiなりでボタン押しでもいい。 以下はコマンドで説明しているが、これはコマンドのほうが楽だからであって、別にボタンを押すのが好きな人はボタンを押したり選択肢を選んだりすれば良い。

Octopiによるアップデート

動画では3分ほどで長く放置したシステムのアップデートが完了している。 ダウンロード部分は事前に終わってしまっているが、こちらを含めても8分ほどであった。

アップデート処理

先の動画の通りである。

ただちにダウンロードし、アップデートを適用してくれる。 なお、Arch Linuxはローリング・リリースなのでWindows 10同様にシステム更新も同じ方法でやってくれる。

リポジトリ上にあるサードパーティアプリケーション(例えばFirefoxとか)もこの更新の対象で、インストールされているものは最新にしてくれる。

このことからもWindows Updateよりもはるかに多く、大容量のファイルを更新したことがわかるかと思うが、Widnwos Updateよりはるかに高速である。

公式リポジトリ上にない外部プログラムも、AURになるものをAURからインストールしているのであれば、同じようなコマンド一発でできる。

$ pacaur -ua

このケースではGoogle Chromeなどをインストールしている。 q4wineの更新には失敗しているが、これはpacaurが特定の状況でパッケージの更新の面倒を見られないことがある(バグ)ためであり、yaourtで行った場合には発生しない。

$ yaourt -Sua

更新したとき 再起動は必要ない

正確に言えば再起動しなければならないケースもあるが、その場合でも再起動する/しないはユーザーに委ねられている。

  • サーバーソフトウェアなど連続稼働するソフトウェアはそのソフトウェアを再起動しないといけない場合がある
  • USBペンドライブを差した時などカーネルの機能を利用する場合はカーネルの更新がかかっていると失敗するので再起動する必要がある

再起動しなければ差し障る、ということはあまりないし、 再起動する場合でも特別に時間がかかることはない。 いつも通りに終了し、いつも通りに起動するだけだ。

特殊なケース

設定ファイルが更新された場合

更新によって設定ファイルが更新された場合、ユーザーが変更した設定ファイルを上書きしてしまわないよう、新しい設定ファイルを.pacnewとしてとっておき、既存の設定ファイルを維持する。

これをマージしたり削除したり、あるいは置換えたりするツールもある。もちろん、そのとき変更も確認できる。

また、設定ファイルで削除時にもバックアップしておくべきファイルはパッケージを削除したときに.pacsaveとして保存される。

Windows Updateでは問答無用で更新する。 削除時はソフトウェア次第だ。

パッケージ構成の変更がされた場合

同一のファイルが別のパッケージに移動した、パッケージ名が変わった、パッケージが分割されたといった場合は、 更新を開始するときにそれが告知され、続行するかどうかを尋ねられる。

Windows Updateでは確認せずに実行する。

解消できない互換性のない変更がなされた場合

aファイルの所属がパッケージAからパッケージBに移った、というケースではアップデートしようとするとパッケージBが(最新版では所有権を放棄した)パッケージAのファイルを上書きしてしまうことになる。

このようなケースではエラーとなりアップデートは中止される。 このとき、何がどう問題なのか、ということは通知される。

error: file owned by 'package-a' and 'package-b': 'usr/lib/liba.so'

これを踏まえてどうするかはユーザーが選択すれば良い。

パッケージA、あるいはパッケージBを削除する、衝突しているファイルを削除して最新のパッケージに委ねる(やや危険)、強制的に上書きを許す、などだ。

その通知を確認した上でユーザーが自分の意思を伝えれば良い。 次の例では「Package Bのインストールを優先せよ」と伝えている。

# pacman -S --overwrite package-b

前提になっているパッケージがない場合

最新のパッケージで上書きされるので何も問題はない。

Windowsの場合は全部の更新をインストールしようとし、 前提になっているアップデートがインストールできないためWindows Update全体が失敗する(ただし、一部は適用されたままになる)。

ダウングレードする

基本的に新しいパッケージに更新する、という前提があるので、古いものに更新するということは普通は考えない。 だが、現実には稀に「新しいパッケージに重大なバグが見つかったので差し戻す」ということがある。

これは、明示的に「ダウングレードしてもいいよ」と示すだけだ。

# pacman -Syuu

Windowsでは新しいアップデートとして適用するので、必ず一度新しくしてから古いものに戻す。 それが許されないような(適用した時点で問題が起こる)ものはアップデートを取り消して打ち消すためのアップデートを追加している。

構造的な疑問

さて、Windows Updateの動作の詳細は公開されていないし、ユーザーも知ったつもりになっているだけで質問したところで動作に関する回答は返ってこない。

だが、いくつか分かっていることがある。

  • Windows Updateはファイルを書き換えている。 上書きするのではなく変更しているので、手動で変更されているとコケる。
  • また、このことから順次適用する必要がある。でないと前提としている状態になっていないのでコケる
  • Windows Updateはアップデート実行ごとではなく個別アップデートごとにPCの情報を収集する
  • Windows Update実行時にトランザクションごと「何を変更したか」という情報を保存している。トランザクション失敗時は変更を破棄するのではなく、変更を遡るようになっている
  • Windows Updateであってもシステムファイルに対して書き込むことはシステム稼働中は行わえない。このためにシャットダウン時に遅延している
  • Windows Updateプロセスが更新された状態を必要とする場合、再起動して更新された状態でWindows Updateプロセスを再度走らせる

だが、これらの設計はひたすらダサい。

無駄である上に、特に安全なわけでもない。 実際、Windows UpdateはLinuxのアップデートと比べ、はるかに時間がかかり、その上非常によく失敗し、その失敗は取り消せないようなダメージを与える。

つまり、非常に時間がかかり、リソースを食いつぶし、その間ユーザーの動作を妨げ、ユーザーにファイル損失などのリスクを与え、果てしなく長い再起動でユーザーの時間をうばう上に危険なのだ。

実際にLinuxが単純な上書きでより良い方法を実現していることを考えても、Windows Updateがそのような仕組みである合理的な理由はどう説明したところで苦しい――たとえ理由があったとしても、それでうまくいっていない事実がある以上、それは言い訳に過ぎない。

そもそも、アップデート処理をブラックボックス化するのはなぜだろう? システムの変更という重大な行為を、なるべくユーザーの意思を介在させずに、かつユーザーに関知しえないようにしているようにしか思えなくなるような振る舞いである。

おわりに

Windowsに対する不満は並べればいくつもあるのだが、Windows Updateもそのひとつだ。

Windowsに飼いならされてはいないか?

Windowsを使うのであればこそ、ユーザーはおかしなところには声をあげていくべきなのではないか。

なぜならば、Windowsを使っていない私のような者は不満を感じる機会も少ないし、見限ればいい、使わなければいいと考えている。 だから、これはWidnowserでない者が言ってもあまり意味のない部分なのだ。

Windowsが良いというのなればこそ、他に劣る部分には改善を求めていくべきではなかろうか。