User Tools

Site Tools


  • virtmanagerhell
  • Jonathan Haack
  • Haack's Networking

These are two different attempts (both with 1 success each) of resizing .img files from the command line. Resize an .img with virt-manager, for example, expanding a 64GB disk to a 124GB disk. Start by installing the optional tools for this:

sudo apt install libguestfs-tools

After that, confirm the location of your virtual machine. You need to know the actual name of the .img file for this to work. Usually (unless it was changed by someone), this is the name that appears in the virt-manager window.

virsh dumpxml putnameofimagehere | xpath -e /domain/devices/disk/source

Navigate to the directory it spit out, and back up the image and rename it before you proceed:

cd /var/lib/libvirt/images/
sudo cp /var/lib/libvirt/images/putnameofimagehere.img /var/lib/libvirt/images/putnameofimagehere.img.bak

Once you know the name of the .img file and the location of it, prepare the virtual file systems for expansion:

virt-filesystems --long --parts --blkdevs -h -a /var/lib/libvirt/images/putnameofimagehere.img

Build a new, larger, container for the final disk, and set it aside for the merge/expansion that the tools are going to provide:

truncate -s 128G /var/lib/libvirt/images/outdisk

Now it is time to resize the existing image, using the container you just created:

virt-resize --expand /dev/sda2 /var/lib/libvirt/images/putnameofimagehere.img /var/lib/libvirt/images/outdisk

Okay, now we need to rename the new image we created to the name that virt-manager is looking for, i.e., the name of the original image. Remember, you should have the .bak file you made earlier in case this does not work. This is done as follows:

cp /var/lib/libvirt/images/putnameofimagerhere.img /var/lib/libvirt/images/putnameofimagerhere.img.old
mv /var/lib/libvirt/images/outdisk /var/lib/libvirt/images/putnameofimagehere.img

Made yet another attempt to do by command line in 2022. Install packages required for resizing virtual hard disks and for listing partitions inside virtual hard disks.

apt install qemu-img kpartx

Add 50G of size to the emulated physical hard disk. This is not to be confused with adding space to, or extending, the partition inside it.

qemu-img resize debian10.img +50G

Mount the image file in the present directory, and show all of its mappings.

kpartx -v -a debian10.img

Now, it is time to extend the partition. Your loops might have different #s after, use tab to find the right one (prolly largest #).

parted /dev/loopXX print

You will get output like this:

Model: Unknown (unknown)
Disk /dev/loopXX: 142GB
Sector size (logical/physical): 512B/512B
Partition Table: loop
Disk Flags: 
Number  Start  End    Size   File system  Flags
 1      0.00B  142GB  142GB  ext4

Remove the appropriate mapping. In my case, I am extending the boot volume of a virtual machine, so it was entry 1.

parted /dev/loopXX rm 1

Extend the partition from the start of the mapping you removed to the upper size limit listed in Disk.

parted /dev/loopXX mkpart primary ext4 0.00B 142GB

Verify the new mapping.

parted /dev/loopXX print

Run fsck before resizing the file system. You here appending “p1” to the name in order to make a new partition or mapping.

e2fsck -f /dev/mapper/loopXXp1

Extend the file system inside the partition to the entirety of the partition table.

resize2fs /dev/mapper/loopXXp1 

Unmount the image

kpartx -d debian10.img

After messing around with this, and succeeding 1 time in resizing the drive this way, I decided that just issuing apt install qemu-img kpartx and then expanding within the VM's gparted GUI was far easier. It does require moving and/or deprecating swap (or other earlier partitions) or you cannot merge the file system. Also, check /etc/fstab and make sure that entries reflect changes.

oemb1905 2022/08/08 00:37

computing/virtmanagerhell.txt · Last modified: 2022/08/08 14:15 by oemb1905