Home > Windows にまつわる e.t.c.

肥大化した VHD の切り詰め方法


Hyper-V VM や、VHD 環境を運用していると、VHD 内の空き領域は十分あるのに、VHD ファイルサイズが必要以上に肥大化してしまうことがあります。

肥大化した VHD は、VHD を最適化すればサイズを切り詰められるのですが、効率よく切り詰めるには以下の手順で最適化します。

 

VHD のデフラグ

VHD 内がフラグメンテーションを起こしていると、サイズ切りつめの効率が大幅に下がるので、まずはターゲットの VHD に含まれているボリュームをデフラグします。

VM / VHD boot マシンの GUI でデフラグしても良いのですが、On SSD とかで、GUI でのデフラグがトリムしかできない場合は、デフラグ効果が出ないので思ったほどサイズ切りつめができません。
このような場合は、defrag.exe を使ってデフラグします。

defrag.exe を使ってデフラグをする場合は、ファイルロックを極力少なくするために Hyper-V ホストに VHD をマウントし、Hyper-V ホストでデフラグするのがお勧めです。
(Optimize-Volume だとトリムがかかるので敢えて defrag.exe)

 

defrag [ドライブレター] /d /u /v

 

各オプションの意味は以下のとおり

/d : 従来の最適化を実行します(トリムさせない)
/u : 操作の進行状況を画面に表示します。
/v : 断片化の統計情報を含む詳細を出力します。

/x オプション(指定したボリュームの空き領域の統合)もありますが、このオプションは /d に含まれるので指定する必要ありません(/d /x は排他関係)

 

(以前、空き領域をゼロパディングする手順を書いていましたが、再度実測したら誤差程度の差しか出なかったのでゼロパディングする手順カットしました)

 

VHD の最適化

デフラグが完了したら、最適化して完了です。

VHD をマウントしているのでしたら、ディスマウントしてから最適化します。

 

Mount-VHD -Path [VHDフルパス] -ReadOnly -Passthru | Optimize-VHD -Mode Full -Passthru | Dismount-VHD

 

これで VHD が、実使用容量に近いサイズになったはずです。

 

関数化

一連の処理を関数にするとこんな感じですね

#################################################
# VHD サイズを切り詰める
#################################################
function ShrinkVHD( $VHD ){
    # VHD 存在確認
    if( -not (Test-Path $VHD)){
        echo "$VHD not found."
        return
    }

    # VHD を RW マウントしてディスク情報を得る
    $DiskInfo = Mount-VHD -Path $VHD -PassThru | Get-Disk
    
    # マウントしたボリューム情報
    $VolumeInfo = $DiskInfo | Get-Partition | Get-Volume
    
    # ドライブレターがあるボリュームを defrag
    [array]$DriveLetters = $VolumeInfo | ? DriveLetter -ne $null | % { $_.DriveLetter }
    foreach( $DriveLetter in $DriveLetters ){
        $DriveName = $DriveLetter + ":"
        defrag $DriveName /d /u /v
    }

    # VHD ディスマウント
    Dismount-VHD -DiskNumber $DiskInfo.Number

    # VHD サイズ切りつめ
    Mount-VHD -Path $VHD -ReadOnly -Passthru | Optimize-VHD -Mode Full -Passthru | Dismount-VHD
}

 

関連情報

関数を PowerShell プロンプトで実行する
http://www.vwnet.jp/Windows/PowerShell/2016100401/UseFunctionInPsPrompt.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.