diff options
-rw-r--r-- | man/systemd-detect-virt.xml | 13 | ||||
-rw-r--r-- | man/systemd.unit.xml | 1 | ||||
-rw-r--r-- | src/basic/virt.c | 12 | ||||
-rw-r--r-- | src/basic/virt.h | 1 |
4 files changed, 26 insertions, 1 deletions
diff --git a/man/systemd-detect-virt.xml b/man/systemd-detect-virt.xml index 5c5510eaf2..1f5270dbb2 100644 --- a/man/systemd-detect-virt.xml +++ b/man/systemd-detect-virt.xml @@ -131,7 +131,7 @@ </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> @@ -160,6 +160,11 @@ <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> @@ -169,6 +174,12 @@ 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> diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml index 14418c359f..93b576d539 100644 --- a/man/systemd.unit.xml +++ b/man/systemd.unit.xml @@ -1089,6 +1089,7 @@ <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 diff --git a/src/basic/virt.c b/src/basic/virt.c index 0717347b35..5dd1bd6633 100644 --- a/src/basic/virt.c +++ b/src/basic/virt.c @@ -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", }; diff --git a/src/basic/virt.h b/src/basic/virt.h index 03cf1752f4..c0836897f6 100644 --- a/src/basic/virt.h +++ b/src/basic/virt.h @@ -32,6 +32,7 @@ enum { VIRTUALIZATION_OPENVZ, VIRTUALIZATION_DOCKER, VIRTUALIZATION_RKT, + VIRTUALIZATION_WSL, VIRTUALIZATION_CONTAINER_OTHER, VIRTUALIZATION_CONTAINER_LAST = VIRTUALIZATION_CONTAINER_OTHER, |