Ubuntu unter Windows ausprobiert

Bis vor ein paar Tagen hätte jeder diese Überschrift für einen Aprilscherz gehalten, aber die Zeiten ändern sich manchmal …

Microsoft auf auf der Entwicklerkonferenz Build 2016 einigermaßen überraschend verraten, dass in zukünftigen Windows-Versionen die bash sowie eine ganze Sammlung von Linux-Tools auf der Basis von Ubuntu 14.04 integriert werden soll. Später soll dieses Angebot auf Ubuntu 16.04 aktualisiert werden. Hier die Links zu den quasi »offiziellen« Ankündigungen:

Es schadet vielleicht nicht, nochmals zu wiederholen, wofür das Linux-Subsystem gedacht ist (und wofür nicht): Microsoft will offensichtlich Entwicklern helfen, die in beiden Welten arbeiten — die also unter Windows Programme entwickeln, aber gleichzeitig Linux-Server-Dienste ausführen möchten oder auch nur einen vernünftigen Werkzeugkasten mit ssh/scp/less/grep/find/sed etc. brauchen.

Das führte bisher meist dazu, dass parallel zu Windows eine virtuelle Linux-Maschine lief. Aber noch eleganter ist es natürlich, wenn diese Werkzeuge direkt unter Windows laufen. Selbst innerhalb von Microsoft kann man eventuell argumentieren, dass ein in Windows integriertes Linux-System im Vergleich zu einer vollwertigen Linux-Installation in einer VM immer noch das kleinere Übel ist.

Das Linux-Subsystem hat keine grafische Benutzeroberfläche, diese ist auch nicht geplant. Insofern richtet sich das Angebot definitiv nicht an Einsteiger. Momentan gibt es offensichtlich keine Absichten, X (oder Wayland oder gar Mir?) ebenfalls in Windows zu integrieren. Aber, so beweglich, wie Microsoft zur Zeit agiert, gilt wohl: Sag niemals nie.

Voraussetzungen

Die Linux-Umgebung ist zwar (bei weitem) noch nicht fertiggestellt, lässt sich aber mittlerweile testen. Eine ausführliche Installationsanleitung gibt es hier:

http://blog.dustinkirkland.com/2016/04/howto-ubuntu-on-windows.html

Die Kurzfassung:

  • Sie brauchen Windows 10 (64 Bit!), wobei es ausreicht wenn das Ding in einer virtuellen Maschine läuft 🙂
  • Sie müssen Mitglied im Insider Preview Programm sein und in Windows den Insider-Modus aktivieren.
  • Sie müssen den Windows-Entwickler-Modus aktivieren (Systemeinstellungen, Modul Update und Sicherheit, Dialogblatt Für Entwickler).
  • Sie müssen für die Insider Previews die »Fast Lane« aktivieren (Systemeinstellungen, Modul Update und Sicherheit, Dialogblatt Windows Update, dann Erweiterte Optionen, schließlich den Regler für die Insider-Stufe ganz nach rechts ziehen).
  • Sie müssen den aktuellen Insider-Build 14316 herunterladen (oder in Zukunft eine neuere Version).
  • Sie müssen das Feature Windows Subsystem for Linux (Beta) aktivieren. Den entsprechenden Dialog finden Sie, wenn Sie im Startmenü nach Windows-Features aktivieren oder deaktivieren suchen.
  • Sie müssen, nochmals im Startmenü, das Programm bash starten. Die bash wird in cmd.exe ausgeführt (igitt!) und fragt beim ersten Start, ob es Ubuntu on Windows aus dem Windows Store herunterladen soll. Ja bitte!

Wie unter Windows üblich, sind im Verlauf dieser Arbeiten zumindest ein halbes Dutzend Neustarts erforderlich.

Aktivierung des »Windows Subsystem für Linux«
Aktivierung des »Windows Subsystem für Linux«
Download von »Ubuntu on Windows, distributed by Canonical«
Download von »Ubuntu on Windows, distributed by Canonical«

Erste Tests

