マイクロソフト、Windows 11 で更新プログラムのサイズを40%削減した方法を紹介

投稿: 2021年10月13日
タグ: 
  Windows  ニュースネタ

マイクロソフトの Windows IT Pro ブログで『Windows 11 で更新プログラムのサイズを 40% 削減した方法』について記事が投稿されていました。
40% ってほぼ半分ですが、どのような方法で小さくしているのか確認してみます。

How Microsoft reduced Windows 11 update size by 40%
https://techcommunity.microsoft.com/t5/windows-it-pro-blog/how-microsoft-reduced-windows-11-update-size-by-40/ba-p/2839794open_in_new
  • Windows 10(1809) で差分圧縮する改善は行ったが、まだ改善ポイントがあった
  • Windows 10 では更新プログラムのアップデート(順方向)とロールバック(逆方向) 用のプログラム両方をファイルとして展開する必要があった
  • Windows 11 では元のバージョンに戻す(逆方向の)プログラムを順方向のプログラムから自動生成できるようにした
  • その結果、展開する更新プログラムのファイルサイズを大幅に削減している
  • Windows 10 で導入された順方向/逆方向差分圧縮(forward and reverse differential compression)

    本題の Windows 11 の改善の前置きとして、Windows 10 の話から。

    Windows 10 (1809) の時点で累積更新プログラムをより早く適用できるように、 順方向/逆方向どちらの更新時にも差分圧縮する機能が入っていたようです。 ドキュメントも用意されていました。

    Windows順方向と逆方向の差分を使用した更新
    https://docs.microsoft.com/ja-JP/windows/deployment/update/psfxwhitepaperopen_in_new

    順方向、とはバージョンが増加する形での更新(バージョン1 ⇒ 2)、逆方向とは更新プログラムを削除するような操作(バージョン2 ⇒ 1) と読み替えて差し支えないと思います。

    上記ドキュメントを かいつまむと、Windows 10 1803 以前から存在していた「Express download (高速ダウンロード)」による更新プログラム適用の課題を解決するために、 Windows 10 1809 で『順/逆方向差分圧縮』機能を追加したようです。

    Windows 10 1803 までは「バージョン1 からバージョン2用の更新ファイル」「バージョン1 からバージョン3への更新ファイル」といったようにアップデートのパスごとにファイルを展開していたため、 ダウンロードが必要なファイルサイズが大きくなっていた、と記載されています。

    Windows 10 1809 で順方向(通常のアップデート)、逆方向(戻すためのプログラム) 両方を、更新ごとに差分ファイルとして小さなファイルに 分割・圧縮して保存したようです。

    Windows 11 で採用された「逆方向更新データ生成 (reverse update data generation)」

    Windows 10 1809 で適用された改善では、バージョン 1 ⇒ 2 に更新するファイル(順方向) とバージョン 2 ⇒ 1 に更新するファイル(逆方向) が必要になります。 アップデートしたら戻せない、では困るので当然 両方とも必要なファイルでしょう。

    Windows 11 ではこの部分を改善して大幅にサイズ圧縮した、とあります。以下部分です。

    We discovered that these transforms and patches can be “observed” by the delta apply step, and efficiently re-encoded into a reverse delta (n->0), obviating the need to distribute reverse deltas in a paired delta approach.

    [意訳] (更新プログラムの) 差分適用のステップは「監視」でき、逆デルタ(バージョンn から元のバージョンに戻すために必要なデータ) は効率的に再エンコードできるため、 「ペアデルタアプローチ(順方向/逆方向の差分を適用していく手法)」において、逆デルタを配布する必要がないことが分かった。

    さらっと(ちょっと難解な言葉で) 書かれてますが、『今までは逆方向のパッチも作って展開していた』けど『順方向のパッチ適用時に逆方向のパッチを機械的に自動生成できる』ことが分かったよ、ということのようです。

    当該記事では、順方向と逆方向の更新プログラムはデータとしてバラバラである(一致している部分が少ない) ため、両方を合わせて(圧縮して)もサイズは小さくならない、と記載されていますし、 『今まで両方向の更新プログラムを展開していたのが一方向だけでよい』ということになれば半分近くになりそうです。

    更新プログラム適用によって関数呼び出しアドレスが変わっても逆アセンブルしてマッピング

    Windows の更新プログラムは単純にファイルを上書きするようなものではなく、バイナリ内の関数のアドレスがシフトする等の変更も加えられます。 今回の改善は、それらも考慮しているということで、プログラムを逆アセンブリして仮想アドレスを再マップする、方法をとっているそうです。

    例として、関数呼び出し(call) のアドレスがシフトしたことを検知して mov コマンドを命令として突っ込むという、アセンブリ修正をしている例が挙げられていました。

    windows11-reverse-update-delta-generation
    説明を読んで原理は分かりますが、これを Production に展開する機能として実装/テストできるところに驚異を感じます。 特に、仮想アドレスのシフトを読み込んでアセンブリに mov を差し込むとか、マイクロソフトっぽいな、と感じてしまいました。