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

次に、partimage でバックアップしたイメージをリストアします。

まず、ホストでリストア先の仮想ディスクを作成します。
コマンドプロンプトで下記を実行します。

C:\>H:
H:\>qemu-img.exe create -f vmdk <例えばゲストのマシン名>.vmdx 500G


次に、vmx ファイルなど仮想マシンファイル一式を空き容量のある HDD の、上記リストア先の仮想ディスクを作成したディレクトリにコピーします (ホスト上で行う)。

[2009-09-21-1] の作業を行った後の vmx ファイルをコピーすると、partimage のレスキュー CD ISO からブートし、/dev/sdb が認識されるので、そのまま仮想マシンを起動します。

fdisk /dev/sda でパーティションを作成し、mkfs.ext3 /dev/sda1 でフォーマットします。
パーティションの構成、サイズは [2009-09-21-1] で記録した内容と同じにします。
Linux swap パーティションも作成します。

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

# mount /dev/sdb1 /mnt/backup


そして、partimage を起動し、/mnt/backup/<例えばマシン名>.000 を /dev/sda1 にリストアします。

# partimage


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

次の画面ではすべてデフォルトのままキーボード F5 を押します。

[OK], [Yes] をキーボード Enter で押すとリストアが始まります。

ここで問題発生。


リストア時に 'Can't read block 0 from image' というエラーが出てリストアができません。

調べてみたところ I fixed my restore problems! / www.partimage.org を見つけました。

サイトのスクリプトを少し修正して、下記スクリプトを作成し、実行したところうまくいきました。

#!/bin/bash
# this bash-code expects the backup files as $BACKUPSET.000,
# $BACKUPSET.001, etc. Modify to match your environment.
BACKUPSET='/mnt/backup/<例えばマシン名>'
RESTORE_OPTS='-b'
DEVICE='/dev/sdb1'

toskip=0
{
  for partfile in $BACKUPSET.*; do
      cat $partfile | dd skip=$toskip 2>/dev/null
      toskip=1
  done;
} | partimage $RESTORE_OPTS restore $DEVICE stdin


今回はイメージ作成時に無圧縮を指定したので cat を使用していますが、Compression level: Gzip を指定した場合は cat を zcat に変更すること。

その後、partimage で MBR もリストアしました。