Der Start von bash im Windows-Menü öffnet ein neues, cmd.exe-ähnliches Fenster mit Ubuntu-Logo. Der Prompt ist anders (root@localhost), und auch sonst hat das Fenster mehr Ähnlichkeiten mit einem Linux-Terminal als mit cmd.exe. Sogar die Farbdarstellung funktioniert, z.B. bei grep oder ls.

Erste Erkundungen in der bash
Erste Erkundungen in der bash

dpkg -l zeigt, das standardmäßig beachtliche 437 Ubuntu-Pakete installiert sind, unter anderem:

  • apt
  • bash
  • cron
  • dpkg
  • nano
  • openssh-client und -server
  • openssl
  • perl
  • python (Version 2.7 und 3.4)
  • rsync
  • sed
  • sudo
  • tar
  • upstart
  • vim

Die Paketverwaltung funktioniert wie in Debian/Ubuntu gewohnt, Sie können also problemlos weitere Pakete mit apt-get install installieren. sources.list enthält übrigens die ganz gewöhnlichen Ubuntu-Paketquellen, keine speziellen, für Windows optimierte/kompilierte Pakete!

cat /etc/apt/sources.list
  deb http://archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
  deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
  deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse

Netzwerkfunktionen

Hier gibt es noch große Problem. ping google.at liefert die Fehlermeldung Socket type not supported. ssh meinserver funktioniert problemlos. Die Kommandos ip addr und ifconfig liefern aber wieder Fehler (cannot open netlink socket bzw. cannot open /proc/net/dev).

Zeit

date zeigt die GMT-Zeit an. Es ist aber möglich, die Zeitzone zu ändern:

ln -s -f /usr/share/zoneinfo/Europe/Berlin /etc/localtime

Init-System

Da Ubuntu 14.04 als Basis dient, ist Upstart als Init-System installiert. Es scheint aber momentan nur wenige Funktionen (keine?) zu bieten. ps ax zeigt, dass standardmäßig überhaupt keine Hintergrundprozesse laufen. Die Prozessliste besteht nur aus /init, /bin/bash und ps.

Der Versuch, den installierten ssh-Server zu starten, scheitert:

service ssh start
 initctl: Unable to connect to Upstart: Failed to
 connect to socket /com/ubuntu/upstart: No such file
 or directory

Auch das direkte Ausführen des Init-Scripts führt zu einem Fehler:

/etc/init.d/ssh start
 * /dev/null is not a character device!

Nun habe ich versucht, sshd manuell zu starten — leider weiterhin ohne Erfolg:

dpkg-reconfigure openssh-server
  Creating SSH2 RSA key; this may take some time ...
  Creating SSH2 DSA key; this may take some time ...
  Creating SSH2 ECDSA key; this may take some time ...
  Creating SSH2 ED25519 key; this may take some time ...
  initctl: Unable to connect to Upstart: 
  ...
  /dev/null is not a character device!

/usr/sbin/sshd -D &

sshd läuft jetzt im Hintergrund, lässt sich aber nicht verwenden. (ssh localhost führt zum Fehler Connection closed by 127.0.0.1.) An dieser Stelle habe ich aufgegeben — und auch gleich auf alle Versuche verzichtet, als nächstes Apache einzurichten.

Losgelöst von diesen Detailproblemen ist mir unklar, wie das Linux-Subsystem mit Hintergrunddiensten umgehen wird: Sollen alle Linux-Prozesse mit dem Schließen des bash-Fensters enden? Werden die laufenden Prozesse dann wenigstens ordentlich hinuntergefahren? (Man denke etwa an Datenbank-Server …)

Benutzerverwaltung

Jegliche Arbeit in der bash erfolgt momentan als root. Man hat sich hier an Windows 95 orientiert 😉

Nein, Scherz beiseite, Microsoft weiß, dass hier noch Optimierungsbedarf besteht. Ich habe sogar den Eindruck gewonnen, dass das Fundament schon weitestgehend funktioniert. Es ist kein Problem, mit adduser einen neuen Benutzer einzurichten, mit su -l einen Benutzerwechsel durchzuführen etc.

