This post will cover the process of installing Vagrant with the libvirt provider on Ubuntu 1804.

Software In This Post

For reference the following software will be used in this post.

  • Ubuntu - 1804
  • Vagrant - 2.2.9
  • Vagrant-libvirt - 0.1.2

System Prep

Before we begin, lets ensure the host is updated.

sudo apt update -y && sudo apt upgrade -y


Download Vagrant.


# output

--2020-08-15 00:37:08--
Resolving (, 2a04:4e42:7::439
Connecting to (||:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 42978828 (41M) [application/x-debian-package]
Saving to: ‘vagrant_2.2.9_x86_64.deb’

vagrant_2.2.9_x86_64.deb      100%[=================================================>]  40.99M  11.2MB/s    in 3.7s

2020-08-15 00:37:12 (11.1 MB/s) - ‘vagrant_2.2.9_x86_64.deb’ saved [42978828/42978828]

Install Vagrant.

sudo dpkg -i vagrant_2.2.9_x86_64.deb

# output

Selecting previously unselected package vagrant.
(Reading database ... 67128 files and directories currently installed.)
Preparing to unpack vagrant_2.2.9_x86_64.deb ...
Unpacking vagrant (1:2.2.9) ...
Setting up vagrant (1:2.2.9) ...

Verify Vagrant installation.

which vagrant
# output


vagrant --version
# output

Vagrant 2.2.9

Install the vagrant-libvirt dependencies

sudo apt install -y qemu libvirt-bin ebtables dnsmasq-base
sudo apt install -y libxslt-dev libxml2-dev libvirt-dev zlib1g-dev ruby-dev

Install the vagrant-libvirt plugin

vagrant plugin install vagrant-libvirt

# output

Installing the 'vagrant-libvirt' plugin. This can take a few minutes...
Fetching excon-0.76.0.gem
Fetching formatador-0.2.5.gem
Fetching fog-core-2.2.0.gem
Fetching fog-json-1.2.0.gem
Fetching mini_portile2-2.4.0.gem
Fetching nokogiri-1.10.10.gem
Building native extensions. This could take a while...
Fetching fog-xml-0.1.3.gem
Fetching ruby-libvirt-0.7.1.gem
Building native extensions. This could take a while...
Fetching fog-libvirt-0.7.0.gem
Fetching vagrant-libvirt-0.1.2.gem
Installed the plugin 'vagrant-libvirt (0.1.2)'!


Add your user to the libvirt group.

sudo usermod -aG libvirt $USER
Re-login to have the group applied to your user.

Create a vagrant-libvirt network using an xml file named vagrant-libvirt.xml with the below contents.

<network connections='1'>
  <forward mode='nat'>
      <port start='1024' end='65535'/>
  <bridge name='virbr1' stp='on' delay='0'/>
  <ip address='' netmask=''>
      <range start='' end=''/>

Define and start the network.

virsh net-define vagrant-libvirt.xml
virsh net-start vagrant-libvirt
virsh net-autostart vagrant-libvirt


Create a test folder and Vagrantfile

mkdir -p ~/vagrant/centos-test && cd ~/vagrant/centos-test && vagrant init centos/7
# output

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`` for more information on using Vagrant.

The vagrant init command will create the following Vagrantfile

# Comments removed for berevity.

Vagrant.configure("2") do |config| = "centos/7"

Now confirm that you can build a Vagrant box with the vagrant up command.

vagrant up

# output

Bringing machine 'default' up with 'libvirt' provider...
==> default: Box 'centos/7' could not be found. Attempting to find and install...
    default: Box Provider: libvirt
    default: Box Version: >= 0
==> default: Loading metadata for box 'centos/7'
    default: URL:
==> default: Adding box 'centos/7' (v2004.01) for provider: libvirt
    default: Downloading:
Download redirected to host:
    default: Calculating and comparing box checksum...
==> default: Successfully added box 'centos/7' (v2004.01) for 'libvirt'!
==> default: Uploading base box image as volume into Libvirt storage...
==> default: Creating image (snapshot of base box volume).
==> default: Creating domain with the following settings...
==> default:  -- Name:              centos-test_default
==> default:  -- Domain type:       kvm
==> default:  -- Cpus:              1
==> default:  -- Feature:           acpi
==> default:  -- Feature:           apic
==> default:  -- Feature:           pae
==> default:  -- Memory:            512M
==> default:  -- Management MAC:
==> default:  -- Loader:
==> default:  -- Nvram:
==> default:  -- Base box:          centos/7
==> default:  -- Storage pool:      default
==> default:  -- Image:             /var/lib/libvirt/images/centos-test_default.img (41G)
==> default:  -- Volume Cache:      default
==> default:  -- Kernel:
==> default:  -- Initrd:
==> default:  -- Graphics Type:     vnc
==> default:  -- Graphics Port:     -1
==> default:  -- Graphics IP:
==> default:  -- Graphics Password: Not defined
==> default:  -- Video Type:        cirrus
==> default:  -- Video VRAM:        9216
==> default:  -- Sound Type:
==> default:  -- Keymap:            en-us
==> default:  -- TPM Path:
==> default:  -- INPUT:             type=mouse, bus=ps2
==> default: Creating shared folders metadata...
==> default: Starting domain.
==> default: Waiting for domain to get an IP address...
==> default: Waiting for SSH to become available...
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if its present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Rsyncing folder: /home/bradmin/vagrant/centos-test/ => /vagrant

# SUCCESS !!!!

Clean Up

Kill the Vagrant box

vagrant destroy -f

# output
==> default: Removing domain...

Delete Vagrant .deb file.

rm ~/vagrant_2.2.9_x86_64.deb


If you followed along, Vagrant and the vagrant-libvirt plugin are now installed in your Ubuntu 1804 host and you can successfully build Vagrant boxes.