HOWTO: Expand a Xen virtual disk using LVM
So you have a Citrix Xen VM with a Linux filesystem partitioned using LVM and need to expand the size of the root partition? – This is a quick how to that is fairly well tested.
Firstly, I recommend that you backup your data!
In this example, we’ll be adding another 5G to a current 6G logical partition, giving us 11G in total. In this example, our set ups include an extra 2G logical partition so the disk size in total will be 13G.
1 ) Shut down the VM
2 ) Identify the VM and the disk VDI
xenhost# xe vm-disk-list vm="vmhost"
Disk 0 VBD:
uuid ( RO) : 941baebf-ca8d-0626-f088-30d314433287
vm-name-label ( RO): vmhost
userdevice ( RW): 0
Disk 0 VDI:
uuid ( RO) : 03218b6d-dbb1-4181-aa67-5273938af532
name-label ( RW): 0
sr-name-label ( RO): TEMPORARY
virtual-size ( RO): 8589934592
Now resize the VDI from the Xen Center command line:
xenhost# xe vdi-resize uuid=03218b6d-dbb1-4181-aa67-5273938af532 disk-size=13GiB
3 ) Start the VM, login and become root
4 ) Run fdisk and re-create the partition
You will need to identify the root LVM partition in fdisk, remove it, and create it using the largest block size available.
In this example, our LVM partition is the second one (xvda2) – so we select d to delete, 2 to specify the partition, then n to create a new second partition using up to the last cylinder.
vmhost# fdisk /dev/xvda
The number of cylinders for this disk is set to 1697.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): p
Disk /dev/xvda: 13.9 GB, 13958643712 bytes
255 heads, 63 sectors/track, 1697 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 1044 8281507+ 8e Linux LVM
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (14-1697, default 14):
Using default value 14
Last cylinder or +size or +sizeM or +sizeK (14-1697, default 1697):
Using default value 1697
Command (m for help): wq
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
vmhost#
This WARNING error can safely be ignored.
5 ) Reboot the VM
6 ) Resize the LVM physical volume
You can use pvdisplay to see the current size of the volume:
vmhost# pvdisplay
--- Physical volume ---
PV Name /dev/xvda2
VG Name VolGroup00
PV Size 7.90 GB / not usable 23.41 MB
...snip...
Now run pvresize to grow the physical volume to cover the whole partition…
vmhost# pvresize /dev/xvda2
Now re-run pvdisplay and you should see a bigger volume
vmhost# pvdisplay
--- Physical volume ---
PV Name /dev/xvda2
VG Name VolGroup00
PV Size 12.90 GB / not usable 25.51 MB
...snip...
7 ) Resize the LVM logical volume
vmhost# lvresize /dev/VolGroup00/LogVol00 -L +5G
Extending logical volume LogVol00 to 10.94 GB
Logical volume LogVol00 successfully resized
8 ) Grow the file system
This example assumes you are running an ext3 filesystem, other filesystem types may vary – run resize2fs over the volume.
vmhost# 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 2867200 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 2867200 blocks long.
Tada!
And that’s it, you should now see an extra 5G available in your root partition
vmhost# df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
<strong>11G</strong> 3.8G 6.3G 38% /