『virt-v2v』を利用したXen→KVM変換手順
業務でXen仮想環境からKVM仮想環境へ全面的に移行することになり、
どうしたもんかと思っていたところ『virt-v2v』というソリューションを発見!!
virt-v2vを利用するとXen仮想マシンイメージをKVM仮想マシンイメージに変換が出来るらしい。
他にもvmwareイメージも変換することが出来る模様。
http://docs.redhat.com/docs/ja-JP/Red_Hat_Enterprise_Virtualization_for_Desktops/2.2/html/Administration_Guide/virt-v2v-scripts.html
実際に個人サーバー2台を利用して変換する手順を試してみました。
Xen→KVMにイメージファイルを変換するにあたり、
XenのカーネルはXen用のカーネルだしそのあたりの変換はどうするのかな?と思ったんですが
どうもvirt-v2vは通常カーネルをイメージ変換サーバーに事前に保存しておいて、設定ファイルで指定すればそいつにリプレイスしてくれるみたいです。
Xen→KVM変換のおおまかな流れは、
- XenハイパーバイザーサーバーでXen仮想マシンのxmlファイルをダンプ
- Xen仮想マシンxmlファイルとイメージファイルをKVMハイパーバイザーサーバーへコピー
- KVMハイパーバイザーサーバーでvirt-v2vで変換
- 起動
こんな感じでした。
サーバー構成
以下の環境で確認を行いました。
Xenハイパーバイザー
CentOS 5.6 64bit
KVMハイパーバイザー
Scientific Linux 6.1 64bit
Xen→KVM変換対象仮想マシン
CentOS 5.6 64bit
イメージファイル変換元(Xenハイパーバイザーサーバー)作業
1. XenハイパーバイザーサーバーでXen仮想マシンのxmlファイルを任意のディレクトリへダンプします。
virsh dumpxml VM名 > /tmp/VM名.xml
2. KVMハイパーバイザーでvirsh console出来るようにイメージファイルをコピーする前に設定を変更しておきます。
/etc/grub.conf
kernel /vmlinuz-2.6.18-238.el5xen ro root=/dev/VolGroup00/LogVol00 consoole=xvc0
↓
kernel /vmlinuz-2.6.18-238.el5xen ro root=/dev/VolGroup00/LogVol00 consoole=xvc0 console=ttyS0,115200n8
へ変更
/etc/inittabへ以下を追記
co:2345:respawn:/sbin/agetty ttyS0 115200 vt100-nav
/etc/securettyへ以下を追記
ttyS0
3. 1でダンプしたXen仮想マシンのxmlファイルとイメージファイルをKVMハイパーバイザーへコピーします。
※イメージファイルがスパースファイルの場合rsyncのオプションを付けておきます。
rsync -aS /tmp/xenimage kvm.example.com:/tmp/
4. 変換を行うXen仮想マシンの以下のパッケージのバージョンを確認してメモしておきます。
kernel ecryptfs-utils device-mapper device-mapper-event lvm2 selinux-policy-targeted selinux-policy
イメージファイル変換先(KVMハイパーバイザーサーバー)作業
0. virt-v2vをインストール
yum install virt-v2v.x86_64
1. ↑の手順で確認した変換を行うXen仮想マシンのパッケージのバージョンを元に
以下の設定ファイルを書き換えます。
/etc/virt-v2v.conf
確認したパッケージのバージョンと以下の箇所のバージョン番号を合わせて修正します。
※この例ではCentOS5.6の64bit版です。
<virt-v2v> <network type='bridge' name='xenbr0'> <network type='network' name='br0'/> </network> <capability os='linux' distro='centos' major='5' name='virtio'> <dep name='kernel' minversion='2.6.18-238.el5'/> <dep name='lvm2' minversion='lvm2-2.02.74-5.el5.el5'/> <dep name='selinux-policy-targeted' minversion='2.4.6-300.el5' ifinstalled='yes'/> </capability> <app os='linux' distro='centos' major='5' arch='x86_64' name='kernel'> <path>rhel/5/kernel-2.6.18-238.el5.x86_64.rpm</path> <dep>ecryptfs-utils</dep> </app> <app os='linux' distro='centos' major='5' arch='x86_64' name='ecryptfs-utils'> <path>rhel/5/ecryptfs-utils-75-5.el5.x86_64.rpm</path> </app> <app os='linux' distro='centos' major='5' arch='x86_64' name='lvm2'> <path>rhel/5/lvm2-2.02.74-5.el5.x86_64.rpm</path> <dep>device-mapper</dep> <dep>device-mapper-event</dep> </app> <app os='linux' distro='centos' major='5' arch='x86_64' name='device-mapper'> <path>rhel/5/device-mapper-1.02.55-2.el5.x86_64.rpm</path> </app> <app os='linux' distro='centos' major='5' arch='x86_64' name='device-mapper-event'> <path>rhel/5/device-mapper-event-1.02.55-2.el5.x86_64.rpm</path> </app> <app os='linux' distro='centos' major='5' name='selinux-policy-targeted'> <path>rhel/5/selinux-policy-targeted-2.4.6-300.el5.noarch.rpm</path> <dep>selinux-policy</dep> </app> <app os='linux' distro='centos' major='5' name='selinux-policy'> <path>rhel/5/selinux-policy-2.4.6-300.el5.noarch.rpm</path> </app> <!-- Default file locations --> <path-root>/var/lib/virt-v2v/software</path-root> <iso-path>/var/lib/virt-v2v/transfer.iso</iso-path> </virt-v2v>
2. 以下のディレクトリを作成します。
/var/lib/virt-v2v/software/rhel/ /var/lib/virt-v2v/software/rhel/5/
3. 確認したXen仮想マシンの同バージョンのパッケージを2で作成したディレクトリへ保存しておきます。
パッケージは
http://vault.centos.org/5.6/os/x86_64/CentOS/
などからwgetして保存します。
※カーネルに関してはXenカーネルではなく通常カーネルの同バージョンのもの。
cd /var/lib/virt-v2v/software/rhel/5/ wget http://vault.centos.org/5.6/os/x86_64/CentOS/kernel-2.6.18-238.el5.x86_64.rpm wget http://vault.centos.org/5.6/os/x86_64/CentOS/ecryptfs-utils-75-5.el5.x86_64.rpm wget http://vault.centos.org/5.6/os/x86_64/CentOS/device-mapper-1.02.55-2.el5.x86_64.rpm wget http://vault.centos.org/5.6/os/x86_64/CentOS/device-mapper-event-1.02.55-2.el5.x86_64.rpm wget http://vault.centos.org/5.6/os/x86_64/CentOS/lvm2-2.02.74-5.el5.x86_64.rpm wget http://vault.centos.org/5.6/os/x86_64/CentOS/selinux-policy-2.4.6-300.el5.noarch.rpm wget http://vault.centos.org/5.6/os/x86_64/CentOS/selinux-policy-targeted-2.4.6-300.el5.noarch.rpm
4. Xen→KVM変換後のイメージファイルの保存用にストレージプールを作成します。
このストレージプールに変換後のKVMイメージファイルが保存されます。
例) /dataディレクトリにストレージプールを作成する例です。
virsh pool-create-as ストレージのプール名 --print-xml dir null null null null /data > ストレージのプール名.xml virsh pool-create ストレージのプール名.xml
5. Xenハイパーバイザーからダンプした仮想マシンのxmlファイルを使ってイメージファイル変換を行います。
※ダンプしたxmlファイル中のイメージファイルを指定するパスはコピーしたファイルの保存ディレクトリに変更しておきます。
virt-v2v -i libvirtxml -op ストレージのプール名 -f /etc/virt-v2v.conf VM名.xml
変換中はおそらくプロンプトが返ってこず応答なしっぽく見えると思いますが、気長に待つとなんらかしらのメッセージが表示されます。
6. 起動前の設定変更 変換後のVM設定ファイルは
/etc/libvirt/qemu/VM名.xml
に保存されています。
変換後のイメージファイルはストレージプールのディレクトリに保存されています。
イメージ変換後は既にdefineされている状態になっています。
7. 起動
virsh start VM名 virsh console VM名
以上の手順で起動が可能なはずです。
イメージの変換前と変換後の仮想マシンの比較です。
Xenカーネルが通常カーネルへリプレイスされています。
Xen(変換前)
[root@centos56 ~]# uname -a Linux centos56 2.6.18-238.el5xen #1 SMP Thu Jan 13 16:41:45 EST 2011 x86_64 x86_64 x86_64 GNU/Linux [root@centos56 ~]#
[root@centos56 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 8.6G 1.3G 7.0G 16% / /dev/xvda1 99M 14M 80M 15% /boot tmpfs 256M 0 256M 0% /dev/shm [root@centos56 ~]#
[root@centos56 ~]# fdisk -l Disk /dev/xvda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/xvda1 * 1 13 104391 83 Linux /dev/xvda2 14 1305 10377990 8e Linux LVM [root@centos56 ~]#
KVM(変換後)
[root@centos56 ~]# uname -a Linux centos56 2.6.18-238.el5 #1 SMP Thu Jan 13 15:51:15 EST 2011 x86_64 x86_64 x86_64 GNU/Linux [root@centos56 ~]#
[root@centos56 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 8.6G 1.3G 6.9G 16% / /dev/vda1 99M 16M 79M 17% /boot tmpfs 249M 0 249M 0% /dev/shm [root@centos56 ~]#
[root@centos56 ~]# fdisk -l Disk /dev/vda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/vda1 * 1 13 104391 83 Linux /dev/vda2 14 1305 10377990 8e Linux LVM [root@centos56 ~]#
補足
Xen→KVM変換のvirt-v2vはバージョン
virt-v2v-0.6.2-4.el6
を利用しました。
変換サーバーはScientific Linux 6.1でもっとバージョンの高い
virt-v2v-0.7.1-3.el6
が利用出来たのですが、イメージを変換すると
Can't locate object method "can_handle" via package "Sys::VirtV2V::Converter::RedHat" at /usr/share/perl5/vendor_perl/Sys/VirtV2V/Converter.pm line 121.
こんなエラーが出てしまい(バグ?)、変換が出来なかったのでバージョンを落として実行しました。
virt-v2v-0.7.1-4.el6
このバージョンから修正されてるみたいです。
https://bugzilla.redhat.com/show_bug.cgi?id=678950
http://rhn.redhat.com/errata/RHBA-2011-0650.html
参考にさせて頂いたサイト