]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
virt: swap order of cpuid and dmi again, but properly detect oracle (#5355)
authorChristian Hesse <mail@eworm.de>
Wed, 15 Feb 2017 22:51:31 +0000 (23:51 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 15 Feb 2017 22:51:31 +0000 (17:51 -0500)
This breaks again, this time for setups where Qemu is not reported via DMI for whatever
reason. So swap order of cpuid and dmi again, but properly detect oracle.

See issue #5318.

man/systemd-detect-virt.xml
src/basic/virt.c

index dc10b4dd430320e40e36b0e44cee104a03166a9a..72ea35892ff39c179d0411005e04c182e62d615a 100644 (file)
@@ -96,7 +96,8 @@
 
           <row>
             <entry><varname>kvm</varname></entry>
-            <entry>Linux KVM kernel virtual machine, from within QEMU</entry>
+            <entry>Linux KVM kernel virtual machine, with whatever software, except
+            Oracle Virtualbox</entry>
           </row>
 
           <row>
 
           <row>
             <entry><varname>oracle</varname></entry>
-            <entry>Oracle VM VirtualBox (historically marketed by innotek and Sun Microsystems)</entry>
+            <entry>Oracle VM VirtualBox (historically marketed by innotek and Sun Microsystems),
+            for legacy and KVM hypervisor</entry>
           </row>
 
           <row>
index 0fbbdea6029c7cf39a34eecc675e897a51340ae3..830dc655e381f2092f80d6ed2d5012120c9b1323 100644 (file)
@@ -316,31 +316,29 @@ static int detect_vm_zvm(void) {
 /* Returns a short identifier for the various VM implementations */
 int detect_vm(void) {
         static thread_local int cached_found = _VIRTUALIZATION_INVALID;
-        int r, cpuid;
+        int r, dmi;
 
         if (cached_found >= 0)
                 return cached_found;
 
         /* We have to use the correct order here:
          *
-         * -> First try to detect qemu/kvm and return 'kvm'.
-         * -> Some virtualization technologies do use KVM hypervisor but are
-         *    expected to be detected as something else. Virtualbox since
-         *    version 5.0 is an example. So detect DMI next.
-         * -> Get infos from CPUID third. */
+         * -> First try to detect Oracle Virtualbox, even if it uses KVM.
+         * -> Second try to detect from cpuid, this will report KVM for
+         *    whatever software is used even if info in dmi is overwritten.
+         * -> Third try to detect from dmi. */
 
-        cpuid = detect_vm_cpuid();
-        r = detect_vm_dmi();
-
-        if (r == VIRTUALIZATION_QEMU && cpuid == VIRTUALIZATION_KVM)
-                return cpuid;
+        dmi = detect_vm_dmi();
+        if (dmi == VIRTUALIZATION_ORACLE)
+                return dmi;
 
+        r = detect_vm_cpuid();
         if (r < 0)
                 return r;
         if (r != VIRTUALIZATION_NONE)
                 goto finish;
 
-        r = cpuid;
+        r = dmi;
         if (r < 0)
                 return r;
         if (r != VIRTUALIZATION_NONE)