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