Linux Anwendungen nativ unter Windows 10 ausführen
Erklärung: Windows Subsystem for Linux
Mit der Einführung der Bash Shell unter Windows 10 im Zuge des Anniversary Updates als sogenanntes “Windows Subsystem for Linux” (WSL) und der gleichzeitigen Ankündigung, die PowerShell in ein Open-Source-Lizenzmodell zu überführen, erfüllte Microsoft vielen Profis einen lang gehegten Traum. Unter anderem bedeutete dies nämlich, dass die meisten der für Software-Entwickler und Systemadministratoren imminent wichtigen Tools und Hilfsmittel plötzlich nicht mehr geschlossen proprietär, sondern offen und plattformübergreifend verfügbar waren. Viel wichtiger war jedoch, dass sich Microsoft mit WSL eines der größten Paradigma der IT-Landschaft vorknöpfte: Während fast die gesamte Infrastruktur des Internets unter Linux läuft, dominiert Windows den Enterprise-Markt. Webentwickler kämpften daher schon seit Langem mit den konstanten Sprüngen zwischen den Plattformen und mussten sich nicht selten scheinbar gegenläufige Workflows aneignen. Und genau diese Problematik soll mit Hilfe von WSL angegangen werden. Denn durch die Fähigkeit, ELF64-Ubuntu-Binaries direkt nativ unter Windows innerhalb einer Bash Shell auszuführen, ermöglichen Microsoft und Canonical - die Firma hinter Ubuntu - es Entwicklern, bekannte und weit verbreitete Tools wie apt, ssh, grep, awk, curl, mysql, ruby, perl und viele weitere direkt unter Windows zu verwenden. Doch nicht nur die Verfügbarkeit der Programme selber macht WSL so verlockend, auch die Verfügbarkeit eines reichen Schatzes an Literatur, Expertise und Entwicklern ist Gold wert.
Worin unterscheidet es sich von Cygwin?
Wer tiefer im Thema steckt, dürfte mit Cygwin - einem Tool, das POSIX-API-Kompatibilität unter Windows zur Verfügung stellt - vertraut sein. Damit Anwendungen darin laufen, müssen sie jedoch neu kompiliert werden. Bis zur Ankündigung von WSL war dies tatsächlich der populärste Weg, Linux Anwendungen unter Windows zu nutzen. Anders als Cygwin bedarf es für die Verwendung mit WSL jedoch keiner erneuten Übersetzung der Software - die Binaries können direkt ausgeführt werden.
Ist es besser als Linux als virtuelle Maschine?
Auf alle Fälle. WSL ist weder eine virtuelle Maschine (VM) noch ein Emulator. Streng genommen steckt da noch nicht mal mehr ein Linux Kernel dahinter. Es handelt sich um eine Abstraktionsebene, die Linux Syscalls in Windows Syscalls überführt. Um Dustin Kirkland von Canonical zu zitieren: Ubuntu unter Windows ist “Bit für Bit und Prüfsumme für Prüfsumme die Möglichkeit, Ubuntu-ELF-Binaries direkt unter Windows auszuführen”. Am nächsten kommt es tatsächlich einer Art umgekehrtem Wine.
Was für Vorteile bietet es?
Obwohl WSL speziell für Software-Entwickler designed und konzipiert wurde, profitieren auch Endanwender davon. Selbst unter Windows 10 Home steht WSL zur Verfügung, es kann also tatsächlich von allen Windows-10-Anwendern genutzt werden. WSL ist ideal geeignet, um in Linux hineinzuschnuppern, ohne direkt eine vollständige Distribution in einer virtuellen Maschine oder einer separaten Partition installieren zu müssen. Außerdem gibt es unter Linux eine Vielzahl äußerst interessanter kostenloser Anwendungen für den Bildungsbereich, den akademischen Sektor und die Forschung. Mit jeder neuen Windows Version steigt die Kompatibilität von WSL zu der vorhandenen Linux Software weiter an.
Gibt es Einschränkungen?
Ja, die gibt es natürlich. Zum einen benötigt WSL einen 64-bit-Prozessor und läuft nicht auf 32-bit-Systemen. Auch die Linux Anwendungen, die innerhalb der Bash Shell installiert und ausgeführt werden können, sind 64-bit-Binaries. WSL ist primär als Kommandozeilen-Werkzeug für Profis gedacht, daher gibt es auch keinen offiziellen Support für grafische Oberflächen oder Multimedia-Anwendungen. Weitere Einschränkungen:
- WSL hat keinen Zugriff auf die GPU. Das bedeutet konkret, dass weder CUDA noch OpenCL Frameworks unterstützt werden. Allerdings gibt es mittlerweile die Möglichkeit, Anwendungen mit grafischer Oberfläche oder Multimedia-Applikationen zum Laufen zu bringen, indem die Grafikausgabe via Netzwerk und TCP/IP von Linux zu Windows getunnelt wird. Wie gut dies funktioniert, hängt allerdings immer vom Einzelfall ab.
- I/O-Zugriffe sind verglichen mit einer Linux VM ziemlich langsam.
- Da es sich nicht um einen echten Linux Kernel handelt, können Anwendungen, die direkten Zugriff auf den Linux Kernel benötigen, nicht ausgeführt werden. Dies gilt zum Beispiel für Hypervisor wie VirtualBox. Auch sind derzeit noch nicht alle Linux Syscalls vollständig übersetzt und überführt.
- Ein Server/Hintergrunddienst kann aus der Bash unter Windows nicht gestartet werden.
- Die Auswahl an verfügbaren Linux Distributionen im Windows Store ist zwar gering, die Community hat allerdings natürlich mittlerweile Mittel und Wege gefunden, so ziemlich jede Geschmacksrichtung von Linux unter WSL zum Laufen zu bringen (Arch Linux gefälligst?)
Nach diesem Grundlagenkurs in WSL wird es Zeit, den Praxis-Teil anzugehen.
1. Schritt: Developer Mode und WSL aktivieren
Bevor wir uns an cowsay im Terminal wagen, müssen zunächst ein paar grundlegende Einstellungen und Installationen erfolgen. Zunächst muss in den Einstellungen unter Update und Sicherheit und für Entwickler der Entwicklermodus aktiviert werden. Falls dieser noch nie zuvor aktiv war. kann es durchaus einen kurzen Moment dauern, um diesen Schritt abzuschließen. Anschließend benötigen wir die Funktion Windows Features aktivieren oder deaktivieren, wofür unter Umständen Administratorrechte benötigt werden, und haken weiter unten in der Liste das Windows Subsystem for Linux an. Anschließend folgt ein Neustart, um die Änderungen zu übernehmen.
2. Schritt: Ubuntu installieren
Die Shell kann anschließend mittels Eingabe von bash in der Suchbox gestartet werden, um die Installation von Ubuntu zu initiieren. Wie genau diese abläuft, hängt von der installierten Windows Version ab. Bei Versionen älter als 1709 (Fall Creators Update) muss die Nachfrage im sich öffnenden Fenster einfach nur mit “y” bestätigt werden (nicht vergessen: WSL ist unter Windows 10 älter als 1709 noch immer als Beta gekennzeichnet). Im Fall Creators Update stehen hingegen mehrere Distributionen zur Auswahl. Über den Microsoft Store können Ubuntu, openSUSE Leap 42 oder SUSE Linux Enterprise Server 42 installiert werden. Weitere Distributionen können mittels einfacher Hacks ebenfalls zur Mitarbeit mit WSL überredet werden. Für dieses Tutorial verwenden wir Ubuntu 16.04 LTS.
3. Schritt: Standard UNIX-Benutzer anlegen
Einmal installiert fordert Ubuntu zum Anlegen eines Standard-UNIX-Benutzers auf. Dies wird der Benutzer sein, unter dem Ubuntu künftig standardmäßig hochkommt und sich anmeldet. Natürlich gibt es auch die Möglichkeit, mehrere Benutzer anzulegen oder direkt als root zu arbeiten. Nach Eingabe eines Benutzernamens und eines Passworts (2x) wird der UNIX-Benutzer angelegt. Unter diesem Benutzer können nun sudo-Befehle ausgeführt werden. Weiterhin gibt es auch einen root-Benutzer der vollständigen Zugriff auf alles hat; für die alltägliche Benutzung raten wir jedoch aus Sicherheitsgründen davon ab. Einige Installationen melden sich standardmäßig als root an - in diesen Fällen ist es dringend angeraten, mittels adduser <benutzername> manuell einen neuen Benutzer anzulegen. Ob man als root unterwegs ist oder nicht, lässt sich an dem die Kommandozeile abschließenden Zeichen erkennen: # steht für root, während normale Benutzer mit $ terminieren.
4. Schritt: Ubuntu Pakete aktualisieren
Nach der Anlage des Benutzers ist es hilfreich, die installierten Pakete zunächst auf den neuesten Stand zu bringen. Mittels sudo apt-get update wird die Liste der verfügbaren Anwendungen und Pakete aktualisiert, die eigentliche Installation erfolgt dann mit sudo apt-get upgrade. Dieser Vorgang kann je nach Menge und verfügbarer Bandbreite der Intenetleitung durchaus einige Zeit in Anspruch nehmen. Wird dieser Schritt übersprungen, kann es unter Umständen zu Problemen bei der Installation zusätzlicher Software aus den Ubuntu-Repositories kommen. Auch ist es sicherlich sinnvoll, regelmäßig auf Aktualisierungen zu prüfen. Mit Hilfe von sudo apt-get dist-upgrade ist der Kernel aktualisierbar, allerdings ist dies in diesem Falle eher unkritisch.
5. Schritt: Los geht’s!
Jetzt, da Ubuntu installiert und aktualisiert ist, können die diversen Bash Kommandos ausprobiert und damit experimentiert werden wie z. B. ls (Inhalt eines Verzeichnisses anzeigen) oder pwd (aktuelles Verzeichnis anzeigen). Auch Anwendungen wie vi - ein Standard-Texteditor unter Linux - können mittels Eingabe von vim gestartet werden.
Tipp: Bash Kommandos können auch direkt aus dem Befehl ausführenden Eingabefenster heraus ausgeführt werden. Um beispielsweise vi direkt aus Windows heraus zu öffnen, gibt man in der Eingabebox bash -c "vi" ein. Dadurch öffnet sich ein neues Fenster mit einer Bash-Konsole, die direkt den Editor vi startet.
In bester Linux Manier können auch externe Verzeichnisse eingebunden (Fachbegriff: gemountet) werden. Mit WSL können beispielsweise Windows Verzeichnisse in der Bash gemountet und durchsucht werden. Um also auf den Inhalt des bereits gemounteten Laufwerks C: zuzugreifen, genügen die Befehle cd /mnt/c und anschließend ls, um den Inhalt anzuzeigen. Benötigen Dateien für den Zugriff Administratorrechte, reicht es nicht aus, diese mittels sudo zu gewähren. Stattdessen muss die Bash mit Administratorrechten gestartet werden analog zum Start der Eingabeaufforderung mit Administratorrechten.
6. Schritt: Erstellen und Ausführen von Bash Skripten
Der größte Vorteil einer Kommandozeile ist die Verfügbarkeit von Skripten. Da es sich bei WSL primär um eine Umgebung für Entwickler handelt, unterstützt es selbstverständlich Skripte innerhalb der Bash Shell. Diese können entweder unter Windows erstellt und anschließend über gemountete Ordner und/oder Laufwerke unter Linux ausgeführt oder sinnigerweise direkt unter Linux kreiert werden. Da die Zeilenterminierung (EOL) unter Linux anders erfolgt als unter Windows, gibt es deutlich weniger Probleme, wenn direkt unter Linux gearbeitet wird. Schauen wir uns also ein einfaches Hello-World!-Skript an, das wir mit Hilfe des Texteditors nano erstellen. In der Kommandozeile geben wir zunächst den Befehl nano ~/helloworld.sh ein. Damit wird der Texteditor nano geöffnet und die Datei helloworld.sh in unserem Home-Verzeichnis, welches unter Linux durch das Zeichen ~ repräsentiert wird, erstellt.
Im Editor werden anschließend folgende Zeilen eingegeben:
#!/bin/bash
# Zuweisung eines Strings an einer Variable
STRING="Hello World!"
# Ausgabe der Zeichenkette auf dem Bildschirm
echo $STRING
Mit STRG-O wird die Datei gespeichert, mit STRG-X der Editor anschließend beendet.
Ein paar kurze Erklärungen zu diesem Skript: Jedes Skript fängt immer mit dem sogenannten Shebang (#!) an, gefolgt von dem für die folgenden Befehle zu verwendenden Interpreter. Falls ein anderer Interpreter zum Einsatz kommen soll, um den Inhalt des Skripts auszuführen, wird dieser samt vollständigem Pfad an dieser Stelle übergeben. Ein #-Zeichen kennzeichnet einen Kommentar. Diese Zeile wird nicht ausgeführt, sondern dient nur der Dokumentation und Verständlichkeit eines Programms. Variablen können Werte zugewiesen werden, in unserem Beispiel heißt die Variable STRING. Der echo-Befehl gibt anschließend den Inhalt der Variable STRING auf den Bildschirm aus.
Höchste Zeit also, unser soeben erstelltes Programm auszuführen. Aus Sicherheitsgründen erlaubt die Bash nicht die direkte Ausführung beliebiger Dateien. Damit dies funktioniert, müssen diese explizit als ausführbar markiert sein. Um unser Skript als ausführbar zu markieren, müssen wir seine Attribute ändern, was mittels des Programms chmod erfolgt: chmod +x ~/helloworld.sh ergänzt unser soeben erstelltes Skript um das Attribut x, welches die Ausführbarkeit (executable) definiert. Um das Skript letztendlich auszuführen, muss es mit absolutem oder relativem Pfad aufgerufen werden: ~/helloworld.sh oder, falls man gerade ohnehin in ~ steht, ./helloworld.sh.
7. Schritt: Grafikausgabe in WSL
Ursprünglich war WSL lediglich als Kommandozeilenumgebung zur Anbindung der Linux-Entwickler-Toolchain an Windows gedacht. Trotzdem gibt es Mittel und Wege, auch grafische Anwendungen direkt aus der Bash heraus zu starten. Klassischerweise übernimmt unter Linux ein sogenannter X-Server die Grafikausgabe. Da WSL keinen solchen X-Server mitbringt, müssen wir diesen also zunächst unter Windows installieren und anschließend die Grafikausgabe durchtunneln. Zunächst benötigen wir einen X-Server für Windows, z. B. Xming oder VcXsrv. Xming ist zwar etwas älter, jedoch deutlich kleiner und leichtgewichtiger. Beide sind für unsere Zwecke geeignet, für dieses Tutorial greifen wir auf VcXsrv zurück. Nach der Installation kann der X-Server wie unter Windows gewohnt über das Startmenü gestartet werden und nistet sich nach dem Start als X-Icon in der Taskbar von Windows ein. Als Test starten wir im Folgenden das Programm gvim unter Linux - ein vi-Editor mit grafischer Oberfläche.
In der Kommandozeile müssen wir den Editor zunächst mittels sudo apt-get install vim-gtk installieren. Anschließend muss die Grafikausgabe umgeleitet werden, damit der zuvor installierte X-Server als Ziel verwendet wird. Dies geschieht durch Eingabe des Befehls export DISPLAY=:0. Zuletzt sollte nach Eingabe von gvim der grafische Editor auf dem Bildschirm erscheinen. Glückwunsch, wir haben soeben eine Anwendung mit Grafikausgabe unter WSL ausgeführt.
Anmerkung: Der export-DISPLAY-Befehl ist immer nur für die jeweilige Sitzung gültig und muss jedes Mal beim Start der Bash erneut eingegeben werden. Auch kann es vorkommen, dass einzelne Programme mit der getunnelten Grafikausgabe Probleme haben.
Versuchen wir etwas Komplexeres wie zum Beispiel die Ausführung des Ubuntu eigenen Paketverwaltungs-Tools zur grafischen Installation von Software Synaptic. Hierzu geben wir auf der Befehlszeile zunächst den Befehl sudo apt-get install synaptic ein, um die Software zu installieren. Aufgerufen wird es anschließend durch die Eingabe von sudo sypantic. Einmal gestartet, steht uns eine grafische Oberfläche zur Installation von Anwendungen zur Verfügung - wie wär’s mit Firefox? Einfach in der Suchbox firefox eingeben und in der Ergebnisliste den Firefox Browser auswählen. Da der Browser weitere Abhängigkeiten nach sich zieht, werden diese zusätzlich angezeigt und müssen bestätigt werden. Im Dialogfenster starten wir zum Schluss noch die Installation, wodurch im Hintergrund das Herunterladen und der eigentliche Installationsvorgang initiiert werden. Einmal abgeschlossen, kann der Firefox Browser mittels Eingabe von firefox auf der Kommandozeile gestartet werden.
Fazit
Was wir hier bisher gemacht und gezeigt haben, kratzt natürlich gerade mal so an der Oberfläche von WSL. Hinter Linux steckt eine gewaltige Community, die sich gierig auf die neuen Möglichkeiten von WSL auf Windows 10 gestürzt hat. Endlich besteht nicht mehr die Notwendigkeit, multiple VMs auszuführen, um Software zu testen oder gar die Festplatte zu partitionieren, um Linux nativ zu installieren. WSL ist ein hervorragender Weg, all dies zu umschiffen und hilft vor allem all jenen, die Linux kennenlernen wollen, ohne ihre gewohnte Windows Umgebung direkt über Bord werfen zu müssen. Wenngleich einige der hier gezeigten Tricks, wie zum Beispiel die Ausführung von Anwendungen mit Grafikausgabe, nicht offiziell unterstützt sind und gelegentlich Probleme bereiten können, sind Workflows auf der Kommandozeile in WSL vollständig abgebildet und fast unschlagbar. Auch wird WSL mit jeder neuen Version von Windows 10 beständig weiterentwickelt, wir erwarten also auf Anwenderwünschen basierende neue Features in zukünftigen Iterationen von Windows 10. Für das kommende Redstone-4-Update stehen beispielsweise erweiterte Konfigurationsmöglichkeiten, bessere Interaktion zwischen Windows- und Linux Anwendungen und eine Beachtung von Groß- und Kleinschreibung bei Dateisystemoperationen im Pflichtenheft.
Einer der großen Vorteile von WSL ist die Möglichkeit, nicht nur grafische Anwendungen auszuführen, sondern eine komplette Desktop-Umgebung wie XFCE, LXDE oder sogar Unity zu starten. Und jetzt, da Windows 10 auch native Unterstützung für virtuelle Desktops bietet, steht einem Windows Desktop auf dem einen und einem LinuxDesktop auf einem zweiten virtuellen Bildschirm, zwischen denen per Tastenkombination gewechselt werden kann, theoretisch nichts mehr im Wege. Desktop-Umgebungen sind auch noch lange nicht das Ende der Fahnenstange - wie wäre es mit Multimedia-Anwendungen? Dieser Frage werden wir in einem separaten Artikel nachgehen. Für heute lassen wir es gut sein und sind gespannt auf eure Kommentare und Erfahrungen.