Trying out ArchLinux using libvirt and Vagrant

Published on

I have been curious about the ArchLinux distribution for some time. I have a Ubuntu 20.04 server running in headless mode in my home lab, with KVM + libvirt already set up, so I decided to set up a virtual machine to give Arch a try.

I spent a fair amount of time researching how best to use libvirt to create a new VM, but almost all of the tutorials and how-tos that I found assumed access to an X desktop, either with virt-manager or with some sort of graphics driver given to virt-install. Only a couple1 talked about how to use --graphics none to create a VM purely from the command line, with examples of how to connect to the virtual machine to run through the installation process.

It's not for the faint of heart.

However, when I went to the ArchLinux Downloads page, the section on Vagrant Images jumped out at me. Vagrant is a tool that I have been meaning to play with as well, and right there on the ArchLinux site were instructions for setting up an Arch virtual machine using Vagrant!

So I went and downloaded Vagrant from Hasicorp's website, and tried to follow along with How To Use Vagrant with Libvirt on Linux. I kept tripping over missing dependencies when trying to install the vagrant-libvirt plugin, however. I didn't have gcc nor make installed yet, and then I ran into all of the Ruby dependencies . . .

I was expecting a long night. Fortunately, when I went to double-check that I had libvirt installed on my server, apt list | grep libvirt told me that Ubuntu had vagrant-libvirt available from the default repository. Installing vagrant along with the vagrant-libvirt plugin and all of the necessary Ruby dependencies turned out to be as simple as:

$ sudo apt-get install vagrant-libvirt

With vagrant in hand, I followed along with the steps from the ArchLinux documentation:

$ vagrant init archlinux/archlinux
$ vagrant up

Everything looked fine, until Vagrant attempted to set up the NFS mounts. The process hung there, and eventually timed out.

Searching the internet for advice, I came across a 3-year-old issue report on Vagrant's GitHub: vagrant up stuck when mounting NFS shared folders. This made me realize that my firewall was blocking the NFS mount. The discussion thread had good advice for people using firewall-cmd but unfortunately, my server is using the ufw firewall instead.

So it was back to Google, where I pieced together a solution from a number of helpful articles.2

First, I had to tell mountd to listen on a known port, rather than a random one, by editing /etc/default/nfs-kernel-server to replace

RPCMOUNTDOPTS="--manage-gids"

with

RPCMOUNTDOPTS="--manage-gids --port 32767"

I then restarted the NFS processes by executing:

$ sudo sysctl --system
$ sudo /etc/init.d/nfs-kernel-server restart

FInally, the ufw rules that I settled on were:

$ sudo ufw allow in on virbr2 to any port nfs
$ sudo ufw allow in on virbr2 to any port 111
$ sudo ufw allow in on virbr2 to any port 32767

I chose to allow connections from any of the virtual hosts set up by libvirt by creating allow rules for libvirt's virtual network device virbr2.

The first rule takes advantage of ufw being able to look into /etc/services to find the port for nfs.

The second rule is to enable rpc-bind.

The final rule is to enable the port configured for mountd above.

With the firewall finally configured correctly, vagrant up worked, and vagrant ssh dropped me into a shell inside my new ArchLinux virtual machine.

I don't know that I can yet join the Arch meme crowd – BTW, I use Arch – but I'm a step closer to being able to, now.


  1. https://unix.stackexchange.com/questions/309788/how-to-create-a-vm-from-scratch-with-virsh and https://www.thegeekstuff.com/2014/10/linux-kvm-create-guest-vm/ being a couple examples of sites that did talk about --graphics none ↩︎

  2. Chief among the helpful articles about setting up ufw were: Firewall problem using autofs with NFS-exported mounts, Which ports do I need to open in the firewall to use NFS?, and SecuringNFS ↩︎