libvirt qemu VMs
4 min read
With a fresh desktop linux install, I wanted to avoid installing VirtualBox again and finally learn how to setup a KVM VM with tools such as
libvirt is a management tool that can be used to talk to hypervisors such as
qemu. This simplifies working with
qemu - the actual tool which does the hardware emulation.
Just like the GUI based VM creation process, we're going to go through many of the same steps here.
- Create a Disk
- Create a Network Interface
- Start the VM
- Install the OS
So lets get started..
No matter which distro you're on, you'll want to install a few packages. On arch we're going to execute:
yay qemu libvirt virt-install
I believe the packages have the same name in the Debian / Ubuntu world, so just replace
sudo apt install.
- Create Disk
First we have to create a disk image for the OS to install into. The following command will create a qcow2 image of 15gb. QCOW2 is the default storage format for virtual disks in the qemu world and stands for "QEMU Copy-on-write". This second version added support for encryption and multiple snapshots. In short, qcow2 images are a representation of a fixed size block device in a file.
We're going to use the
qemu-img binary which ships with
qemu to generate this 15GB image at
/var/lib/libvirt/images/. Feel free to adjust the path, but this is the default storage location for
sudo qemu-img create -o preallocation=metadata -f qcow2 /var/lib/libvirt/images/test1.qcow2 15G
- Create Network Interface
The easiest setup to provide a network connection to a VM is via whats known as a network bridge aka a shared physical device. Here we're going to use
virsh, which ships with
libvirt, to create said bridge.
First, we'll need to create a bridge definition in
sudo vim /var/lib/libvirt/network/br10.xml
Then enter the following:
<port start='1024' end='65535'/>
<bridge name='br10' stp='on' delay='0'/>
<ip address='192.168.30.1' netmask='255.255.255.0'>
<range start='192.168.30.50' end='192.168.30.200'/>
Feel free to adjust the above ip ranges, bridge name, etc.
After you've saved the file, we'll go into
virsh and define the network.
Now if you check your available network interfaces (
ip link show), you should see
br10 listed among your physical interface, loopback, maybe wifi, etc.
- Start Installation
Finally, we can begin the installation with the disk and network interface we just created!
virt-install, you can actually automate the entire installation process if you wanted to so as to do a completely unattended install. However, we're going to do a bog standard install today with the following command:
sudo virt-install --virt-type kvm --name ubuntu2010 --ram 2048 \
--disk /var/lib/libvirt/images/test1.qcow2,format=qcow2 \
--network bridge=br10 \
--graphics vnc,listen=0.0.0.0 \
--os-type=linux --os-variant=ubuntu20.04 \
You'll see here we're defining a few things, the type of vm (
kvm), the name (
ubuntu2010), the amount of ram in mb (
2048), the disk image we created earlier as well as its format, the network bridge we just created, as well as a graphics settings (in this case, start vnc and listen on 0.0.0.0). Finally, we're telling it what type of OS we're install (
linux) and where to find the boot image.
There are many flags for
virt-install, so I won't go over all of them here, but you can view its man page either on your system if you have it installed, or online here
- Using your new VM
Finally, once the install is complete and you've shut it down for the first time, you're probably wondering how do I start the VM again?! Easy!
virsh start [vm name]
# connect to the console of the vm
virsh console [vm id]
# alternatively print VNC connection string
virsh domdisplay [vm name]
You can use
virt-viewer and directly connect via the qemu socket like so,
virt-viewer --connect qemu:///system 7
Most things can be done through the
virsh command. You can always check
virsh help if you forget a command or are looking for something new.
Oh and one last thing that confused me at first in
libvirt world - VMs are called 'domains' here.
Finally, if you really want a GUI to manage your VMs, you can always install
virtmanager, which is a VirtualBox-like GUI on top of