]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: check for kvm availability before starting kvm guests
authorLaine Stump <laine@laine.org>
Mon, 9 Jan 2012 19:54:14 +0000 (14:54 -0500)
committerLaine Stump <laine@laine.org>
Tue, 10 Jan 2012 18:42:59 +0000 (13:42 -0500)
This *kind of* addresses:

  https://bugzilla.redhat.com/show_bug.cgi?id=772395

(it doesn't eliminate the failure to start, but causes libvirt to give
a better idea about the cause of the failure).

If a guest uses a kvm emulator (e.g. /usr/bin/qemu-kvm) and the guest
is started when kvm isn't available (either because virtualization is
unavailable / has been disabled in the BIOS, or the kvm modules
haven't been loaded for some reason), a semi-cryptic error message is
logged:

  libvirtError: internal error Child process (LC_ALL=C
  PATH=/sbin:/usr/sbin:/bin:/usr/bin /usr/bin/qemu-kvm -device ? -device
  pci-assign,? -device virtio-blk-pci,? -device virtio-net-pci,?) status
  unexpected: exit status 1

This patch notices at process start that a guest needs kvm, and checks
for the presence of /dev/kvm (a reasonable indicator that kvm is
available) before trying to execute the qemu binary. If kvm isn't
available, a more useful (too verbose??) error is logged.

src/qemu/qemu_process.c

index 105b895f512ea66a3c0861704cfcc7e717a455f4..e0fd0732c9f9245dcd761daf192c85436f1b6ca9 100644 (file)
@@ -3031,6 +3031,17 @@ int qemuProcessStart(virConnectPtr conn,
     if ((logfile = qemuDomainCreateLog(driver, vm, false)) < 0)
         goto cleanup;
 
+    if (vm->def->virtType == VIR_DOMAIN_VIRT_KVM) {
+        VIR_DEBUG("Checking for KVM availability");
+        if (access("/dev/kvm", F_OK) != 0) {
+            qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                            _("Domain requires KVM, but it is not available. "
+                              "Check that virtualization is enabled in the host BIOS, "
+                              "and host configuration is setup to load the kvm modules."));
+            goto cleanup;
+        }
+    }
+
     VIR_DEBUG("Determining emulator version");
     qemuCapsFree(priv->qemuCaps);
     priv->qemuCaps = NULL;