Windows 10 / Windows Server 2016 では更新プログラムが累積的な更新プログラム(CU)として提供されるようになり、適用状態の管理はしやすくなったものの Windows Update からアップデートを実行するとネットワークが異常に重くなることがあります。自宅の仮想環境でしばしばありました。
Windows Update でアップデートするのではなくて、Microsoft Update Catalog から CU をダウンロードしてきてローカルで適用したほうがネットワークを圧迫せず、結果的に適用も早く終わったので、なるべくオフラインでアップデートするようにしてます。仮想マシン上に CU を配置してダブルクリックして適用しても良いのですが、せっかくなのでオフラインで適用する PowerShell スクリプトを作ってみました。
最新 CU のダウンロード
Hyper-V への OS インストールが終わったら、最新の CU をダウンロードします。最新の CU はここから確認できます。
Windows 10 および Windows Server 2016 の更新履歴
上記のページで KB 番号を確認したら、Microsoft Update Catalog から検索して該当の CU をダウンロードします。
ダウンロードしたファイルは Hyper-V サーバーの適当な場所に置いておきます。
オフラインパッチ適用
CU の適用には DISM を使います。VHD をマウントして CU を適用してコミットしてアンマウントする、という一連の流れを簡単ですが PowerShell スクリプト化します。
param(
[Parameter(Mandatory=$true)]
[string]
$VhdPath,
[Parameter(Mandatory=$true)]
[string]
$MountDirectory,
[Parameter(Mandatory=$true)]
[string]
$UpdateFilePath
)
DISM /Mount-Image /ImageFile:$VhdPath /Index:1 /MountDir:$MountDirectory
DISM /Image:$MountDirectory /Add-Package /PackagePath:$UpdateFilePath
DISM /Unmount-Image /MountDir:$MountDirectory /Commit
\$VhdPath には仮想マシンの VHD ファイルのパスを、\$MountDirectory にはマウント用のフォルダーを、\$updateFilePath には Microsoft Update Catalog からダウンロードしてきた更新プログラムファイルのパスを指定します。(ファイルを Shift キーを押しながら右クリックして「パスのコピー」を選択すると簡単にフルパスがコピーできます)マウント用のフォルダーは適当に空のフォルダーを作って指定してやれば OK です。仮想マシンはシャットダウンしておいてください。
.\offlinePatch.ps1 -VhdPath <vhd ファイルのパス> -MountDirectory <マウント用フォルダーのパス> -UpdateFilePath <更新プログラムファイルのパス>
CU はサイズが大きいので適用には時間がかかります。お茶でも飲んで待ちましょう。当たり前ですが壊れたら困る仮想マシンの場合は適用前に VHD のバックアップを取っておきましょう。
まとめ
累積的な更新プログラムになってサーバー管理者的には管理しやすくなって良いのですけど、もうちょい安定するとよいですな。