Virtualization With KVM On Ubuntu 11.10 - Page 3

6 Creating An LVM-Based VM

LVM-based VMs have some advantages over image-based VMs. They are not as heavy on hard disk IO, and they are easier to back up (using LVM snapshots).

To use LVM-based VMs, 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...


[email protected]:~# 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.27 GiB
  PE Size               4.00 MiB
  Total PE              119109
  Alloc PE / Size       24079 / 94.06 GiB
  Free  PE / Size       95030 / 371.21 GiB
  VG UUID               NQOLhN-wBWi-pUdD-el7p-TADJ-fJGd-3ALJbf

[email protected]:~#

... that contains the logical volumes /dev/vg0/root with a size of approx. 100GB and /dev/vg0/swap_1 with a size of 1GB - the rest is not allocated and can be used for VMs:


[email protected]:~# lvdisplay
  --- Logical volume ---
  LV Name                /dev/vg0/root
  VG Name                vg0
  LV UUID                KHbV2K-QKet-b660-aerE-x03F-nGVB-iR028M
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                93.13 GiB
  Current LE             23841
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

  --- Logical volume ---
  LV Name                /dev/vg0/swap_1
  VG Name                vg0
  LV UUID                NfmS1J-nVcl-l0W0-vBVG-2sDO-Rwwc-bnl9Yo
  LV Write Access        read/write
  LV Status              available
  # open                 2
  LV Size                952.00 MiB
  Current LE             238
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1

[email protected]:~#

I will now create the virtual machine vm5 as an LVM-based VM. We can use the vmbuilder command again. vmbuilder knows the --raw option which allows to write the VM to a block device (e.g. /dev/vg0/vm5) - I've tried this, and it gave back no errors, however, I was not able to boot the VM (start vm5 didn't show any errors either, but I've never been able to access the VM). Therefore, I will create vm5 as an image-based VM first and then convert it into an LVM-based VM.

mkdir -p /var/lib/libvirt/images/vm5/mytemplates/libvirt
cp /etc/vmbuilder/libvirt/* /var/lib/libvirt/images/vm5/mytemplates/libvirt/

Make sure that you create all partitions in just one image file, so don't use --- in the vmbuilder.partition file:

vi /var/lib/libvirt/images/vm5/vmbuilder.partition

root 8000
swap 2000
/var 10000

vi /var/lib/libvirt/images/vm5/

# This script will run the first time the virtual machine boots
# It is ran as root.

# Expire the user account
passwd -e administrator

# Install openssh-server
apt-get update
apt-get install -qqy --force-yes openssh-server

cd /var/lib/libvirt/images/vm5/
vmbuilder kvm ubuntu --suite=oneiric --flavour=virtual --arch=amd64 --mirror= -o --libvirt=qemu:///system --ip= --gw= --part=vmbuilder.partition --templates=mytemplates --user=administrator --name=Administrator --pass=howtoforge --addpkg=vim-nox --addpkg=unattended-upgrades --addpkg=acpid --firstboot=/var/lib/libvirt/images/vm5/ --mem=256 --hostname=vm5 --bridge=br0

As you see from the vmbuilder.partition file, the VM will use a max. of 20GB, so we create a logical volume called /dev/vg0/vm5 with a size of 20GB now:

lvcreate -L20G -n vm5 vg0

Don't create a file system in the new logical volume!

We will use the qemu-img command to convert the image to an LVM-based VM.

Now we go to the VM's ubuntu-kvm/ directory...

cd /var/lib/libvirt/images/vm5/ubuntu-kvm/

... and find out how our image is named:

ls -l

[email protected]:/var/lib/libvirt/images/vm5/ubuntu-kvm# ls -l
total 622732
-rw-r--r-- 1 root root 637796352 2011-11-16 12:49 tmpN27tbO.qcow2
[email protected]:/var/lib/libvirt/images/vm5/ubuntu-kvm#

Now that we know the name of our image (tmpN27tbO.qcow2), we can convert it as follows:

qemu-img convert tmpN27tbO.qcow2 -O raw /dev/vg0/vm5

Afterwards you can delete the disk image:

rm -f tmpN27tbO.qcow2

Now we must modify the VM's configuration...

virsh edit vm5

... and change the following section...

    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/vm5/ubuntu-kvm/tmpN27tbO.qcow2'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' unit='0'/>

... so that it looks as follows:

    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/dev/vg0/vm5'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' unit='0'/>

You can now use virsh to manage the VM:

virsh --connect qemu:///system

Because we have modified the VM's XML file, we must run the define command first...

define /etc/libvirt/qemu/vm5.xml

... before we start the VM:

start vm5


Falko Timme

About Falko Timme

Falko Timme is an experienced Linux administrator and founder of Timme Hosting, a leading nginx business hosting company in Germany. He is one of the most active authors on HowtoForge since 2005 and one of the core developers of ISPConfig since 2000. He has also contributed to the O'Reilly book "Linux System Administration".

Share this page:

Suggested articles

1 Comment(s)

Add comment


By: Anonymous

you can directly configure a lvm in the virt-manager so virsh should work

first lvcreate the lvm you wish to use .. do no formating just create

on page 4 virt-manager select select managed or other existing storage

click on browse local

click on file_system

click on /dev

click on your volum_group

click on your lvm you created

 virt-manager takes care of the rest

 if you wish to re-create it for some reason you'll need to 

dd if=/dev/zero of=/dev/lvgroup/lvpart bs=SIZEG