xen準仮想化イメージファイルをkvm 完全仮想化イメージファイルに変換するには?
法政大学理工学部創生科学科小林一行研究室では,今まで,CentOS5.6上でxenを使って動かしていたのですが,サーバの故障による更新に伴い,
この際,Scientific Linux 6.1に移行することにしました.
このドキュメントでは,http://fedorasrv.com/xen.shtmlに掲載されているxenで構築された仮想サーバのイメージファイルをkvmイメージファイルへ
変換できたのでその手順を公開します.
XEN server(CentOS5.6)
|
KVM server(Scientific Linux6.1)
|
xen client(CentOS5.6)→
|
kvm client(CentOS5.6)
|
xenとkvmサーバは両立しないようなので,ここでは,2台のサーバで行います.1台は,xen server,もう1台は,kvm server です.ちなみに,kvm serverは,xen serverと同じになるようにbridge設定にしておきます.
まず,xen client側の設定です.
[xen client:]yum install kernel grub
|
多分,インストールされるのはkernelだけだと思います.新規にkvm serverにインストールするものと使うためカーネルのバージョンを合わせる必要があります.
[xen client:]/etc/sysconfig/network-script/cfg-eth0
|
kvm clientのマックアドレスの設定と異なっていると,eth0の内容を書き換えてしまうため.HWADDRが定義してあればそれを消しておきます.
# Xen Virtual Ethernet DEVICE=eth0 BOOTPROTO=static BROADCAST=xxx.xxx.xxx.255 削除 HWADDR=00:16:3E:00:19:E9 IPADDR=xxx.xxx.xxx.xxx NETMASK=xxx.xxx.xxx.0 NETWORK=xxx.xxx.xxx.0 ONBOOT=yes
|
kvm server で受け皿となるイメージファイルを新規に作ります.
[kvm server:]ディスクの容量を考えイメージファイルの置く場所を設定し作成する.
[kvm server:]qemu-img create -f raw /var/lib/libvirt/images/hogehoge.img 10G
|
[kvm server:] 移行するkvm clientには,xen clientと同じバージョンのOSをインストールし,新たにブート可能なイメージを作ります.
xen clientイメージには,grubが入っていないため,ブートできません.そこで,容量が大きめのkvm clientイメージファイルを作ります.
[kvm server:]virt-install --connect qemu:///system \ --name hogehoge \ --ram=512 \ --hvm \ --location http://ftp.riken.jp/Linux/centos/5.6/os/i386/ \ --os-type=Linux \ --os-variant=virtio26 \ --file=/var/lib/libvirt/images/hogehoge.img \ --network bridge=br0 \ --accelerate \ --nographics \ --keymap ja \ --extra-args='console=tty0 console=ttyS0,115200n8'
|
仮のIPを指定または,DHCPでネットワークインストール.すぐにxen clientのイメージを上書きするので,設定はなんでも構いません.設定後,再帰動し,カーネルとgrubを最新版のみにします.
[kvm client] yum -y update [kvm client]# rpm -qa | grep kernel kernel-2.6.18-238.el5 kernel-2.6.18-238.19.1.el5 [kvm client]# rpm -e kernel-2.6.18-238.el5
|
終わったらシャットダウン
[kvm server:] /etc/libvirsh/qemu/hogehoge.xmlの
uuid macを [xen server:] の/etc/xen/hogehogeと同じものに変更する.
|
変更し,再登録するのだが,virsh undefineをすると,xmlファイルが消されてしまうため,
[kvm server:] cp hogehoge.xml hogehoge.xml.back
|
してバックアップをとっておいてから,
[kvm server:] virsh undefine hogehoge [kvm server:] mv hogehoge.xml.back hogehoge.xml [kvm server:] virsh define hogehoge.xml
|
として,再定義します.ちなみにvirsh edit hogehogeで直接uuidとmacをあわせても良いかもしれません.
[xen client:]転送する準備が終わったので,xen clientをシャットダウンします.
[xen server:] xm console hogehoge
|
rootで入り,シャットダウン
[xen client:] shutdown –h now
|
シャットダウンが終わったら,scpコマンドでファイルを転送します.kvm serverには,DNSのインストールなどしないと思うので,
ここで,kvmserverは,IPアドレスの方が確実かもしれません.
[xen server:]scp hogehoge.img hoge@kvmserver:/mnt/xen
|
間違えない様に拡張子を変更してhogehoge.imgと同じフォルダに移動します.
[kvm server:]mv hogehoge.img hogehoge.xen [kvm server:]mv *.xen /var/lib/libvirt/images/
|
[kvm server:]# losetup –a /dev/loop0: [fd00]:2885070 (/var/lib/libvirt/images/hogehoge.img)
|
もし,まだ,使用中であるならば解除しておきます.
[kvm server:] kpartx -d /dev/loop0 [kvm server:] losetup -d /dev/loop0 [kvm server:] losetup -a [kvm server:] losetup -f /dev/loop0
|
loop0だけであることを確認します.
では,これからイメージファイルのマウントをします.scpでコピーしてきたxenのイメージファイルからデバイスをとり出します.
[kvm server:] losetup /dev/loop0 hogehoge.xen [kvm server:] kpartx –a /dev/loop0 [kvm server:] ls /dev/mapper
|
でloop0p2があることを確認します.
同様に,
[kvm server:] losetup /dev/loop1 hogehoge.img [kvm server:] kpartx –a /dev/loop1 [kvm server:] dd if=/dev/mapper/loop0p2 of=/dev/mapper/loop1p2 bs=16384
|
で,ddコマンドでコピーします.容量が大きい場合結構時間がかかります.
終わったら
hogehoge.xenの方を切り離す.
[kvm server:] kpartx –d /dev/loop0 [kvm server:] losetup –d /dev/loop0
|
hogehoge.imgがつながっているかを確認する.
[kvm server:] losetup –a /dev/loop1: [fd00]:2884504 (/var/lib/libvirt/images/hogehoge.img)
|
イメージのままマウントしてlvmを認識し,fsckを行います.
[kvm server:] vgscan Reading all physical volumes. This may take a while... Found volume group "VolGroup00" using metadata type lvm2 Found volume group "vg_www" using metadata type lvm2 [kvm server:] lvscan inactive '/dev/VolGroup00/LogVol00' [5.59 GiB] inherit inactive '/dev/VolGroup00/LogVol01' [288.00 MiB] inherit ACTIVE '/dev/vg_www/lv_root' [50.00 GiB] inherit ACTIVE '/dev/vg_www/lv_home' [172.53 GiB] inherit ACTIVE '/dev/vg_www/lv_swap' [9.81 GiB] inherit [kvm server:] pvscan PV /dev/mapper/loop1p2 VG VolGroup00 lvm2 [5.88 GiB / 0 free] PV /dev/sda2 VG vg_www lvm2 [232.34 GiB / 0 free] Total: 2 [238.21 GiB] / in use: 2 [238.21 GiB] / in no VG: 0 [0 ] [kvm server:] vgchange -ay 2 logical volume(s) in volume group "VolGroup00" now active 3 logical volume(s) in volume group "vg_www" now active [kvm server:] lvscan ACTIVE '/dev/VolGroup00/LogVol00' [5.59 GiB] inherit ACTIVE '/dev/VolGroup00/LogVol01' [288.00 MiB] inherit ACTIVE '/dev/vg_www/lv_root' [50.00 GiB] inherit ACTIVE '/dev/vg_www/lv_home' [172.53 GiB] inherit ACTIVE '/dev/vg_www/lv_swap' [9.81 GiB] inherit [kvm server:] e2fsck -c -f /dev/VolGroup00/LogVol00 e2fsck 1.41.12 (17-May-2010) Adding dirhash hint to filesystem. Checking for bad blocks (read-only test): 58.97% done, 25:23 elapsed 59.06% done, 25:28 elapsed done /dev/VolGroup00/LogVol00: Updating bad block inode. Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/VolGroup00/LogVol00: ***** FILE SYSTEM WAS MODIFIED ***** /dev/VolGroup00/LogVol00: 459597/24521216 files (8.0% non-contiguous), 20049099/24641536 blocks
|
イメージファイルの切り離し作業
[kvm server:] vgchange -an 0 logical volume(s) in volume group "VolGroup00" now active Can't deactivate volume group "vg_www" with 3 open logical volume(s) [kvm server:] lvscan inactive '/dev/VolGroup00/LogVol00' [5.59 GiB] inherit inactive '/dev/VolGroup00/LogVol01' [288.00 MiB] inherit ACTIVE '/dev/vg_www/lv_root' [50.00 GiB] inherit ACTIVE '/dev/vg_www/lv_home' [172.53 GiB] inherit ACTIVE '/dev/vg_www/lv_swap' [9.81 GiB] inherit [kvm server:] kpartx -d /dev/loop1 [kvm server:] ls /dev/mapper/ control vg_www-lv_home vg_www-lv_root vg_www-lv_swap [kvm server:] losetup -d /dev/loop1 [kvm server:] losetup -f /dev/loop0
|
ここまでできれば,
[kvm server:] virsh start hogehoge
で起動できるはずです.
kvm clientの容量の拡大
[kvm server:]virsh start hogehoge
|
このままでは,容量は,xen clientのままになっているので,少し大きめにとった容量に合わせます.
まず,eth0がちゃんと認識しているかを確認する.
で,eth0が認識していないようなら,
[kvm client:] /etc/sysconfig/network-scripts
|
を見て,cfg-eth0を確認し,cfg-eth0.bakになっているようなら,cfg-eth0として保存し,再起動します.
ネットワークが問題ないようなら,再起動後,そのまま入り,lvmの拡大を行います.最初のスキャンでは,7.88Gで残りは,0であった
ものが,次のスキャンでは,9.88Gで残りが2Gあることがわかります.この2G分をlvresizeコマンドを使って拡張します.
login: root Password: Last login: Mon Sep 12 00:24:01 on ttyS0 [kvm client:] pvscan PV /dev/vda2VG VolGroup00lvm2 [7.88 GB / 0free] Total: 1 [7.88 GB] / in use: 1 [7.88 GB] / in no VG: 0 [0] [kvm client:] pvresize /dev/vda2 Physical volume "/dev/vda2" changed 1 physical volume(s) resized / 0 physical volume(s) not resized [kvm client:] pvscan PV /dev/vda2VG VolGroup00lvm2 [9.88 GB / 2.00 GB free] Total: 1 [9.88 GB] / in use: 1 [9.88 GB] / in no VG: 0 [0] [kvm client:]lvscan ACTIVE'/dev/VolGroup00/LogVol00' [7.34 GB] inherit ACTIVE'/dev/VolGroup00/LogVol01' [544.00 MB] inherit [kvm client:] lvdisplay /dev/VolGroup00/LogVol00 --- Logical volume --- LV Name/dev/VolGroup00/LogVol00 VG NameVolGroup00 LV UUIDxxxxx-xxxx-xxxx-xxxx-vDLV-Xi6p-cWZ9DD LV Write Accessread/write LV Statusavailable # open1 LV Size7.34 GB Current LE235 Segments1 Allocationinherit Read ahead sectorsauto - currently set to256 Block device252:0
[kvm client:]lvresize -L +2G /dev/VolGroup00/LogVol00 Extending logical volume LogVol00 to 9.34 GB Logical volume LogVol00 successfully resized [kvm client:] resize2fs /dev/VolGroup00/LogVol00 resize2fs 1.39 (29-May-2006) Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required Performing an on-line resize of /dev/VolGroup00/LogVol00 to 2449408 (4k) blocks. The filesystem on /dev/VolGroup00/LogVol00 is now 2449408 blocks long. [kvm client:]lvdisplay /dev/VolGroup00/LogVol00 | grep "LV Size" LV Size9.34 GB [kvm client:] df -h FilesystemSizeUsed Avail Use% Mounted on /dev/mapper/VolGroup00-LogVol00 9.1G2.4G6.3G28% / /dev/vda199M13M82M13% /boot tmpfs252M0252M0% /dev/shm [kvm client:] reboot
|