CentOS5 の KVM ゲストを VMware ゲストに移行

VMware vCenter Converter で簡単に出来るかと思ったのですが上手くいきませんでした (P2V はできるけれど V2V は出来ないのでしょうか? あるいはディスクが virtio だったからなのかもしれません)。

しかたがないので手作業で試行錯誤して頑張りました!

構成

移行元ホスト、移行先ホスト、移行するゲストは次のような感じです。

  • 移行元ホスト
  • 移行先ホスト
  • 移行するゲスト
    • CentOS 5.6 (2.6.18-238.19.1.el5)
    • ディスクとNICは virtio を使用
    • LVM は使っておらず全て基本パーティションをマウント(/, /boot, swap)
    • ディスクイメージは raw 形式

VMware のゲストで必要そうなモジュールを確認

既に VMware に構築していた CentOS5 のゲストで必要そうなカーネルモジュールを確認します。 多分 modprobe.conf に書かれているものを入れとけば OK だと思います。

/etc/modprobe.conf

alias eth0 e1000
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptspi
alias scsi_hostadapter2 ata_piix

これらが依存するモジュールも必要なはずなので modprobe で依存関係を確認します。

modprobe --show-depends e1000
modprobe --show-depends mptbase
modprobe --show-depends mptspi
modprobe --show-depends ata_piix

得られた結果はメモしておきます。

KVM ゲストで VMware で起動するための initrd を作成

ディスクイメージを変換しただけだと Linux の起動中にディスクが認識出来なくなって起動出来ないので、 必要なモジュールを含んだ initrd を作ります。必要なモジュールは↑の modprobe で確認したヤツらです。

cd /boot
cp -p initrd-$(uname -r).img initrd-$(uname -r).img.bak

mkinitrd \
  --with=e1000 \
  --with=mptbase \
  --with=scsi_mod \
  --with=scsi_transport_spi \
  --with=mptscsih \
  --with=mptspi \
  --with=libata \
  --with=ata_piix \
  -v -f initrd-$(uname -r).img $(uname -r)

出来上がった initrd にモジュールが追加されているかを確認します。 下記のコマンドで initrd の中身が見えるのでざっくり確認しておきます。

gzip -dc initrd-$(uname -r).img | cpio --quiet --list | grep lib/ | sort

準備は完了したので KVM のゲストをシャットダウンします。

halt

KVM ホストでイメージを vmdk 形式に変換

KVM ホストでゲストのイメージを vmdk 形式に変換します。 raw 形式のファイルから変換していますが、別の形式の場合は適当に読み替えてください。

cd /var/lib/libvirt/images/guesterver
qemu-img convert -f raw -O vmdk disk.img disk.vmdk

変換されたディスクイメージを VMware のホストにコピーして起動します。 VMware の構成(*.vmx)は適当に作成してください(同じ構成のゲストからコピーして作ると簡単です)。

VMware ゲストで initrd を作り直し

この時点で移行は完了していますが、lsmod とかでロードされているカーネルモジュールを表示させると virtio などの VMware では必要のないものがロードされたままになっているので、 initrd を作りなおします。

まずは modprobe.conf を次のように書き換えます。この内容は↑の方で確認した、別の VMware ゲストの内容です。

/etc/modprobe.conf

alias eth0 e1000
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptspi
alias scsi_hostadapter2 ata_piix

次に initrd を作り直します。新しい initrd には virtio などの余分なものは含まれていないはずです。

cd /boot
cp -p initrd-$(uname -r).img initrd-$(uname -r).img.ok
mkinitrd -v -f initrd-$(uname -r).img $(uname -r)
gzip -dc initrd-$(uname -r).img | cpio --quiet --list | grep lib/ | sort

再起動します。

reboot

再起動後にロードされているモジュールを確認してみます。 virtio とかの不要なモジュールは読み込まれていないはずです。

lsmod | sort