A Faster Way to Create Virtual Machines with Cloud Images and virt-manager
I’ve written previously about Booting Cloud Images with QEMU. However, I’ve since graduated to a more convenient method of spawning virtual machines. This method is also much faster and is more cohesive with the rest of the virtualization stack that you’ll find on your Linux distribution. As someone who creates and tears down tons of virtual machines for testing things, this method appeals to me more than the previous. Let’s get into it.
Download a Cloud Image
Ideally, you’ll find a download link for a QCOW2 VM image. Otherwise, you’ll need to convert it with qemu-img convert
. As before, I will use a Fedora cloud image.
# mkdir /var/lib/libvirt/images/base
# cd /var/lib/libvirt/images/base
# curl -LkO https://download.fedoraproject.org/pub/fedora/linux/releases/34/Cloud/x86_64/images/Fedora-Cloud-Base-34-1.2.x86_64.qcow2
Generate a cloud-init bootstrap image
This can be a one-time thing, if you don’t mind each of your new VMs taking on these settings.
# mkdir cloud-init-bootstrap
# cd cloud-init-bootstrap
# touch meta-data
# cat > user-data <<EOF
#cloud-config
system_info:
default_user:
name: fedora
chpasswd:
list: |
fedora:password
expire: False
resize_rootfs: True
EOF
# genisoimage -output seedci.iso -volid cidata -joliet -rock user-data meta-data
Obviously, if this machine is going to be accessible via the Internet, you’ll want to follow some better security practices. For testing kernel changes, it’s probably fine.
Create a disk for the new VM
You can just use exactly what was downloaded, however, I like to create a new image which is based on the original download. That way I can create new VM disks without having to re-download or remember to copy and paste the original disks. It’s also convenient to make a larger disk than the base image, as cloud-init will take care of resizing the file system for you.
# qemu-img create -f qcow2 \
-b /var/lib/libvirt/images/base/Fedora-Cloud-Base-34-1.2.x86_64.qcow2 \
-F qcow2 \
/var/lib/libvirt/images/fedora-34.qcow2 15G
I tend to name the disk what I intend to name the virtual machine for identification purposes.
Create the new domain (VM)
virt-manager
comes with a helpful tool called virt-install
to provision a new virtual machine. Note that the shell prompt has switched from root to a user session.
$ virt-install --name fedora-34 --os-variant fedora --vcpus 2 --memory 2048 \
--graphics vnc --virt-type kvm --disk /var/lib/libvirt/images/fedora-34.qcow2 \
--cdrom /var/lib/libvirt/images/base/cloud-init-bootstrap/seedci.iso
Enjoy your new virtual machine
The VM may now be managed on the command line with virsh
or with the virt-manager
GUI. You could leave this one in its current state and simply clone new VMs from it whenever you’d like a brand-new one, or follow these same steps again for new VMs.