|
Zbigniew Jędrzejewski-Szmek |
7f93bc |
From dfef23e1b6c0c89b17b7b52f6ec1537649a8c60b Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
From: Thomas Blume <Thomas.Blume@suse.com>
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
Date: Fri, 6 Jun 2014 16:36:45 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
Subject: [PATCH] systemd-detect-virt: only discover Xen domU
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
The current vm detection lacks the distinction between Xen dom0 and Xen domU.
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
Both, dom0 and domU are running inside the hypervisor.
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
Therefore systemd-detect-virt and the ConditionVirtualization directive detect
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
dom0 as a virtual machine.
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
dom0 is not using virtual devices but is accessing the real hardware.
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
Therefore dom0 should be considered the virtualisation host and not a virtual
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
machine.
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
https://bugs.freedesktop.org/show_bug.cgi?id=77271
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
(cherry picked from commit 37287585b6ba9a55065c8f94458f6db3c0abe0af)
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
(cherry picked from commit f22d2ebe687ad842f4bed11df918ed07a0bb3e78)
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
Conflicts:
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
src/shared/virt.c
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
src/shared/virt.c | 34 +++++++++++++++++++++++++++-------
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
1 file changed, 27 insertions(+), 7 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
diff --git a/src/shared/virt.c b/src/shared/virt.c
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
index 4e18638..e59f2b1 100644
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
--- a/src/shared/virt.c
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+++ b/src/shared/virt.c
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
@@ -149,7 +149,7 @@ static int detect_vm_dmi(const char **_id) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
/* Returns a short identifier for the various VM implementations */
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
int detect_vm(const char **id) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
- _cleanup_free_ char *hvtype = NULL, *cpuinfo_contents = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ _cleanup_free_ char *domcap = NULL, *cpuinfo_contents = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
static __thread int cached_found = -1;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
static __thread const char *cached_id = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
const char *_id = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
@@ -163,17 +163,37 @@ int detect_vm(const char **id) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
return cached_found;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
- /* Try high-level hypervisor sysfs file first:
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ /* Try xen capabilities file first, if not found try high-level hypervisor sysfs file:
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
*
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
- * https://bugs.freedesktop.org/show_bug.cgi?id=61491 */
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
- r = read_one_line_file("/sys/hypervisor/type", &hvtype);
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ * https://bugs.freedesktop.org/show_bug.cgi?id=77271 */
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ r = read_one_line_file("/proc/xen/capabilities", &domcap);
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
if (r >= 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
- if (streq(hvtype, "xen")) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ char *cap, *i = domcap;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ while ((cap = strsep(&i, ",")))
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ if (streq(cap, "control_d"))
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ break;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ if (!i) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
_id = "xen";
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
r = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
- goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
- } else if (r != -ENOENT)
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ } else if (r == -ENOENT) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ _cleanup_free_ char *hvtype = NULL;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ r = read_one_line_file("/sys/hypervisor/type", &hvtype);
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ if (r >= 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ if (streq(hvtype, "xen")) {
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ _id = "xen";
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ r = 1;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ goto finish;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ } else if (r != -ENOENT)
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ return r;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
+ } else
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
return r;
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
|
|
Zbigniew Jędrzejewski-Szmek |
a59965 |
/* this will set _id to "other" and return 0 for unknown hypervisors */
|