Problem
You have Xen VM guest with LVs created on the Xen host, your Xen VM guest (from now on named ‘foo’) has 3 partitions, but your mount point /root on /dev/xvda2 (could be /home, or whatever) is running low on space, so you need to grow the disk, but you notice that the swap /dev/xvda3 is in the way, this is how to do it, which in a nutshell, involves deleting partitions xvda2 and 3, recreating them one at a time, growing the file system into the new space and then checking it all.
I basing this on a VM that has a 8.3GB virtual disk, we are going to increase by 4GB thus giving it 12.3GB, and then use the extra (4GB) space for /root (xvda2)
Original VM disk size – the Start/End/blocks etc are just a guide, I can’t remember the original values
Device Boot Start End Blocks Id System
/dev/xvda1 * 1 16 128488+ 83 Linux (128MB)
/dev/xvda2 17 783 10000000 83 Linux (8GB)
/dev/xvda3 784 1306 2088450 82 Linux swap / Solaris (256MB)
And we want to grow xvda2 from 8GB to 12GB, so it will look like this:
Device Boot Start End Blocks Id System
/dev/xvda1 * 1 16 128488+ 83 Linux (128MB)
/dev/xvda2 17 1306 10361925 83 Linux (12GB)
/dev/xvda3 1307 1566 2088450 82 Linux swap / Solaris (256MB)
Make a note of the Start/End values for the original as you will need this later.
1. Check what we already have for our VM
fdisk -l
Disk /dev/xvda: 12.8 GB, 12884901888 bytes
255 heads, 63 sectors/track, 1566 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/xvda1 * 1 16 128488+ 83 Linux
/dev/xvda2 17 1306 10361925 83 Linux
/dev/xvda3 1307 1566 2088450 82 Linux swap / Solaris
2. Check current disk space for VM on the host
lvscan
ACTIVE ‘/dev/xen_vg/foo.lv’ [8.00 GB] inherit
3. Check to see if we have enough spare disk space on the host which we can take
vgdisplay
— Volume group —
VG Name xen_vg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 163
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 12
Open LV 4
Max PV 0
Cur PV 1
Act PV 1
VG Size 240.00 GB
PE Size 4.00 MB
Total PE 61439
Alloc PE / Size 43264 / 169.00 GB
Free PE / Size 18175 / 71.00 GB <===== some free space
VG UUID s8cAAA-GMzz-AUXS-w7ie-E123-J333-uh4dd3
As you can see we have 71GB free, so we are good there.
4. Okay lets start
Power down Xen VM
shutdown now -h
Take snapshot, if you have a means to do this, or back up, up to you, but you could lose everything.
5. First thing, login to your Xen host, then extend the size of the logical partition (foo.lv)
lvextend -L +4G /dev/xen_vg/foo.lv
Now do a lvscan, you should notice that the original 8GB has now been increased to 12GB
lvscan
ACTIVE ‘/dev/xen_vg/foo.lv’ [12.00 GB] inherit
So our VM now has available a new virtual disk that is 12.3GB in size…which is nice.
6. Now we use fdisk to delete the partitions
fdisk /dev/xen_vg/foo.lv
Command (m for help): d
Partition number (1-4): 2
Repeat for partition 3.
7. Now we use fdisk to add the partitions, but you need to change the default value for the last cylinder, so enter +4000M, this will use the extra 4GB we made available.
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (17-763, default 17):
Using default value 14
Last cylinder or +size or +sizeM or +sizeK (14-2480, default 2480):+4000M
Using value 4000M
Repeat for partition 3 – you can accept the default this time as should go to the end of the disk
Save it
Command (m for help): w
The partition table has been altered!
Now, remember, partition 3 is swap, so we have to give it the correct hex ID for swap
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap)
Save it
Command (m for help): w
The partition table has been altered!
8. We use kpartx to create 3 temporary device maps in /dev/mapper, named foo.lv1, foo.lv2 and foo.lv3, one for each partition, this enables us to modify/check each partition, and once completed we delete them.
kpartx -av /dev/xen_vg/foo.lv
9. Now we need to run fsck on the 2 partitions before we extend the file system
e2fsck -f /dev/mapper/foo.lv2
and
e2fsck -f /dev/mapper/foo.lv3
10. Time to extend the file system:
resize2fs /dev/mapper/foo.lv2
and
resize2fs /dev/mapper/foo.lv3
11. Delete the temprorary device maps:
kpartx -d /dev/xen_vg/foo.lv
12. Your done, now start up you Xen VM
xm create foo -c
13. Take a look at the space
fdisk -l
Device Boot Start End Blocks Id System
/dev/xvda1 * 1 16 128488+ 83 Linux (128MB)
/dev/xvda2 17 1306 10361925 83 Linux (12GB)
/dev/xvda3 1307 1566 2088450 82 Linux swap / Solaris (256MB)