Nett wäre halt‘, wenn man beim Start der bash Ubuntu-typisch als normaler Benutzer eingeloggt würde und erst später, bei Bedarf, mit sudo root-Rechte erlangen könnte.

Die Linux-Benutzerverwaltung erfolgt vollkommen losgelöst von Windows. Die Daten werden wie üblich in /etc/passwd, /etc/shadow usw. gespeichert. Allerdings ist es anscheinend so, dass der Windows-Account, von dem aus Sie die bash starten, gewissermaßen das Maximum der Rechte limitiert, mit der Sie von Linux aus auf das restliche Windows-System zugreifen können.

Tastatur-, Maus- und Darstellungsprobleme

  • Die bash hat anscheinend manche Einschränkungen von cmd.exe geerbt. Die Navigation des Cursors an den Beginn bzw. das Ende der Zeile mit Strg+A/Strg+E funktioniert nicht. Löschen mit Strg+D funktioniert aber. Auch das Stoppen oder Unterbrechen eines Kommandos mit Strg+C bzw. Strg+Z funktioniert. Strg+L für Clear Screen funktioniert ebenfalls.

  • Die Eingabe von äöüß, des Pipe-Zeichens | sowie der Zeichen [ und } hat in meinen Tests nicht funktioniert. (Testumgebung: Ein Mac mit OS X, Mac-Tastatur, Windows 10 in einer Virtual-Box-Maschine.) Nun ist es natürlich naheliegend, meine Testumgebung für das Eingabeproblem verantwortlich zu machen — in Notepad.exe kann ich all diese Zeichen aber problemlos eingeben. Von dort habe ich mir die Zeichen dann bei Bedarf per Zwischenablage kopiert. Das gelingt wiederum nur per Maus, weil die in Linux-Terminal üblichen Kürzel Shift+Strg+C / Shift+Strg+V offensichtlich nicht unterstützt werden.

  • Markieren und Einfügen mit der mittleren Maustaste geht (natürlich) auch nicht.

  • Das Scrollen nach oben mit less führt zu Darstellungsfehlern. Auch bei einer Veränderung der Fenstergröße geht der Inhalt des Fensters verloren.

Ich habe versucht, die Tastaturkonfiguration selbst zu verändern, aber dpkg-reconfigure keyboard-configuration führte zu einem Fehler. Die manuelle Veränderung von /etc/default/keyboard blieb wirkungslos, möglicherweise wegen des fehlenden Init-Prozesses.

Dateisystem

Wo befindet sich das Linux-Dateisystem aus Windows-Sicht? Wenn Sie im Windows Explorer die Option Geschützte Systemdateien ausblenden deaktivieren (doppelte Verneinungen sind immer schön), dann finden Sie das Linux-Root-Dateisystem sowie weitere Verzeichnisse für /home, /root hier:

C:\Users\<ihr-user-name>\AppData\Local\lxss
Das Linux-Dateisystem befindet sich im AppData-Verzeichnis des Windows-Nutzers
Das Linux-Dateisystem befindet sich im AppData-Verzeichnis des Windows-Nutzers

Um umgekehrt vom Linux-Subsystem auf das Windows-Dateisystem zuzugreifen, verwenden Sie das Verzeichnis /mnt/c. Wie die Verbindung hinter den Kulissen funktioniert, hat sich mir nicht erschlossen. Es gibt für das Verzeichnis keinen mount-Eintrag, auch nicht in /etc/fstab. Es ist auf jeden Fall möglich, von Linux aus auf das Windows-Dateisystem zuzugreifen (auch wenn es vielleicht Einschränkungen gibt, dir mir nicht bewusst sind).

Es ist möglich, in der bash eine Datei zu erzeugen, die auf dem Windows-Desktop sichtbar ist
Es ist möglich, in der bash eine Datei zu erzeugen, die auf dem Windows-Desktop sichtbar ist

bash-completion

Die Vervollständigung von Verzeichnis- und Dateinamen mit Tab funktioniert, die Vervollständigung anderer Begriffe aber nicht (also z.B. man abc<tab>, um alle man-Seiten aufzulisten, die mit abc beginnen).

