https://dailystuff.nlDailystuff on the Internet - Posts tagged libvirt2024-03-16T09:59:04.480343+00:00ABloghttps://dailystuff.nl/blog/2022/use-dnf-versionlock-for-vagrant.htmlUse specific Vagrant version on Fedora2022-08-21T00:00:00+00:00Hans Spaans<section id="use-specific-vagrant-version-on-fedora">
<p><a class="reference external" href="https://www.vagrantup.com/">Vagrant</a> is a tool for building and managing virtual machines locally with just a few commands and a single file. It is a good way to get started with <em>infrastructure-as-code</em> on your local machine. Vagrant is also shipped with Fedora to make it easier to install and use as it uses <a class="reference external" href="https://libvirt.org/">libvirt</a> to manage the virtual machines running on Linux with kernel virtualization to provide virtual hardware. This works well until you also want to install <a class="reference external" href="https://www.terraform.io/">Terraform</a> from the <a class="reference external" href="https://www.hashicorp.com/">HashiCorp</a> repository and later you upgrade Vagrant to a newer version with a regular package update.</p>
<div class="literal-block-wrapper docutils container" id="id2">
<div class="code-block-caption"><span class="caption-text">Vagrant fails to find libvirt</span></div>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>vagrant<span class="w"> </span>up
<span class="go">The provider 'libvirt' could not be found, but was requested to</span>
<span class="go">back the machine 'default'. Please use a provider that exists.</span>
<span class="go">Vagrant knows about the following providers: docker, hyperv, virtualbox</span>
</pre></div>
</div>
</div>
<section id="downgrading-vagrant">
<h2>Downgrading Vagrant</h2>
<p>In the example above Vagrant fails to find <a class="reference external" href="https://libvirt.org/">libvirt</a> to connect to <a class="reference external" href="https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine">KVM</a> and manage the virtual machine. Multiple providers are available for Vagrant to use, but the one that is used is not the one that is installed on the machine or can be used. This is a known issue with Vagrant on Linux and does not use the system Ruby environment with the lirbary for libvirt. Downgrading to the version of Vagrant that is shipped with Fedora will fix this issue.</p>
<div class="literal-block-wrapper docutils container" id="id3">
<div class="code-block-caption"><span class="caption-text">Show information about the vagrant package</span></div>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>sudo<span class="w"> </span>dnf<span class="w"> </span>info<span class="w"> </span>vagrant
<span class="go">Last metadata expiration check: 2:58:01 ago on Sat Aug 13 09:43:18 2022.</span>
<span class="go">Installed Packages</span>
<span class="go">Name : vagrant</span>
<span class="go">Version : 2.3.0</span>
<span class="go">Release : 1</span>
<span class="go">Architecture : x86_64</span>
<span class="go">Size : 108 M</span>
<span class="go">Source : vagrant-2.3.0-1.src.rpm</span>
<span class="go">Repository : hashicorp</span>
<span class="go">Summary : Vagrant is a tool for building and distributing development environments. Please submit issues to</span>
<span class="go"> : https://github.com/hashicorp/vagrant/issues</span>
<span class="go">URL : https://www.vagrantup.com</span>
<span class="go">License : MIT</span>
<span class="go">Description : Vagrant is a tool for building and distributing development environments. Please submit issues to</span>
<span class="go"> : https://github.com/hashicorp/vagrant/issues</span>
<span class="go">Available Packages</span>
<span class="go">Name : vagrant</span>
<span class="go">Version : 2.2.19</span>
<span class="go">Release : 4.fc36</span>
<span class="go">Architecture : noarch</span>
<span class="go">Size : 2.4 M</span>
<span class="go">Source : vagrant-2.2.19-4.fc36.src.rpm</span>
<span class="go">Repository : @System</span>
<span class="go">From repo : updates</span>
<span class="go">Summary : Build and distribute virtualized development environments</span>
<span class="go">URL : http://vagrantup.com</span>
<span class="go">License : MIT</span>
<span class="go">Description : Vagrant is a tool for building and distributing virtualized development</span>
<span class="go"> : environments.</span>
</pre></div>
</div>
</div>
<p>If you want to use the latest version of Vagrant on Fedora you can install it with the following command. After this Vagrant will work again with KVM on Linux.</p>
<div class="literal-block-wrapper docutils container" id="id4">
<div class="code-block-caption"><span class="caption-text">Downgrade Vagrant to 2.2.19</span></div>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>sudo<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>vagrant-2.2.19-4.fc36
</pre></div>
</div>
</div>
</section>
<section id="pinning-the-version-of-vagrant">
<h2>Pinning the version of Vagrant</h2>
<p>Now that Vagrant works again the problem with libvirt is fixed, but with the next update, the problem will return as Vagrant is updated to the latest version again. <a class="reference external" href="https://dnf.readthedocs.io/en/latest/">DNF</a> has a plugin called <a class="reference external" href="https://dnf-plugins-core.readthedocs.io/en/latest/versionlock.html">versionlock</a> to lock to a specific version of a package and stops it from being updated.</p>
<div class="literal-block-wrapper docutils container" id="id5">
<div class="code-block-caption"><span class="caption-text">Install DNF-plugin versionlock</span></div>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>sudo<span class="w"> </span>dnf<span class="w"> </span>install<span class="w"> </span>python3-dnf-plugin-versionlock
</pre></div>
</div>
</div>
<p>With the plugin installed you can lock the version of Vagrant to the latest version. This can be done with the command <code class="docutils literal notranslate"><span class="pre">dnf</span> <span class="pre">versionlock</span> <span class="pre">add</span> <span class="pre">vagrant</span></code> and an overview with the command <code class="docutils literal notranslate"><span class="pre">dnf</span> <span class="pre">versionlock</span> <span class="pre">list</span></code> confirms that the version is locked.</p>
<div class="literal-block-wrapper docutils container" id="id6">
<div class="code-block-caption"><span class="caption-text">Set the versionlock for package vagrant and list all packages with a versionlock</span></div>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>sudo<span class="w"> </span>dnf<span class="w"> </span>versionlock<span class="w"> </span>add<span class="w"> </span>vagrant
<span class="go">Last metadata expiration check: 2:52:28 ago on Sat Aug 13 09:43:18 2022.</span>
<span class="go">Adding versionlock on: vagrant-0:2.2.19-4.fc36.*</span>
<span class="gp">$ </span>sudo<span class="w"> </span>dnf<span class="w"> </span>versionlock<span class="w"> </span>list
<span class="go">Last metadata expiration check: 2:53:34 ago on Sat Aug 13 09:43:18 2022.</span>
<span class="go">vagrant-0:2.2.19-4.fc36.*</span>
</pre></div>
</div>
</div>
<p>Running the command <code class="docutils literal notranslate"><span class="pre">vagrant</span> <span class="pre">up</span></code> will now work again as it can find <a class="reference external" href="https://libvirt.org/">libvirt</a> to connect to KVM and it successfully starts the virtual machine.</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>vagrant<span class="w"> </span>up
<span class="go">Bringing machine 'default' up with 'libvirt' provider...</span>
<span class="go">==> default: Checking if box 'fedora/36-cloud-base' version '36-20220504.1' is up to date...</span>
<span class="go">==> default: Starting domain.</span>
<span class="go">==> default: Waiting for domain to get an IP address...</span>
<span class="go">==> default: Waiting for machine to boot. This may take a few minutes...</span>
</pre></div>
</div>
</section>
<section id="upgrading-vagrant">
<h2>Upgrading Vagrant</h2>
<p>Setting a versionlock on Vagrant will prevent it from being updated. If you want to upgrade to the latest version of Vagrant you first have to remove the versionlock with <code class="docutils literal notranslate"><span class="pre">dnf</span> <span class="pre">versionlock</span> <span class="pre">del</span> <span class="pre">vagrant</span></code>. This will allow Vagrant to be updated during a system upgrade for example or when you have to install a security update.</p>
<div class="literal-block-wrapper docutils container" id="id7">
<div class="code-block-caption"><span class="caption-text">Delete the versionlock for package vagrant</span></div>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>sudo<span class="w"> </span>dnf<span class="w"> </span>versionlock<span class="w"> </span>del<span class="w"> </span>vagrant
<span class="go">Last metadata expiration check: 2:52:50 ago on Sat Aug 13 09:43:18 2022.</span>
<span class="go">Deleting versionlock for: vagrant-0:2.2.19-4.fc36.*</span>
<span class="gp">$ </span>sudo<span class="w"> </span>dnf<span class="w"> </span>versionlock<span class="w"> </span>list
<span class="go">Last metadata expiration check: 2:53:14 ago on Sat Aug 13 09:43:18 2022.</span>
</pre></div>
</div>
</div>
</section>
<section id="future-solutions">
<h2>Future solutions</h2>
<p>Setting a versionlock isn’t perfect as it will prevent Vagrant from being updated when needed. As a result, you can end up with a version of Vagrant that is not the latest version or has a security vulnerability. This is a known issue with HashiCorp’s Vagrant repository and will be fixed in a future release hopefully when <a class="reference external" href="https://www.hashicorp.com/blog/toward-vagrant-3-0">Vagrant 3.0</a> is released as then Vagrant should have been rewritten in <a class="reference external" href="https://go.dev/">Go</a>. As version <a class="reference external" href="https://github.com/hashicorp/vagrant/releases/tag/v2.3.0">2.3</a> has just been released and 2.4 is still in development the use of the versionlock plugin is recommended.</p>
</section>
</section>
Vagrant is a tool for building and managing virtual machines locally with just a few commands and a single file. It is a good way to get started with infrastructure-as-code on your local machine. Vagrant is also shipped with Fedora to make it easier to install and use as it uses libvirt to manage the virtual machines running on Linux with kernel virtualization to provide virtual hardware. This works well until you also want to install Terraform from the HashiCorp repository and later you upgrade Vagrant to a newer version with a regular package update.In the example above Vagrant fails to find libvirt to connect to KVM and manage the virtual machine. Multiple providers are available for Vagrant to use, but the one that is used is not the one that is installed on the machine or can be used. This is a known issue with Vagrant on Linux and does not use the system Ruby environment with the lirbary for libvirt. Downgrading to the version of Vagrant that is shipped with Fedora will fix this issue.2022-08-21T00:00:00+00:00https://dailystuff.nl/blog/2019/setting-a-different-libvirt-uri-for-vagrant.htmlSetting a different libvirt uri for Vagrant2019-06-18T00:00:00+00:00Hans Spaans<section id="setting-a-different-libvirt-uri-for-vagrant">
<p><a class="reference external" href="https://www.vagrantup.com/">HashiCorp Vagrant</a> normally selects the right hypervisor, but the version shipped with <a class="reference external" href="https://fedoraproject.org/wiki/Releases/30/ChangeSet#Vagrant_2.2">Fedora 30</a> prefers to run within the QEMU user session of the hypervisor. A <em>.Vagrantfile</em> it would match the default behavior which doesn’t require any system privileges is shown below.</p>
<div class="highlight-ruby notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- mode: ruby -*-</span>
<span class="c1"># vi: set ft=ruby :</span>
<span class="no">Vagrant</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="s2">"2"</span><span class="p">)</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">synced_folder</span><span class="w"> </span><span class="s2">"."</span><span class="p">,</span><span class="w"> </span><span class="s2">"/vagrant"</span><span class="p">,</span><span class="w"> </span><span class="ss">disabled</span><span class="p">:</span><span class="w"> </span><span class="kp">true</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">define</span><span class="w"> </span><span class="s2">"test01"</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">test01</span><span class="o">|</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">box</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"centos/7"</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">box_version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"1902.01"</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">hostname</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"test01.localdomain"</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">provider</span><span class="w"> </span><span class="ss">:libvirt</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">domain</span><span class="o">|</span>
<span class="w"> </span><span class="n">domain</span><span class="o">.</span><span class="n">uri</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'qemu:///session'</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>
</pre></div>
</div>
<p>In some cases a virtual machine needs to run on QEMU system level and that can be done by changing the <em>domain.uri</em> from <em>“qemu:///session”</em> to <em>“qemu:///system”</em>. Vagrant now creates the virtual machine at the system level of the hypervisor and isn’t depending on any user environment to run.</p>
<div class="highlight-ruby notranslate"><div class="highlight"><pre><span></span><span class="c1"># -*- mode: ruby -*-</span>
<span class="c1"># vi: set ft=ruby :</span>
<span class="no">Vagrant</span><span class="o">.</span><span class="n">configure</span><span class="p">(</span><span class="s2">"2"</span><span class="p">)</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">config</span><span class="o">|</span>
<span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">synced_folder</span><span class="w"> </span><span class="s2">"."</span><span class="p">,</span><span class="w"> </span><span class="s2">"/vagrant"</span><span class="p">,</span><span class="w"> </span><span class="ss">disabled</span><span class="p">:</span><span class="w"> </span><span class="kp">true</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">define</span><span class="w"> </span><span class="s2">"test01"</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">test01</span><span class="o">|</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">box</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"centos/7"</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">box_version</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"1902.01"</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">hostname</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"test01.localdomain"</span>
<span class="w"> </span><span class="n">config</span><span class="o">.</span><span class="n">vm</span><span class="o">.</span><span class="n">provider</span><span class="w"> </span><span class="ss">:libvirt</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">domain</span><span class="o">|</span>
<span class="w"> </span><span class="n">domain</span><span class="o">.</span><span class="n">uri</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'qemu:///system'</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>
</pre></div>
</div>
<p>Membership of group <em>libvirt</em> maybe required or the right permissions with <em>sudo</em> for example. The first isn’t really advised except on local development system and then even <em>sudo</em> is still advised to reduce any accidental errors.</p>
</section>
HashiCorp Vagrant normally selects the right hypervisor, but the version shipped with Fedora 30 prefers to run within the QEMU user session of the hypervisor. A .Vagrantfile it would match the default behavior which doesn’t require any system privileges is shown below.In some cases a virtual machine needs to run on QEMU system level and that can be done by changing the domain.uri from “qemu:///session” to “qemu:///system”. Vagrant now creates the virtual machine at the system level of the hypervisor and isn’t depending on any user environment to run.2019-06-18T00:00:00+00:00