『virt-v2v』を利用したXen→KVM変換手順

『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変換のおおまかな流れは、

  1. XenハイパーバイザーサーバーでXen仮想マシンのxmlファイルをダンプ
  2. Xen仮想マシンxmlファイルとイメージファイルをKVMハイパーバイザーサーバーへコピー
  3. KVMハイパーバイザーサーバーでvirt-v2vで変換
  4. 起動

こんな感じでした。

サーバー構成

以下の環境で確認を行いました。

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



参考にさせて頂いたサイト