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

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 it's 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.


vagrant linux