Windows Subsystem für Linux


  1. Einführung
    1. WSL 1 und 2
    2. WSL kompatible Distributionen
  2. WSL Installation
    1. Windows Feature aktivieren
    2. WSL Linux Distributionen als Store App nutzen
    3. WSL.EXE einsetzen
    4. Manuelle Installation (Windows Server)
  3. WSL einsetzen
    1. Linux Prozesse starten
    2. WSL Konfiguration
    3. Datei Austausch
  4. Weiterführende Links

Einführung

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.

WSL 1 und 2

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.)

WSL kompatible Distributionen

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 Installation

WSL ist auf einem nackten Windows 10/11 oder Server 2016/2019/2022 nicht aktiviert.
Um WSL nutzen zu können, muss man:

  1. Das WSL Windows Feature im System aktivieren
  2. Eine Linux Distribution herunterladen
  3. Die Linux Distribution im System installieren

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.

Windows Feature aktivieren

Das “optionale Windows Feature” kann entweder über die Windows UI, mit dism.exe oder mit der Powershell installiert werden.

  • Mit dism:
    Einfach cmd.exe als Administrator starten und
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all eintippen.
  • Mit Powershell:
    In der Powershell mit Administrator-Rechten, führt man
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux aus.
  • Windows 10/11 Systemsteuerung:
    Man öffnet die 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. WSL Windows 10
  • Windows Server Manager:
    Am Windows Server nutzt man den 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. WSL Windows 10

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.

WSL Linux Distributionen als Store App nutzen

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.

WSL.EXE einsetzen

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
    Zeigt eine Liste von offiziellen WSL-Images an, die über wsl.exe benutzt werden können.
    z.B.: Ubuntu-18.04 oder openSUSE-42
  • wsl --install -d DISTRONAME
    Installiert eine Distribution mit Namen DISTRONAME. Aktuelle Installationsbeispiele sind:
    1 wsl --install -d Debian
    2 wsl --install -d Ubuntu-16.04
    3 wsl --install -d Ubuntu-18.04
    4 wsl --install -d Ubuntu-20.04
    5 wsl --install -d kali-linux
    6 wsl --install -d openSUSE-42
    7 wsl --install -d SLES-12 
    

Manuelle Installation (Windows Server, älteres Windows 10)

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:

1 curl -L -o opensuseleap15-2.appx https://aka.ms/wsl-opensuseleap15-2
2 mkdir d:\wsl\opensuse-15
3 tar -xf opensuseleap15-2.appx -C d:\wsl\opensuse-15
4 dir d:\wsl\opensuse-15\*.exe
5 cd d:\wsl\opensuse-15
6 openSUSE-Leap-15.2.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.

WSL einsetzen

  • Eine Windows-Store Installation legt Startmenü Einträge an, über welche man eine Distributions-Shell problemlos starten kann.
  • Bei einer manuellen Installation kann man die EXE Datei der Distribution direkt nutzen, um eine Shell der Linux Distribution zu starten.
  • Und wer eine moderen Installation besitzt, kann per wsl.exe die Ausführung anstoßen und auch verscripten.

Linux Prozesse starten

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.

Prozess mit wsl.exe ausführen.

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"

Prozess mit manuell installierter Distribution starten

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"

WSL Konfiguration

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
    macht DISTRONAME zur Standard-Distribution. Ruft man wsl.exe ohne weitere Parameter auf, wird die so gesetzte Default-Distribution gestartet.
  • wsl --export DISTRONAME archive.tar
    exportiert das gesamte Linux-Dateisystem einer Distribution in ein .tar Archiv, das man auf einem anderen System wieder importen kann.
  • wsl --import DISTRONAME d:\path\to\distro\folder archive.tar
    importiert eine als .tar exportierte Linux Distribution.
  • wsl --set-version DISTRONAME 1
    Lässt DISTRONAME mit WSL v1 laufen, womit Linux Prozesse auf dem Windows Host emuliert werden.
  • wsl --set-version DISTRONAME 2
    Lässt 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
    Legt den Standard fest, mit welcher WSL Version neu installierte Linux Distributionen gestartet werden sollen.
  • wsl --unregister DISTRONAME oder wslconfig /unregister DISTRONAME
    Löscht DISTRONAME und sein gesamtes Dateisystem.

Datei Austausch

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…