Das Windows Subsystem for Linux (kurz WSL) ist eine Schnittstelle ab Microsoft Windows 10 und Server 2016, mit der native Linux Programme innerhalb von Windows ausgeführt werden können.
Version 1 von WSL wurde als Beta Version in Windows 10 1607 (August 2016) eingeführt. WSL 1 erzeugt für jeden Linux-Prozess einen angepassten NT Prozess und fängt Kernel-Aufrufe ab um sie in Windows-NT äquivalente Aufrufe zu übersetzen.
Version 2 von WSL wurde 2018 angekündigt und fand final 2020 Einzug in alle Windows Produkte. WSL 2 arbeitet mit Hyper-V Techniken und nutzt einen eigenen angepassten Linux-Kernel in einer virtuellen Maschine um Linux Anwendungen nativ auszuführen.
WSL 1 richtete sind in erste Linie an Entwickler, um die Übersetzung von
Linux Programmen auf Windows Systemen zu ermöglichen. Seine Vorteile liegen
in der direkten Ausführung von Prozessen innerhalb der Windows Umgebung
und der direkten Nutzung des Dateisystems.
Die Performance des Dateisystems ist hingegen auch der größte Nachteil von
WSL 1, da Dateizugriffe um ein vielfaches langsamer arbeiten, als auf einem
nativen oder virtualisiertem Linux System.
Außerdem sind spezielle Dienste wie Docker
mit diesem Ansatz nicht möglich, da entsprechende Kernel-Aufrufe nicht
implementiert sind.
Durch die Nutzung der Virtualisierungstechnik Hyper-V sind Dateisystemzugriffe
in WSL 2 fast annähernd so schnell wie auf einem nativen Linux-System geworden
und diverse Schnittstellenprobleme der Vorgängerversion sind gelöst.
Das Dateisystem ist nun jedoch nicht mehr direkt zugänglich, deshalb müssen
der Windows-Host und der Linux-Bereich über Netzwerkschnittstellen
kommunizieren.
(z.B.: \\wsl$\Ubuntu-18.04\usr\bin verweist auf /usr/bin
in der Ubuntu Distribution.)
Während ursprünglich nur Ubuntu als primäre Distribution angeboten wurden, stehen heute mehrere Linux Distributionen für WSL bereit.
Linux Distributionen sind in WSL von einander getrennt, jede läuft mit einem eigenen virtuellen Dateisystem.
WSL kann als “optionales Windows-Feature” aktiviert werden und im Anschluss kann der Benutzer über den Windows Store oder manuell eine Linux Distribution auf sein System übertragen.
WSL ist auf einem nackten Windows 10/11 oder Server 2016/2019/2022 nicht
aktiviert.
Um WSL nutzen zu können, muss man:
Während in Windows 10/11 Linux Distributionen im
Windows Store per Klick
ausgewählt und installiert werden können, fehlt diese Option in den Windows
Server Varianten.
Auf älteren Server-Editionen muss man die Distribution als App-Paket
manuell herunterladen und das Setup per Hand ausführen.
Neuere Server (z.B. 2022) tragen die neueste Version von WSL.EXE in sich,
mit welchem diese Schritte automatisiert durchgeführt werden können.
Das “optionale Windows Feature” kann entweder über die Windows UI,
mit dism.exe oder mit der Powershell
installiert werden.
dism:cmd.exe als Administrator starten unddism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all
eintippen.Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
aus.Systemsteuerung, wählt dann Programme und Features und
klickt links auf Windows Features aktivieren oder deaktivieren.
Im nachfolgend Dialog muss Windows Subsystem für Linux ausgewählt und mit
OK installiert werden.

Server Manager und wählt im Menü Manage
und darunter Add Roles and Features, klickt im Wizard weiter, bis man zu
den Features kommt und wählt dann Windows Subsystem for Linux aus.

