検索
連載

Windowsトラブル解決事例──容量可変VHD肥大化の犯人とその解消山市良のうぃんどうず日記(164)

Hyper-Vの容量可変タイプのVHD/VHDXファイルは、割り当てサイズではなく、使用量に応じて拡大していくため、評価環境などパフォーマンスへの影響を許容でき、Hyper-Vホストのストレージを効率的に利用したい場合に有効です。そんな容量可変タイプのVHDXファイルが、割り当てサイズ近くにまで肥大化しているのを発見しました。物理環境でも長く使用していれば発生し得る空き領域不足のトラブルと思うので、問題の調査から解決までをレポートします。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
「山市良のうぃんどうず日記」のインデックス

山市良のうぃんどうず日記

100GBのディスクを使い果たしてしまったWindows 8.1、その犯人は?

 筆者はサポート期間中であるかどうかにかかわらず、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ホストのストレージがもったいないし、バックアップしたり、コピーしたりする際の扱いも大変です。

画面1
画面1 MSI版Office 2013がインストールされているWindows 8.1(x64)の仮想マシン。容量可変タイプのVHDXがいつの間にか割り当てサイズ100GB近くまで肥大化していた。ゲストOSのC:ドライブの空き容量は6GBを切っていた

 何がディスクをこんなに使用しているのか、「Windows Sysinternals」の「Disk Usage(du.exe)」を使用すると簡単に調査できます。

  • Disk Usage[英語](Windows Sysinternals)

 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)。

画面2
画面2 Windows SysinternalsのDisk Usage(du.exe)でディレクトリごとのディスク使用量を調べてみると、「C:\Windows\Installler」が約50GBと最も大きく、「C:\Windows\WinSxS」の約24GBが続く

WinSxS肥大化の犯人はWindows Update、最適化で22GBを解放、所要時間は22時間

 「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))が実施されていたことを確認できました。

画面3
画面3 「ディスククリーンアップ」は「Windows Updateのクリーンアップ」の項目の削除で23.4GBを解放できることを示した

 コンポーネントストアは、次のコマンドラインを管理者として実行することで、さらに圧縮できる可能性があります。今回のケースでは、さらに約2GBの領域を解放することができましたが、完了するまでに約2時間かかりました(画面4)。

DISM  /Online /Cleanup-Image /StartComponentCleanup /ResetBase

画面4
画面4 実際には「ディスククリーンアップ」により20時間かかって約20GBの領域を解放できた。「DISM」コマンドによるクリーンアップにより、さらに約2GBの領域を解放できた

巨大な「C:\Windows\Installer」に矛盾なし? 一時しのぎのNTFS圧縮で約8GBを解放

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る