User Tools

Site Tools


computing:virtmanagerhell

This is an old revision of the document!



  • virtmanagerhell
  • Jonathan Haack
  • Haack's Networking
  • netcmnd@jonathanhaack.com

To make a VM from the command line, do the following. Note that this recipe assumes you have already created your virtual switch, br0. It also presumes you have already created your virtual disk, and if you have not, simply run sudo qemu-img create -f raw new.img 1000G.

sudo virt-install --name=new.img \
--os-type=Linux \
--os-variant=debian10 \
--vcpu=1 \
--ram=2048 \
--disk path=/mnt/vms/students/new.img \
--graphics spice \
--location=/mnt/vms/isos/debian-11.4.0-amd64-netinst.iso \
--network bridge:br0

To clone an existing image, do the following:

virt-clone \
--original=clean \
--name=sequoia \
--file=/mnt/vms/students/sequoia.img

If you have a legacy image that needs to be larger, then install a few tools and the proceed to expand the virtual hard disk as follows:

apt install qemu-img kpartx
qemu-img resize debian10.img +50G

After expanding the virtual hard disk, open gparted in X passthrough / command line and expand the existing partition into as much of the the new space as you prefer. And to rename a VM (domain), do the following:

virsh shutdown <old-name>
virsh domrename <old-name> <new-name>

To delete a domain, virt-manager uses the undefine command. To remove the accompanying storage with it, parse the command as follows:

virsh undefine guest1 --remove-all-storage

If you need to force stop a machine, virt-manager uses the destroy command, as follows:

virsh destroy guest1

I prefer the raw format (.img) but if I change my mind later, perhaps because I want snapshots, then I can easily shutdown the machine and convert the image as follows:

qemu-img convert -f raw -O qcow2 guest1.img guest1.qcow2

The rest from here on out is my attempt at resizing an .img using tools exclusively from virsh / virt-manager. These are highly risky moves and totally not needed for day to day operations. It was more of a mission I was on and based on a tutorial I used nearly 15 years ago when expanding a Windows VM I used for teaching software that was only on that VM. At any rate, I have only succeeded twice doing this, and often get confused looking at the l00ps. Proceed with caution!

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

oemb1905 2022/11/12 07:27

computing/virtmanagerhell.1668305399.txt.gz · Last modified: 2022/11/13 02:09 by oemb1905