richard· 27 Aug, 2021 · 5 min read
Virtualisation is an incredibly useful tool, even for personal use. Personally, I use virtual machines for different purposes: testing out operating systems or Linux distributions without having to install them to bare metal; install my own software to test compatibility; try out the latest hyped about desktop environment or window manager. And as time goes on, I find more things to add to the list of uses.
Whilst typing this up, I read about how I can use a virtual Debian install to install (not live load) a Debian distribution onto a USB drive. So I can carry around an operating system with persistent storage, and plug it into any PC.
Note: This article will be focussing on how to run virtual machines on Arch Linux.
Kernel-based Virtual Machine (KVM), is a hypervisor - an emulator or sorts - that comes baked into the Linux kernel. So if you run Linux, you will have this module included. And what this means to you the user is that you can quickly setup up your system for managing VMs.
But even if KVM is included in the Linux kernel installed on your computer, you first need to check whether your CPU has virtualisation support.
$ LC_ALL=C lscpu | grep Virtualization
Depending on which team you opted to support, the output will vary, but either output will confirm you support KVM.
With the confirmation that virtualisation is supported, you will probably want to install some packages to make installing and managing VMs a lot more user friendly.
$ sudo pacman -S qemu libvirt iptables-nft dnsmasq virt-manager
All the below installations in one.
QEMU is an emulator and virtualiser that can use KVM for virtualisation, by using Hardware-assisted virtualisation with your CPU. But with the
qemu package alone, you will not be able to use a GUI to manage your VMs, or make their sessions have persistent settings. Meaning that to make things run, you will need to use the command-line every time.
$ sudo pacman -S qemu
To overcome these hurdles, it is recommended to install
libvirt, a meta-package that contains the tools for managing your VMs in a convenient way. To do this package justice in knowing what it provides, I'd recommend viewing it's Arch Wiki page.
$ sudo pacman -S libvirt
Next you will need to enable and start the libvirt daemon. This will create some necessary symlinks and also enable the
$ sudo systemctl enable libvirtd Created symlink /etc/systemd/system/multi-user.target.wants/libvirtd.service → /usr/lib/systemd/system/libvirtd.service. Created symlink /etc/systemd/system/sockets.target.wants/virtlockd.socket → /usr/lib/systemd/system/virtlockd.socket. Created symlink /etc/systemd/system/sockets.target.wants/virtlogd.socket → /usr/lib/systemd/system/virtlogd.socket. Created symlink /etc/systemd/system/sockets.target.wants/libvirtd.socket → /usr/lib/systemd/system/libvirtd.socket. Created symlink /etc/systemd/system/sockets.target.wants/libvirtd-ro.socket → /usr/lib/systemd/system/libvirtd-ro.socket.
Then just start the service.
$ sudo systemctl start libvirtd
To allow non-sudo user access to the newly enabled libvirt daemon, you should now add the necessary users to the
libvirt user group.
$ sudo usermod -aG libvirt richard
You'll probably want to add internet connectivity to your future VM instances. Allowing you to browse the web or download and install software on another operating system.
Typically for personal use, you would want to create a virtual network that uses on the host system's network connectivity. This means installing two more packages.
iptables-nft to replace
iptables - that comes with a base install of Arch Linux - and
dnsmasq, a DNS forwarder and DHCP server.
$ sudo pacman -S iptables-nft dnsmasq
The GUI client I'd recommend using to manage your VMs is Virtual Machine Manager, or simply virt-manager. A brilliant bit of free software developed by Red Hat (they also help develop libvirt).
This program allows the user to; create, start, edit, pause and stop VMs. Whilst providing performance metrics for individual VMs.
$ sudo pacman -S virt-manager
Once all the above steps have been completed, you may need to reboot your system. Then to create a VM, find and download the operating system you want to try out. And start the virt-manager application.
At first you'll be greeted with an empty list of VMs. To create a new VM, click on the monitor with the star and play button in the top left.
File > New Virtual Machine
Then you will be greeted with a VM creation wizard. For this quick run-through I'm going to create a VM for Debian 11 "Bullseye", from a local install media.
Select the downloaded ISO and find the operating system, if virt-manager does not automatically find it for you.
As Debian 11 is new, I had to choose
Then choose how much system memory and the number of CPUs you want to give whilst the VM runs.
Then do the same with how much storage you want to provide. This won't automatically take up the given amount. But, sets a cap on the total amount you have made available to it.
Finally, name your VM and select the network solution for it. This tutorial assumed that you would want to provide a virtual network, so that's what has been selected here.
Now the new VM will be listed.
To start it, select the VM and click on the play button to power it on. Then select Open to view it.
If you've made it this far, thanks for reading!
I hope this article has been helpful in understanding some of the basics of virtualisation on Linux. How to set up your system and manage VMs with KVM, QEMU, libvirt and Virtual Machine Manager. And the steps needed to create a new VM using virt-manager.
If you've got any questions about this process, or think I might have missed something, just ask below.