Danach muss in jedem Fall Windows neu gestartet werden, womit die Installation abgeschlossen wird. Ab dem nächsten Login ist WSL in Windows integriert und kann mit Linux Distributionen benutzt werden.
In Windows 10/11 findet man Linux Distributionen ganz einfach in der Windows Store App. Man sucht einfach nach “Ubuntu”, “Debian”, “SUSE”, “Alpine” oder “Kali Linux” und lässt den Windows Store die Distribution herunterladen und installieren.
Im Startmenü wird automatisch ein Eintrag angelegt, und wenn dieser das erste
Mal ausgeführt wird, wird die Distribution eingerichtet und der Benutzer
muss noch einen Linux Benutzeraccount benennen und ein Passwort eintragen.
Künftige Starts nutzen dann diesen Account, um die Linux-Shell zu starten.
Mit den späteren Versionen von Windows 10 (21H1+), Windows 11 und Server 2022
ist mit wsl.exe ein Tool vorhanden, das Distributionen aus dem Internet
anzeigen, herunterladen und installieren kann.
Hinweis: wsl.exe war schon in früheren Windows 10 und Server 2019
Varianten enthalten, hatte jedoch in limitierteres Funktionsset. Daher werden
die nachfolgenden Kommandos nicht alle auf diesen älteren Systemen laufen.
wsl --list --onlinewsl.exe benutzt
werden können.Ubuntu-18.04 oder openSUSE-42wsl --install -d DISTRONAMEDISTRONAME. Aktuelle
Installationsbeispiele sind:
Unter Windows Server 2019 fehlen die neuen Features von wsl.exe und es ist
auch keine Store App vorhanden. Um WSL Distributionen nutzen zu können, muss
man die App-Pakete manuell herunterladen, entpacken und ihr Setup ausführen.
Die heruntergeladene .appx Datei ist intern als ZIP
Datei aufgebaut und beinhalt die notwendigen Dateien und ein Setup Programm (.exe).
Man kann also die .appx Datei in eine .zip Datei umbenennen und mit Tools
wie 7-zip entpacken und am Ende die
darin liegende EXE Datei ausführen, die die Distribution installiert.
Das ganze geht aber auch über die Windows Konsole cmd.exe:
Die .exe heißt in jeder Distribution etwas anders, im Falle von OpenSUSE 15
wäre es: openSUSE-Leap-15.2.exe, bei Ubuntu 20.04 wäre es ubuntu2004.exe.
Alternativ kann man die gleichen Schritte auch in der Powershell durchführen:
1 Invoke-WebRequest -Uri https://aka.ms/wslubuntu2004 ` 2 -OutFile Ubuntu-20.04.appx -UseBasicParsing 3 Rename-Item .\Ubuntu-20.04.appx .\Ubuntu-20.04.zip 4 mkdir d:\wsl\ubuntu-20.04 5 Expand-Archive .\Ubuntu-20.04.zip d:\wsl\ubuntu-20.04 6 dir d:\wsl\ubuntu-20.04\*.exe 7 cd d:\wsl\ubuntu-20.04 8 ubuntu2004.exe
Mit der manuellen Installation kann man den Installationsort selbst bestimmen,
während eine Installation über den Windows Store immer in einem Unterordner
von C:\Users\%USERNAME%\AppData\Local\Packages landet.
EXE Datei der Distribution
direkt nutzen, um eine Shell der Linux Distribution zu starten.wsl.exe die
Ausführung anstoßen und auch verscripten.Startet man eine WSL Distribution ohne weitere Parameter, so startet man die
Linux-Shell (für gewöhnlich /bin/bash) des dort eingerichteten Benutzers.
Und von dort aus kann man manuell jedes andere Linux Tool starten, das man
braucht.
Manchmal will man aber einfach nur einen Prozess oder einen Dienst starten. Besonders wenn man einen Ablauf automatisieren möchte oder Windows Scripts nutzt, die ein einzelnes Linux-Kommando ausführen sollen, braucht man eine Möglichkeit, Prozesse ohne die interaktive Shell zu starten.
Hinter dem Kommando wsl.exe -d DISTRONAME kann man das gewünschte Programm
und seine Parameter angeben, z.B.: wsl.exe -d Ubuntu-18.04 ip addr
Will man übliche Shell-Befehle verknüpft nutzen, hilft es, dass Kommando mit
/bin/bash -c abzusetzen.
Ich nutze diese Methode um meine Jekyll-Instanz für den Blog hochzufahren:
wsl.exe -d Ubuntu-18.04 /bin/bash -c "cd /mnt/d/devel/projects/opengate/blog && bundle exec jekyll serve --host 0.0.0.0"
Das in der .appx Datei mitgelieferte Programm, das man zum Einrichten der
Distribution benutzt, kann auch zum Starten einzelner Prozesse genutzt werden.
DISTRO.exe /help gibt meist eine Übersicht über die unterstützten Kommandos
zurück.
Meine eingesetzten Distros erlauben die Ausführung nach dem Schema
DISTRO.exe run "linux_command parameter"
wie z.B.:
openSUSE-Leap-15.2.exe run "ip addr"
oder
ubuntu1804.exe run "cat /etc/os-release"
Mit wsl.exe lassen sich auf neueren Installationen jede Menge weitere
Einstellungen und Aufgaben erledigen.
Parallel dazu existiert das ältere Programm wslconfig.exe
wsl --set-default DISTRONAME oder wslconfig /setdefault DISTRONAMEDISTRONAME zur Standard-Distribution. Ruft man wsl.exe ohne
weitere Parameter auf, wird die so gesetzte Default-Distribution gestartet.wsl --export DISTRONAME archive.tar.tar Archiv, das man auf einem anderen System wieder importen kann.wsl --import DISTRONAME d:\path\to\distro\folder archive.tar.tar exportierte Linux Distribution.wsl --set-version DISTRONAME 1DISTRONAME mit WSL v1 laufen, womit Linux Prozesse auf dem
Windows Host emuliert werden.wsl --set-version DISTRONAME 2DISTRONAME mit WSL v2 laufen, womit die gesamte Linux Umgebung in
einer virtualisierten Umgebung läuft.wsl --set-default-version 1 oder wsl --set-default-version 2wsl --unregister DISTRONAME oder wslconfig /unregister DISTRONAMEDISTRONAME und sein gesamtes Dateisystem.In WSL v1 liegt das Linux-Dateisystem lediglich in Unterordnern des Windows
Hosts.
Kennt man den Windows-Ordner der Distribution, befindet sich darunter ein
LocalState\rootfs Unterverzeichnis, in dem die gesamte Linux Verzeichnisstruktur
abgebildet ist.
Beispiele dafür liegen unter:
C:\Users\%USERNAME%\AppData\Local\Packages\
wie z.B.:
CanonicalGroupLimited.Ubuntu16.04onWindows_79rhkp1fndgsc\LocalState\rootfsCanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfsCanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfsTheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs46932SUSE.openSUSELeap42.2_022rs5jcyhyac\LocalState\rootfs36828agowa338.AlpineWSL_my43bytk1c4nr\LocalState\rootfsUnter WSL v2 liegen die Dateien in virtuellen Datenträger-Dateien (.vhdx).
Man kann jedoch über eine spezielle Netzwerk-Dateifreigabe auf die
Distribution zugreifen:
\\wsl$ fungiert als Host für die laufenden Distributionen, wobei jede
einzelne Distribution und ihre Dateien wie eine Dateifreigabe adressierbar
ist, z.B.: \\wsl$\Ubuntu-18.04\var\log oder \\wsl$\Alpine\etc\os-release.
Innerhalb einer Distribution stehen die Windows Laufwerke als Mount-Point in
/mnt zur Verfügung.
/mnt/c/Windows/System32/ verweist dann auf C:\Windows\System32 und
/mnt/d/path/to/files ist mit D:\path\to\files gleichzusetzen.
Ist eine WSL Distribution für einen bestimmten Anwendungszweck konfiguriert,
kann man sie vollständig in eine .tar Datei exportieren, um sie auf einem
anderen System wieder importieren zu können.
Wie bereits im Abschnitt WSL Konfiguration
erwähnt, helfen hier die Kommandos wsl --export ... und wsl --import ....
Doch beim Import fehlt ein wichtiger Schritt:
Die neu importierte Konfiguration startet immer als
rootBenutzer.
Die Daten des Benutzerkontos sind zwar im Dateisystem vorhanden, wurden dem
neuen WSL Host aber noch nicht kommuniziert.
Leider gibt es aktuell kein Standard-Werkzeug, um dies durchzuführen.
Die interne Funktion WslConfigureDistribution in der Bibliothek wslapi.dll
erlaubt das Festlegen der Linux User ID (UID), doch diese wird nur von den
Installern der Distributionen aufgerufen. Ein entsprechendes
Befehlszeilenkommando wurde noch nicht veröffentlicht.
Wie so oft lässt sich die DefaultUid über die Windows Registry konfigurieren.
Unterhalb des Schlüssels
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss befinden
sich Schlüssel mit GUIDs für jede einzelne WSL Distribution.
Darunter liegen Werte wie:
DistributionName über welchen man den Namen zur Distribution sieht.DefaultUid, welche die UID als DWORD speichert.Fehlt die DefaultUid Einstellung oder hat sie den Wert 0 wird die
Distribution als root gestartet.
Üblicherweise sollte hier der Wert 1000 (oder 0x000003e8) stehen, das ist
in der Regel die ID des ersten erzeugten Benutzeraccounts.
Man kann in der importieren Distribution auch als root per
cat /etc/passwd die Benutzer und der UIDs auflisten und dann den
entsprechenden Wert in die Registry eintragen.
Beim Export und Import von WSL Distributionen wird einfach das gesamte
Dateisystem als .tar Datei gespeichert.
Tatsächlich werden auch alle WSL Distributionen einfach nur als .tar
exportiert, der Installer importiert dann dieses Dateisystem und lässt danach
einige Konfigurationsskripte (wie User anlegen, Defaults setzen) laufen.
Auf diese Weise können wir aus jedem Linux-Dateisystemabbild eine WSL Distribution erstellen.
Mit dem Kommando
docker save -o image.tar docker-image-tag lassen sich Docker Images
ebenfalls als .tar Dateien exportieren.
Diese Docker .tar Archive speichern jedoch mehrere Dateien, aber auch weitere
TAR Archive (ohne .tar Erweiterung), die das root-Dateisystem beinhanlten.
In index.json findet man den Hash, der als Dateinamen im blobs/sha256
Verzeichnis angelegt ist und darin sind die Hashes der Dateisystem-Layer
des Docker Images abgelegt.
Man kann sich die Sache aber auch leichter manchen und einfach die größten
Dateien im blobs/sha256 ansehen. Das sind dann nämlich genau die Layer.
Lädt man sich Basis-Docker-Images herunter
(z.B.: docker pull debian:9-slim), so bestehen diese in der Regel aus
genau einem Layer (also einer großen Hash-TAR Datei).
Mit Tools (wie z.B.: 7zip) lässt sich diese Datei extrahieren und
als .tar abspeichern.
Und genau diese .tar Datei wird dann per wsl --import als neue
Distribution angelegt.
Auf diese Weise können sehr leicht neue Distributionen erstellt werden,
für die es keine offiziellen Images oder Installer gibt.
Fortsetzung folgt…
opengate.at.