VMware の肥大化した仮想ディスクを shrink する (その1) [vmware]

VMware の仮想ディスク (.vmdx) は仮想マシンで使用した容量分のサイズに徐々に大きくなっていくのですが、逆に仮想マシンでファイルを削除してもサイズは小さくなりません。

放っておくと vmdx ファイルが肥大化してくるので、たまに shrink してやります。
shrink すると、使用していない容量分を解放し vmdx ファイルを小さくできます。

shrink は仮想マシンの vmware-toolbox から行います (ゲストが Linux の場合)。

# sudo vmware-toolbox


[Shrink] タブを開き、shrink するパーティションを選択し、[Shrink] ボタンをクリックします。


"Shrink Disk" ダイアログが表示されるので、[Yes] をクリックします。


ここで、ホスト側に shrink 後の vmdx ファイルのサイズ分の空き容量がないと、先に進めないようです。


今回は空き容量がなかったので、いったん仮想マシンを終了し、肥大化した vmdx ファイルを空き容量のある HDD に移動して、再度仮想マシンを起動、shrink することにしました。

しかし、ここで問題発生。
vmdx ファイルを Windows エクスプローラでコピー中に CRC エラーが出てコピーが途中で異常終了していまいます。

コピーでは CRC エラーが出るものの仮想マシンは起動できるので、別の方法を取ることにしました。

仮想マシンを partimage のレスキュー CD ISO から起動し、vmdx の中身を空き容量のある HDD に置いた別の vmdx ファイルにバックアップすることにしました。

まず、partimage のレスキュー CD ISO はホストでダウンロードし、適当な場所に置きます。

次に、ホストで vmx ファイルを編集し、CD ISO からブートするようにします。
ide1:0 の記述を下記のように変更します。

ide1:0.present = "TRUE"
#ide1:0.startConnected = "FALSE"

#ide1:0.deviceType = "cdrom-raw"
#ide1:0.fileName = "auto detect"

ide1:0.deviceType = "cdrom-image"
ide1:0.fileName = "D:\systemrescued-x86-1.3.0.iso"


さらに partimage のイメージのバックアップ先となる仮想ディスク (vmdx) を新たに作成します (ホスト上で行う)。
コマンドプロンプトで下記を実行します。

C:\>H:
H:\>qemu-img.exe create -f vmdk partimage.vmdx 500G


作成した vmdx をゲストに認識させるために vmx ファイルに下記の記述を追加します。

ide0:1.present = "TRUE"
ide0:1.fileName = "H:\partimage.vmdk"
ide0:1.writeThrough = "TRUE"


以上で、仮想マシンを起動すると partimage のレスキュー CD ISO からブートし、/dev/sdb に新しく作成した仮想ディスクが見えます。

fdisk /dev/sdb でパーティションを作成し、mkfs.ext3 /dev/sdb1 でフォーマットします。
また、fdisk /dev/sda でパーティションの構成を表示し、記録しておきます (後で使用します)。

partimage のイメージの保存先として /dev/sdb1 をマウントします。

# mount /dev/sdb1 /mnt/backup


そして、partimage を起動し、/dev/sda1 を /mnt/backup にバックアップします。

# partimage


- Partition to save/restore: sda1 を選択
- Image file to create/use: /mnt/backup/<例えばマシン名>
- Action to be done: "Save partition into a new image file" を選択
キーボード F5 を押します。

- Compression level: None
- Options: "Enter description" のチェックを外す
キーボード F5 を押します。

[OK] をキーボード Enter で押すとバックアップが始まります。
バックアップが完了するとダイアログが表示されるので、[OK] をキーボード Enter で押し、終了します。