bash-completion ist standardmäßig installiert, aber offensichtlich nicht richtig konfiguriert. Abhilfe: Laden Sie die Datei /etc/bash.bashrc in einen Editor und entfernen Sie die Kommentarzeichen vor den folgenden, bereits vorhandenen Zeilen:

# enable bash completion in interactive shells
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

Interna

Eines gleich vorweg: Dem Linux-Subsystem fehlt gewissermaßen der wichtigste Bestandteil — der Linux-Kernel. Dennoch verwendet das Linux-Subsystem die ganz gewöhnlichen, für Linux kompilierten Pakete, keine speziell für Windows hergestellten Kompilate! Wie kann das funktionieren?

Microsoft hat (in den Worten von Dustin Kirkland von Canonical) eine Art inverses Wine geschaffen, in dem Linux-Systemfunktionen durch entsprechende Windows-Funktionen ersetzt bzw. emuliert werden. Dieser Code ist ein Kernstück des Linux Subsystems für Windows. Er ist momentan nicht als Open Source verfügbar, und es gibt auch keine konkreten Informationen dazu, ob dies in Zukunft geplant ist.

Ein Mysterium ist (für mich) die Speicher- und Prozessverwaltung. Laut free steht Linux ein GByte RAM zur Verfügung. (Meine virtuelle Maschine hat drei GByte).

free -h
             total       used       free     shared    buffers     cached
Mem:          1.0G       342M       664M         0B         0B         0B
-/+ buffers/cache:       342M       664M
Swap:           0B         0B         0B

Im Windows Task-Manager habe ich aber keine Prozesse gefunden, die auch nur annähernd so viel Speicherplatz beanspruchen.

Generell ist mir unklar, wo zu sehen ist, wieviel Speicher und CPU-Leistung Linux oder auch unter Linux ausgeführte Prozesse beanspruchen. Ich habe probeweise unter Linux sysbench ausgeführt und die (virtuelle) CPU eine Weile voll ausgelastet. Der Task-Manager hat zwar auf der Seite Leistung die volle CPU-Auslastung registriert, aber weder unter Prozesse noch unter Details war ein entsprechender Prozess zu sehen. Innerhalb von Linux funktioniert top übrigens nicht.

Fazit/Kommentar

Im aktuellen Zustand ist das in Windows integrierte Linux-System ein (sehr) interessantes Experiment, aber noch kein brauchbares Produkt. Andererseits ist verblüffend, wie viel schon funktioniert — noch ein paar Monate Arbeit, dann ist ein Linux-Subsystem innerhalb von Windows eine (für ganz bestimmte Szenarien) praxistaugliche Realität.

Die Zielgruppe sind ganz eindeutig nicht Linux-Freaks und -Administratoren — die werden sicher bei ihrem »richtigen« Linux bleiben. Aber für Microsoft-affine Entwickler kann das Linux-Subsystem eine interessante Alternative zu einer virtuellen Linux-Maschine sein.

Interessant ist, dass sich Microsoft gerade für Ubuntu entschieden hat, nicht für Debian oder SUSE oder, was eigentlich am naheliegendsten wäre, für Red Hat. Vielleicht hat das mit Firmenpolitik zu tun. Red Hat ist für Microsoft kommerziell gesehen ein ernst zu nehmender Konkurrent, den man durch eine derartige Kooperation nicht weiter aufwerten möchte. (Oder interpretiere ich hier zu viel?)

Was ist Linux? Kann man »Ubuntu on Windows« überhaupt als »Linux« bezeichnen? Microsoft verwendet unterschiedliche Begriffe, »Ubuntu on Windows«, »Windows Subsystem for Linux«, »bash on Ubuntu on Windows« etc. Besonders häufig war in der Ankündigung bzw. in den Vorträgen interessanterweise von der bash die Rede — ganz so, als wäre die bash der wichtigste Baustein dieses Konglomerat. Persönlich fällt es mir schwer, eine Tool-Box (oder eine »Distribution«?) ohne Linux-Kernel als »Linux« oder auch als »Ubuntu« zu bezeichnen. Mangels besserer Alternativen habe ich hier »Linux-Subsystem für Windows« verwendet.