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 --online
wsl.exe
benutzt
werden können.Ubuntu-18.04
oder openSUSE-42
wsl --install -d DISTRONAME
DISTRONAME
. 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 DISTRONAME
DISTRONAME
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 1
DISTRONAME
mit WSL v1 laufen, womit Linux Prozesse auf dem
Windows Host emuliert werden.wsl --set-version DISTRONAME 2
DISTRONAME
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 2
wsl --unregister DISTRONAME
oder wslconfig /unregister DISTRONAME
DISTRONAME
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\rootfs
CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState\rootfs
CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs
TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalState\rootfs
46932SUSE.openSUSELeap42.2_022rs5jcyhyac\LocalState\rootfs
36828agowa338.AlpineWSL_my43bytk1c4nr\LocalState\rootfs
Unter 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.
Fortsetzung folgt…
opengate.at
.