chiark / gitweb /
Fix service file to match installed elogind binary location
[elogind.git] / src / basic / virt.c
index 0ce07b8fdac18d77303404c29e009a0dce7cba31..0060bb84602dc4c6aa98b53df4e41626ad3418d7 100644 (file)
@@ -48,7 +48,7 @@ static int detect_vm_cpuid(void) {
                 { "KVMKVMKVM",    VIRTUALIZATION_KVM       },
                 /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
                 { "VMwareVMware", VIRTUALIZATION_VMWARE    },
-                /* http://msdn.microsoft.com/en-us/library/ff542428.aspx */
+                /* https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/reference/tlfs */
                 { "Microsoft Hv", VIRTUALIZATION_MICROSOFT },
                 /* https://wiki.freebsd.org/bhyve */
                 { "bhyve bhyve ", VIRTUALIZATION_BHYVE     },
@@ -315,25 +315,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, dmi;
 
         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. */
-        r = detect_vm_dmi();
+         * -> 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. */
+
+        dmi = detect_vm_dmi();
+        if (dmi == VIRTUALIZATION_ORACLE) {
+                r = dmi;
+                goto finish;
+        }
+
+        r = detect_vm_cpuid();
         if (r < 0)
                 return r;
         if (r != VIRTUALIZATION_NONE)
                 goto finish;
 
-        r = detect_vm_cpuid();
+        r = dmi;
         if (r < 0)
                 return r;
         if (r != VIRTUALIZATION_NONE)
@@ -566,32 +572,18 @@ int running_in_userns(void) {
 #endif // 0
 
 int running_in_chroot(void) {
-        _cleanup_free_ char *self_mnt = NULL, *pid1_mnt = NULL;
-        int r;
-
-        /* Try to detect whether we are running in a chroot() environment. Specifically, check whether we have a
-         * different root directory than PID 1, even though we live in the same mount namespace as it. */
+        int ret;
 
 #if 0 /// elogind does not allow to ignore chroots, we are never init!
         if (getenv_bool("SYSTEMD_IGNORE_CHROOT") > 0)
                 return 0;
 #endif // 0
 
-        r = files_same("/proc/1/root", "/");
-        if (r < 0)
-                return r;
-        if (r > 0)
-                return 0;
-
-        r = readlink_malloc("/proc/self/ns/mnt", &self_mnt);
-        if (r < 0)
-                return r;
-
-        r = readlink_malloc("/proc/1/ns/mnt", &pid1_mnt);
-        if (r < 0)
-                return r;
+        ret = files_same("/proc/1/root", "/", 0);
+        if (ret < 0)
+                return ret;
 
-        return streq(self_mnt, pid1_mnt); /* Only if we live in the same namespace! */
+        return ret == 0;
 }
 
 static const char *const virtualization_table[_VIRTUALIZATION_MAX] = {