mirror of
https://github.com/systemd/systemd.git
synced 2024-12-22 17:35:35 +03:00
virt: detect qemu/kvm as 'kvm'
In commit 050e65a
we swapped order of detect_vm_{cpuid,dmi}(). That
fixed Virtualbox but broke qemu with kvm, which is expected to return
'kvm'. So check for qemu/kvm first, then DMI, CPUID last.
This fixes #5318.
Signed-off-by: Christian Hesse <mail@eworm.de>
This commit is contained in:
parent
4ec426b975
commit
5f1c788ca9
@ -91,12 +91,12 @@
|
||||
<row>
|
||||
<entry valign="top" morerows="10">VM</entry>
|
||||
<entry><varname>qemu</varname></entry>
|
||||
<entry>QEMU software virtualization</entry>
|
||||
<entry>QEMU software virtualization, without KVM</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
<entry><varname>kvm</varname></entry>
|
||||
<entry>Linux KVM kernel virtual machine</entry>
|
||||
<entry>Linux KVM kernel virtual machine, from within QEMU</entry>
|
||||
</row>
|
||||
|
||||
<row>
|
||||
|
@ -316,25 +316,31 @@ 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;
|
||||
int r, cpuid;
|
||||
|
||||
if (cached_found >= 0)
|
||||
return cached_found;
|
||||
|
||||
/* We have to use the correct order here:
|
||||
* Some virtualization technologies do use KVM hypervisor but are
|
||||
* expected to be detected as something else. So detect DMI first.
|
||||
*
|
||||
* An example is Virtualbox since version 5.0, which uses KVM backend.
|
||||
* Detection via DMI works corretly, the CPU ID would find KVM
|
||||
* only. */
|
||||
* -> 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. */
|
||||
|
||||
cpuid = detect_vm_cpuid();
|
||||
r = detect_vm_dmi();
|
||||
|
||||
if (r == VIRTUALIZATION_QEMU && cpuid == VIRTUALIZATION_KVM)
|
||||
return cpuid;
|
||||
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r != VIRTUALIZATION_NONE)
|
||||
goto finish;
|
||||
|
||||
r = detect_vm_cpuid();
|
||||
r = cpuid;
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r != VIRTUALIZATION_NONE)
|
||||
|
Loading…
Reference in New Issue
Block a user