VHDファイルを最適化して実サイズまで縮小する

使い続けるうちに実容量よりもファイルサイズが肥大化してしまう可変サイズのVHDファイル。これを実サイズまで縮小したいことがままある。

Hyper-Vマネージャから最適化しても容量は減らず、検索で見つかる記事などで紹介されているVHD Resizerは配布元が閉じていて既に入手できない。

そういう時は以下のコマンドを試してみる価値がある。

> $vhd = "{VHDファイルへのパス}"
> Mount-VHD $vhd -Readonly
> Optimize-VHD $vhd -Mode Quick
> Optimize-VHD $vhd -Mode Quick
> Dismount-VHD $vhd

これでVHDファイルサイズが実際に使用しているデータサイズまで縮小される。 VHDファイルを読み取り専用でマウントするのと、Optimize-VHDを2度実行するのが要点。

Hyper-Vマネージャからの最適化やOptimize-VHDを直接実行した場合はReadonlyでマウントされていないので、全セクタを舐めつつ結局何もしない。ただただ時間を浪費するだけなので無駄である。

なおMount-VHD-Readonlyオプションを使うには管理者権限でPowerShellを起動する必要がある。

普通に起動したPowerShellから管理者権限を持たせて新しくPowerShellを起動する場合は以下のコマンドが使える。

> Start-Process powershell -Verb runas