Cheap VPS & Xen Server


Residential Proxy Network - Hourly & Monthly Packages

Xen: How to Convert An Image-Based Guest To An LVM-Based Guest


This short article explains how you can move/convert a Xen guest that uses disk images to LVM volumes. Virtual machines that use disk images are very slow and heavy on disk IO, therefore it’s often better to use LVM. Also, LVM-based guests are easier to back up (using LVM snapshots).

I do not issue any guarantee that this will work for you!

 

1 Preliminary Note

To use LVM-based guests, you need a volume group that has some free space that is not allocated to any logical volume. In this example, I use the volume group /dev/vg0 with a size of approx. 465GB…

vgdisplay

server1:~# vgdisplay
— Volume group —
VG Name               vg0
System ID
Format                lvm2
Metadata Areas        1
Metadata Sequence No  3
VG Access             read/write
VG Status             resizable
MAX LV                0
Cur LV                2
Open LV               2
Max PV                0
Cur PV                1
Act PV                1
VG Size               465.28 GB
PE Size               4.00 MB
Total PE              119112
Alloc PE / Size       59842 / 233.76 GB
Free  PE / Size       59270 / 231.52 GB
VG UUID               gnUCYV-mYXj-qxpM-PEat-tdXS-wumf-6FK3rA

server1:~#

… that contains the logical volume /dev/vg0/root with a size of approx. 232GB and the logical volume /dev/vg0/swap_1 (about 1GB) – the rest is not allocated and can be used for Xen guests:

lvdisplay

server1:~# lvdisplay
— Logical volume —
LV Name                /dev/vg0/root
VG Name                vg0
LV UUID                kMYrHg-d0ox-yc6y-1eNR-lB2R-yMIn-WFgzSZ
LV Write Access        read/write
LV Status              available
# open                 1
LV Size                232.83 GB
Current LE             59604
Segments               1
Allocation             inherit
Read ahead sectors     auto
– currently set to     256
Block device           254:0

— Logical volume —
LV Name                /dev/vg0/swap_1
VG Name                vg0
LV UUID                SUI0uq-iTsy-7EnZ-INNz-gjvu-tqLD-rGSegE
LV Write Access        read/write
LV Status              available
# open                 2
LV Size                952.00 MB
Current LE             238
Segments               1
Allocation             inherit
Read ahead sectors     auto
– currently set to     256
Block device           254:1

server1:~#

I have an image-based Xen guest called xen1.example.com that I created using the following command:

xen-create-image –hostname=xen1.example.com –size=4Gb –swap=256Mb –ip=192.168.0.101 –memory=128Mb –arch=amd64 –role=udev

This is its Xen configuration file:

vi /etc/xen/xen1.example.com.cfg

#
# Configuration file for the Xen instance xen1.example.com, created
# by xen-tools 3.9 on Mon Mar  9 19:22:40 2009.
#

#
#  Kernel + memory size
#
kernel      = '/boot/vmlinuz-2.6.26-1-xen-amd64'
ramdisk     = '/boot/initrd.img-2.6.26-1-xen-amd64'
memory      = '128'

#
#  Disk device(s).
#
root        = '/dev/xvda2 ro'
disk        = [
                  'file:/home/xen/domains/xen1.example.com/swap.img,xvda1,w',
                  'file:/home/xen/domains/xen1.example.com/disk.img,xvda2,w',
              ]


#
#  Hostname
#
name        = 'xen1.example.com'

#
#  Networking
#
vif         = [ 'ip=192.168.0.101,mac=00:16:3E:F2:DC:FA' ]

#
#  Behaviour
#
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

As you see, the guest is using two disk images, /home/xen/domains/xen1.example.com/disk.img (4GB) and /home/xen/domains/xen1.example.com/swap.img (256MB).

We need the exact image sizes so that we can create logical volumes of the same size. If you don’t remember the exact disk and swap sizes anymore, you can go to the directory where the images are stored…

cd /home/xen/domains/xen1.example.com

… and run the following command – it will show the image sizes in human-readable format:

ls -lh

 

2 Converting The Images To LVM

Before we convert the images, we must shut down the guest:

xm shutdown xen1.example.com

Then we create logical volumes of the same size as the disk images, e.g. as follows:

lvcreate -L4G -n xen1_root vg0
lvcreate -L256M -n xen1_swap vg0

This creates the logical volumes /dev/vg0/xen1_root (4GB) and /dev/vg0/xen1_swap (256MB):

lvdisplay

server1:~# lvdisplay
— Logical volume —
LV Name                /dev/vg0/root
VG Name                vg0
LV UUID                kMYrHg-d0ox-yc6y-1eNR-lB2R-yMIn-WFgzSZ
LV Write Access        read/write
LV Status              available
# open                 1
LV Size                232.83 GB
Current LE             59604
Segments               1
Allocation             inherit
Read ahead sectors     auto
– currently set to     256
Block device           254:0

— Logical volume —
LV Name                /dev/vg0/swap_1
VG Name                vg0
LV UUID                SUI0uq-iTsy-7EnZ-INNz-gjvu-tqLD-rGSegE
LV Write Access        read/write
LV Status              available
# open                 1
LV Size                952.00 MB
Current LE             238
Segments               1
Allocation             inherit
Read ahead sectors     auto
– currently set to     256
Block device           254:1

— Logical volume —
LV Name                /dev/vg0/xen1_root
VG Name                vg0
LV UUID                MQzhrS-OpOt-2IbY-BozD-l5vN-3doB-GRtyMc
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                4.00 GB
Current LE             1024
Segments               1
Allocation             inherit
Read ahead sectors     auto
– currently set to     256
Block device           254:2

— Logical volume —
LV Name                /dev/vg0/xen1_swap
VG Name                vg0
LV UUID                GHwsIT-a0sj-M72J-OVof-Ydju-Sexf-Ex824b
LV Write Access        read/write
LV Status              available
# open                 0
LV Size                256.00 MB
Current LE             64
Segments               1
Allocation             inherit
Read ahead sectors     auto
– currently set to     256
Block device           254:3

server1:~#

Now we can convert the images as follows:

dd if=/home/xen/domains/xen1.example.com/disk.img of=/dev/vg0/xen1_root
dd if=/home/xen/domains/xen1.example.com/swap.img of=/dev/vg0/xen1_swap

(This can take a lot of time, depending on how big the images are.)

Afterwards, we must open /etc/xen/xen1.example.com.cfg

vi /etc/xen/xen1.example.com.cfg

… and change…

[...]
disk        = [
                  'file:/home/xen/domains/xen1.example.com/swap.img,xvda1,w',
                  'file:/home/xen/domains/xen1.example.com/disk.img,xvda2,w',
              ]
[...]

… to …

[...]
disk        = [
                  'phy:/dev/vg0/xen1_swap,xvda1,w',
                  'phy:/dev/vg0/xen1_root,xvda2,w',
              ]
[...]

You can now start the guest again:

xm create /etc/xen/xen1.example.com.cfg

If everything goes well, you can delete the disk images:

rm -f /home/xen/domains/xen1.example.com/disk.img
rm -f /home/xen/domains/xen1.example.com/swap.img

 

  • Xen: http://www.xen.org/

Comments

comments