diff --git a/man/systemd-detect-virt.xml b/man/systemd-detect-virt.xml index dc10b4dd430..72ea35892ff 100644 --- a/man/systemd-detect-virt.xml +++ b/man/systemd-detect-virt.xml @@ -96,7 +96,8 @@ kvm - Linux KVM kernel virtual machine, from within QEMU + Linux KVM kernel virtual machine, with whatever software, except + Oracle Virtualbox @@ -116,7 +117,8 @@ oracle - Oracle VM VirtualBox (historically marketed by innotek and Sun Microsystems) + Oracle VM VirtualBox (historically marketed by innotek and Sun Microsystems), + for legacy and KVM hypervisor diff --git a/src/basic/virt.c b/src/basic/virt.c index 0fbbdea6029..830dc655e38 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -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)