How to resize a VM and its partitions?
In this post I am going to list the steps to resize a Virtual Machine image created using virt-install
There are three steps:
- Resize the VM image
- Resize the LVM volume inside the VM ( both physical volume and logical volume )
- Resize the filesystem on the LVM volume
First locate where the image for your VM is stored.
# virsh dumpxml vm2 | xpath /domain/devices/disk/source Found 1 nodes: -- NODE -- <source file="/export/vmimgs/vm2.img" />
Mine is stored at /export/vmimgs/vm2.img
It is 5GB VM which I want to resize to 10GB. And then, I basically want more space for root partition ( mount point / ).
Step 1: Resize the VM image
Shutdown the VM and take a backup;
# virsh shutdown vm2 # cd /export/vmimgs # cp vm2.img vm2.img.backup
First lets find the disk devices within our VM:
# virt-filesystems --long -h -a /export/vmimgs/vm2.img Name Type VFS Label Size /dev/sda1 filesystem ext4 - 500M /dev/VolGroup/lv_root filesystem ext4 - 1.5G # virt-filesystems --long --parts --blkdevs -h -a /export/vmimgs/vm2.img Name Type MBR Size Parent /dev/sda1 partition 83 500M /dev/sda /dev/sda2 partition 8e 1.5G /dev/sda /dev/sda device - 5G -
Now we resize our VM image ( +5GB ):
# cd /export/vmimgs # truncate -r vm2.img vm2.img.new # truncate -s +5G vm2.img.new # virt-resize --expand /dev/sda2 vm2.img vm2.img.new Examining vm2.img ... ********** Summary of changes: /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be resized from 4.5G to 9.5G. The LVM PV on /dev/sda2 will be expanded using the 'pvresize' method. ********** Setting up initial partition table on vm2.img.new ... Copying /dev/sda1 ... 100% ⟦▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓⟧ 00:00 Copying /dev/sda2 ... 100% ⟦▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓⟧ 00:00 100% ⟦▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓⟧ --:-- Expanding /dev/sda2 using the 'pvresize' method ... Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.
Did you notice that /dev/sda2 was resized using ‘pvresize’. Thats because
its a LVM physical volume.
Now we move the new image vm2.img.new to the actuall image, taking backup for safety:
# chmod +x vm2.img.new # mv vm2.img vm2.img.original # mv vm2.img.new vm2.img
Step 2: Resize the LVM volume inside the VM – logical volume
Login into guest and resize the logical volume:
[root@localhost ~]# lvresize -L +5G /dev/VolGroup/lv_root
Step 3: Resize the filesystem on the LVM volume.
Resize the ext4 partition:
[root@localhost ~]# resize2fs /dev/VolGroup/lv_root resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/VolGroup/lv_root is mounted on /; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/VolGroup/lv_root to 1708032 (4k) blocks. The filesystem on /dev/VolGroup/lv_root is now 1708032 blocks long. [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 6.5G 1.4G 4.8G 23% / tmpfs 1004M 0 1004M 0% /dev/shm /dev/vda1 485M 31M 429M 7% /boot
Thats it. I hope that helps.
References:
http://libguestfs.org/virt-resize.1.html
http://virt-tools.org/learning/install-with-command-line/
http://docs.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization/sect-Virtualization-Virtualized_guest_installation_overview-Creating_guests_with_virt_install.html
rich 5:59 pm on November 29, 2011 Permalink |
Rather than using the separate lvresize step, you can add this option to virt-resize:
--lv-expand /dev/VolGroup/lv_root
. This option requires virt-resize > 1.2 IIRC.rich 6:00 pm on November 29, 2011 Permalink |
.. which resizes the filesystem in the LV too.
tuxdna 6:50 pm on November 29, 2011 Permalink
@rich: Thanks for the tip 🙂
Cletus 6:10 pm on April 5, 2012 Permalink |
I have a question if I may: When I use the virt-filesystems command I get /dev/VolGroup00/LogVol00 instead of /dev/VolGroup/lv_root. When I get to the section on using lvresize I put what virt-filesystems coughed up in the command line. (#lvresize -L +10G /dev/VolGroup00/LogVol00) and I get “VolGroup00 not found”. I then figure I should try the syntax as you have it written. I get a similar error message. What am I doing wrong? Thanks. 🙂
rich 6:22 pm on April 5, 2012 Permalink |
virt-filesystems will print out different things depending on what’s in the guest / disk image. On RHEL 5, the root LV used to be called /dev/VolGroup00/LogVol00, so if the guest is RHEL 5, this is normal.
The question is, are you running lvresize inside the guest or somewhere else (eg on the host — a bad idea).
In any case, see my comment above. Don’t use lvresize at all. Use the
virt-resize --lv-expand option
.