mirror of
https://github.com/systemd/systemd.git
synced 2024-12-27 07:22:31 +03:00
systemd-detect-virt: only discover Xen domU
The current vm detection lacks the distinction between Xen dom0 and Xen domU. Both, dom0 and domU are running inside the hypervisor. Therefore systemd-detect-virt and the ConditionVirtualization directive detect dom0 as a virtual machine. dom0 is not using virtual devices but is accessing the real hardware. Therefore dom0 should be considered the virtualisation host and not a virtual machine. https://bugs.freedesktop.org/show_bug.cgi?id=77271
This commit is contained in:
parent
299a55075d
commit
37287585b6
Notes:
Lennart Poettering
2014-06-11 13:11:23 +02:00
Backport: bugfix
@ -148,7 +148,7 @@ static int detect_vm_dmi(const char **_id) {
|
|||||||
|
|
||||||
/* Returns a short identifier for the various VM implementations */
|
/* Returns a short identifier for the various VM implementations */
|
||||||
int detect_vm(const char **id) {
|
int detect_vm(const char **id) {
|
||||||
_cleanup_free_ char *hvtype = NULL, *cpuinfo_contents = NULL;
|
_cleanup_free_ char *domcap = NULL, *cpuinfo_contents = NULL;
|
||||||
static thread_local int cached_found = -1;
|
static thread_local int cached_found = -1;
|
||||||
static thread_local const char *cached_id = NULL;
|
static thread_local const char *cached_id = NULL;
|
||||||
const char *_id = NULL;
|
const char *_id = NULL;
|
||||||
@ -162,17 +162,37 @@ int detect_vm(const char **id) {
|
|||||||
return cached_found;
|
return cached_found;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try high-level hypervisor sysfs file first:
|
/* Try xen capabilities file first, if not found try high-level hypervisor sysfs file:
|
||||||
*
|
*
|
||||||
* https://bugs.freedesktop.org/show_bug.cgi?id=61491 */
|
* https://bugs.freedesktop.org/show_bug.cgi?id=77271 */
|
||||||
r = read_one_line_file("/sys/hypervisor/type", &hvtype);
|
r = read_one_line_file("/proc/xen/capabilities", &domcap);
|
||||||
if (r >= 0) {
|
if (r >= 0) {
|
||||||
if (streq(hvtype, "xen")) {
|
char *cap, *i = domcap;
|
||||||
|
|
||||||
|
while ((cap = strsep(&i, ",")))
|
||||||
|
if (streq(cap, "control_d"))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!i) {
|
||||||
_id = "xen";
|
_id = "xen";
|
||||||
r = 1;
|
r = 1;
|
||||||
goto finish;
|
|
||||||
}
|
}
|
||||||
} else if (r != -ENOENT)
|
|
||||||
|
goto finish;
|
||||||
|
|
||||||
|
} else if (r == -ENOENT) {
|
||||||
|
_cleanup_free_ char *hvtype = NULL;
|
||||||
|
|
||||||
|
r = read_one_line_file("/sys/hypervisor/type", &hvtype);
|
||||||
|
if (r >= 0) {
|
||||||
|
if (streq(hvtype, "xen")) {
|
||||||
|
_id = "xen";
|
||||||
|
r = 1;
|
||||||
|
goto finish;
|
||||||
|
}
|
||||||
|
} else if (r != -ENOENT)
|
||||||
|
return r;
|
||||||
|
} else
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
/* this will set _id to "other" and return 0 for unknown hypervisors */
|
/* this will set _id to "other" and return 0 for unknown hypervisors */
|
||||||
|
Loading…
Reference in New Issue
Block a user