]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
virt: detect WSL environment as a container (id: wsl)
authorBalint Reczey <balint.reczey@canonical.com>
Wed, 6 Mar 2019 17:46:04 +0000 (18:46 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 13 Mar 2019 17:42:27 +0000 (18:42 +0100)
man/systemd-detect-virt.xml
man/systemd.unit.xml
src/basic/virt.c
src/basic/virt.h

index 5c5510eaf23527f19981acb7f77f76bdb720644d..1f5270dbb2a49f4d4eaf57281151f1748e7b299d 100644 (file)
           </row>
 
           <row>
-            <entry valign="top" morerows="5">Container</entry>
+            <entry valign="top" morerows="6">Container</entry>
             <entry><varname>openvz</varname></entry>
             <entry>OpenVZ/Virtuozzo</entry>
           </row>
             <entry><varname>rkt</varname></entry>
             <entry>rkt app container runtime</entry>
           </row>
+
+          <row>
+            <entry><varname>wsl</varname></entry>
+            <entry><ulink url="https://docs.microsoft.com/en-us/windows/wsl/about">Windows Subsystem for Linux</ulink></entry>
+          </row>
         </tbody>
       </tgroup>
     </table>
     machine and container virtualization are used in
     conjunction, only the latter will be identified (unless
     <option>--vm</option> is passed).</para>
+    <para> Windows Subsystem for Linux is not a Linux container,
+    but an environment for running Linux userspace applications on
+    top of the Windows kernel using a Linux-compatible interface.
+    WSL is categorized as a container for practical purposes.
+    Multiple WSL environments share the same kernel and services
+    should generally behave like when being run in a container.</para>
   </refsect1>
 
   <refsect1>
index 14418c359f4c71fff59f0efbf49d52886516604f..93b576d539b9483929f237e6e80c720dce787e09 100644 (file)
         <varname>systemd-nspawn</varname>,
         <varname>docker</varname>,
         <varname>rkt</varname>,
+        <varname>wsl</varname>,
         <varname>acrn</varname> to test
         against a specific implementation, or
         <varname>private-users</varname> to check whether we are running in a user namespace. See
index 0717347b35e42557e59839bdb278f11a8541471a..5dd1bd6633f9391be84debb9f25dfb7d9ddad7d7 100644 (file)
@@ -438,10 +438,12 @@ int detect_container(void) {
                 { "systemd-nspawn", VIRTUALIZATION_SYSTEMD_NSPAWN },
                 { "docker",         VIRTUALIZATION_DOCKER         },
                 { "rkt",            VIRTUALIZATION_RKT            },
+                { "wsl",            VIRTUALIZATION_WSL            },
         };
 
         static thread_local int cached_found = _VIRTUALIZATION_INVALID;
         _cleanup_free_ char *m = NULL;
+        _cleanup_free_ char *o = NULL;
         const char *e = NULL;
         unsigned j;
         int r;
@@ -456,6 +458,15 @@ int detect_container(void) {
                 goto finish;
         }
 
+        /* "Official" way of detecting WSL https://github.com/Microsoft/WSL/issues/423#issuecomment-221627364 */
+        r = read_one_line_file("/proc/sys/kernel/osrelease", &o);
+        if (r >= 0) {
+                if (strstr(o, "Microsoft") || strstr(o, "WSL")) {
+                        r = VIRTUALIZATION_WSL;
+                        goto finish;
+                }
+        }
+
         if (getpid_cached() == 1) {
                 /* If we are PID 1 we can just check our own environment variable, and that's authoritative. */
 
@@ -639,6 +650,7 @@ static const char *const virtualization_table[_VIRTUALIZATION_MAX] = {
         [VIRTUALIZATION_OPENVZ] = "openvz",
         [VIRTUALIZATION_DOCKER] = "docker",
         [VIRTUALIZATION_RKT] = "rkt",
+        [VIRTUALIZATION_WSL] = "wsl",
         [VIRTUALIZATION_CONTAINER_OTHER] = "container-other",
 };
 
index 03cf1752f47b19842228dbda6dbd18de9e386482..c0836897f62936587909e3b5b4cee57c28c83ec8 100644 (file)
@@ -32,6 +32,7 @@ enum {
         VIRTUALIZATION_OPENVZ,
         VIRTUALIZATION_DOCKER,
         VIRTUALIZATION_RKT,
+        VIRTUALIZATION_WSL,
         VIRTUALIZATION_CONTAINER_OTHER,
         VIRTUALIZATION_CONTAINER_LAST = VIRTUALIZATION_CONTAINER_OTHER,