© 法政大学 理工学部 創生科学科 小林一行実験室

 

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がちゃんと認識しているかを確認する.

[kvm client:] ifconfig

で,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