Hyper-Vの容量可変タイプのVHD/VHDXファイルは、割り当てサイズではなく、使用量に応じて拡大していくため、評価環境などパフォーマンスへの影響を許容でき、Hyper-Vホストのストレージを効率的に利用したい場合に有効です。そんな容量可変タイプのVHDXファイルが、割り当てサイズ近くにまで肥大化しているのを発見しました。物理環境でも長く使用していれば発生し得る空き領域不足のトラブルと思うので、問題の調査から解決までをレポートします。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
筆者はサポート期間中であるかどうかにかかわらず、WindowsやMicrosoft Officeのさまざまな組み合わせの環境を「Hyper-V」や「Microsoft Azure」の仮想マシンとして保持し、サポート期間中の場合は毎月のWindows Updateで更新し続けています。
その中の1台、Windowsインストーラー形式の「Office Professional 2013 Service Pack 1(SP1)」(以下、MSI版Office 2013)がインストールされている「Windows 8.1(x64)」のHyper-V仮想マシンが、いつの間にか大変なことになっていました。
このHyper-V仮想マシンには、OSディスクとしては容量可変タイプの100GBのVHDXを割り当てているのですが、空き領域が残り数GBしかなく、当然のことながら容量可変タイプのVHDXファイルのサイズは容量固定タイプと同じくらいに肥大化していたのです(画面1)。せっかくの容量可変タイプのVHDXファイルなのに、これではHyper-Vホストのストレージがもったいないし、バックアップしたり、コピーしたりする際の扱いも大変です。
何がディスクをこんなに使用しているのか、「Windows Sysinternals」の「Disk Usage(du.exe)」を使用すると簡単に調査できます。
C:ドライブのルートにあるディレクトリを次のコマンドラインを実行して1つずつ確認してみると、「C:\Windows」が約85GBもあり、ディスク使用率を圧迫していることがすぐに判明しました。
du -nobanner "<ディレクトリのフルパス>"
続いて、次のようなコマンドラインを実行します。
du -nobanner -l 1 -ct "C:\Windows" | clip
このコマンドラインは、「C:\Windows」の1つ下のディレクトリ階層(-l 1)までのディスク使用状況をタブ区切り形式(-ct)で出力し、クリップボードに貼り付けます(| clip)。クリップボードを「Microsoft Excel」の空のワークシートに貼り付け、「DirectorySizeOfDisk」列でソートすると、「C:\Windows\Installler」が約50GBと最もディスク使用量が大きく、次が「C:\Windows\WinSxS」の約24GBであることが分かりました(画面2)。
「C:\Windows\WinSxS」は、Windowsのバイナリ(実行可能ファイル、ライブラリ、ドライバなど)が格納されているコンポーネントストアで、「Windows Vista」から導入された「CBS(Component-Based Servicing)」という技術で管理されています。
Windows Updateで更新プログラムがインストールされると、更新されたファイルは「C:\Windows\WinSxS」に格納され、「System32」ディレクトリなどのパス(C:\Windows\System32\ntoskrnl.exeなど)にリンクされます。更新プログラムをアンインストールできるように、置き換えられた過去のバージョンのバイナリもまた、「C:\Windows\WinSxS」に保持されています。
コンポーネントストア「C:\Windows\WinSxS」は、「ディスククリーンアップ」(Cleanmgr.exe)で最適化することができます。「C:\Windows\WinSxS」の最適化のために、「ディスククリーンアップ」を管理者として開始し、「Windows Updateのクリーンアップ」を含む、全ての項目を選択して実行しました。
「Windows Updateのクリーンアップ」の項目の削除により23.4GB、合計23.5GBの領域が解放されると表示されましたが、実際に解放されたのは約20GBでした。以下の画面3の右は、クリーンアップ開始から8時間が経過したところです。完了するまでは、なんと20時間を要しました。完了した時点でCBSのログ(C:\Windows\Logs\CBS\CBS.log)を参照してみると、その内容はともかく、1万6000以上のトランザクション(Created NT transaction (seq 16402))が実施されていたことを確認できました。
コンポーネントストアは、次のコマンドラインを管理者として実行することで、さらに圧縮できる可能性があります。今回のケースでは、さらに約2GBの領域を解放することができましたが、完了するまでに約2時間かかりました(画面4)。
DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBase
Copyright © ITmedia, Inc. All Rights Reserved.