Ich wurde aufgefordert, diesen Artikel durch eine Frage zum Toaster im Zusammenhang mit WSL zu schreiben. Nachdem ich vor ungefähr sechs Monaten mehrere Jahre lang Systeme auf dem Linux-Kernel verwendet hatte, wechselte ich zu Windows 10 auf einem Heim-PC. Die Abhängigkeit von der Terminal- und Linux-Umgebung in meiner Arbeit führte mich fast sofort zu der Frage: Installieren Sie entweder eine virtuelle Maschine oder versuchen Sie es mit WSL. Ich entschied mich für die zweite und war rundum zufrieden.
Unter der Katze erkläre ich Ihnen, wie Sie WSL installieren und konfigurieren, auf welche Probleme und Einschränkungen ich gestoßen bin, wie Linux-Anwendungen unter Windows ausgeführt werden und umgekehrt sowie wie Sie Xfce-Umgebungselemente in die Windows-Desktopumgebung integrieren.

Ich hätte nie gedacht, dass ich eines Tages wieder auf Windows sein würde, aber eine Kombination von Umständen gab mir einen Grund, es zu versuchen: Meine Frau, die weit von der IT entfernt war, zog fast jedes Mal, wenn sie einen Computer benutzen musste; weckte Nostalgie für ein Spiel, aber sie wollte nicht angemessen unter Wein arbeiten; und dann gaben sie mir eine Windows 10 Pro Box. Ich habe WSL fast unmittelbar nach der Installation des Systems installiert, mehrere Abende herumgespielt und festgestellt, dass das Produkt für meine Aufgaben geeignet ist, aber ich möchte ein vertrauteres Terminal und im Allgemeinen einige Annehmlichkeiten.
Installieren Sie WSL und Distribution
lxrun /install
Sie sofort eine Reservierung vor. Im Internet finden Sie eine Beschreibung der Installation, indem Sie den Befehl lxrun /install
in der Befehlszeile oder in der PowerShell-Konsole lxrun /install
. Diese Methode funktioniert nicht mehr (nach der Veröffentlichung von WSL in einer stabilen Version). Soweit ich weiß, kann WSL jetzt nur zusammen mit Ihrer bevorzugten Distribution aus dem Microsoft Store installiert werden.
Ich stelle außerdem fest, dass bei der Installation die Distributionen OpenSUSE, SUSE Linux Enterprise und Ubuntu 16.04 zur Auswahl standen - die letzte, die ich installiert habe. Ubuntu 18.04, Debian 9 und Kali Linux sind ebenfalls verfügbar, und andere Distributionen werden möglicherweise angezeigt. Die Installationsschritte können variieren. Einige der im Artikel beschriebenen Probleme sind möglicherweise bereits behoben.
Wir finden die gewünschte Distribution im Store und installieren sie. Die Installation ist schnell, da nur der Linux-Kernel-Emulator und das Dienstprogramm zum Starten des Subsystems heruntergeladen werden, das sich in drei Fällen im Systemordner befindet: wsl.exe, bash.exe und ubuntu.exe (anstelle von ubuntu wird der Name Ihres Distributionskits angezeigt). Alle von ihnen sind gleichwertig und tun dasselbe - sie führen ihren eigenen Terminalemulator aus, in dem Linux'ovy Bash unter dem Kernel-Emulator arbeitet. Beim ersten Start werden wir aufgefordert, einen Standardbenutzernamen und ein Standardkennwort für den Benutzer anzugeben. Danach wird die Distribution direkt installiert. Geben Sie als Standardbenutzer root ohne Kennwort an. Dies ist für weitere Schritte erforderlich. Die Sicherheit wird nicht beeinträchtigt. Außerdem habe ich bei der Vorbereitung der Materialien für den Artikel im englischsprachigen Lernprogramm festgestellt, dass neue Versionen von WSL jetzt den Standard-Root-Benutzer ohne Kennwort ohne unnötige Fragen zum Standardbenutzer machen.
Wir warten auf die Installation. Als nächstes müssen Sie zuerst die passenden Spiegel für das nächste aktualisieren. Dazu benötigen Sie einen CLI-Texteditor. Nur vi ist enthalten, aber ich bevorzuge Nano mehr, also sage ich:
apt install nano
sudo ist nicht erforderlich, da wir bereits root sind. Bearbeiten Sie die Datei /etc/apt/sources.list:
nano /etc/apt/sources.list
Yandex-Spiegel funktionieren am besten für mich, daher sieht meine Datei folgendermaßen aus:
deb http://mirror.yandex.ru/ubuntu/ xenial main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial main universe restricted deb http://mirror.yandex.ru/ubuntu/ xenial-security main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial-security main universe restricted deb http://mirror.yandex.ru/ubuntu/ xenial-updates main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial-updates main universe restricted
Drücken Sie zum Speichern Strg + O und zum Beenden Strg + X. Jetzt können Sie das System auf den aktuellen Status aktualisieren:
apt update && apt upgrade
Nach dem Update können Sie unseren Hauptbenutzer erstellen. In diesem Artikel werde ich es user1 nennen, aber Sie können den üblichen Namen angeben:
addgroup --gid 1000 user1 adduser --home /home/user1 --shell /bin/bash --uid 1000 -G user1,sudo user1
Gehen Sie als Nächstes zum Ordner des Benutzers, gehen Sie darunter, legen Sie ein Kennwort fest und bearbeiten Sie die Datei ~ / .bashrc:
cd /home/user1 su user1 passwd nano .bashrc
Meine grundlegende .bashrc sieht so aus Alles, das Subsystem ist einsatzbereit ... fast ...
Installieren von X Server-, Xfce- und anderen GUI-Anwendungen
Das erste Problem, auf das ich gestoßen bin - die Bash-Vervollständigung im vorgeschlagenen Terminalemulator hat funktioniert, um es milde und falsch auszudrücken. Darüber hinaus weiß dieser Emulator nicht, wie Tabulatoren verwendet werden, und jede Instanz davon startet alles in einem neuen Prozessbereich mit einem separaten Init (der übrigens nicht ersetzt werden kann). Ich wollte einen normalen Terminalemulator, einige andere GUI-Anwendungen sowie einen Socket, um alles schnell zu starten.
Als ich diese Frage googelte, stieß ich auf viele Probleme, wie zum Beispiel die Notwendigkeit, dbus in das TCP-Protokoll zu übersetzen. Im Moment gibt es keine derartigen Probleme. Unix-Domain-Sockets funktionieren normal im Subsystem und alles kommuniziert ruhig über sie.
Zunächst benötigen wir einen X-Server, der im Hauptsystem (unter Windows) installiert ist. Persönlich verwende ich VcXsrv für diesen Zweck - den X11-Port unter Windows. Die offizielle Website, die in etwa über das Dienstprogramm selbst angegeben ist, bietet es derzeit nicht an. Daher googeln wir das Installationsprogramm und installieren standardmäßig alles.
Während der Installation kehren wir zum WSL-Terminal zurück. Mit dem Befehl exit kehren wir zum Stammverzeichnis zurück. Konfigurieren Sie zunächst die russischen Gebietsschemas:
locale-gen ru_RU locale-gen ru_RU.UTF-8 update-locale
Installieren Sie als Nächstes einige Xfce-Komponenten. Natürlich können Sie es vollständig aus dem Metapaket installieren, aber wir werden die meisten Komponenten nicht benötigen, und die modulare Architektur von Xfce ermöglicht es uns, nur das Notwendige bereitzustellen:
apt install -y xfce4-session xfce4-notifyd xfce4-appfinder xfce4-panel xfce4-quicklauncher-plugin xfce4-whiskermenu-plugin xfce4-xkb-plugin xfce4-settings xfce4-terminal xfce4-taskmanager mousepad
Es ist nicht sehr praktisch, die Umgebung jedes Mal mit Ihren Händen zu betreiben, daher habe ich diesen Prozess automatisiert. Erstellen Sie dazu im Hauptsystem einen Ordner an einem für uns geeigneten Ort und führen Sie darin 3 Dateien aus:
- config.xlaunch - Einstellungsdatei für VcXsrv
<?xml version="1.0" encoding="UTF-8"?> <XLaunch WindowMode="MultiWindow" ClientMode="NoClient" LocalClient="False" Display="0" LocalProgram="xcalc" RemoteProgram="xterm" RemotePassword="" PrivateKey="" RemoteHost="" RemoteUser="" XDMCPHost="" XDMCPBroadcast="False" XDMCPIndirect="False" Clipboard="True" ClipboardPrimary="True" ExtraParams="" Wgl="True" DisableAC="False" XDMCPTerminate="False" />
x-run.vbs - Die WSL beginnt immer mit ihrem Terminalemulator. Wenn Sie sie schließen, werden alle untergeordneten Prozesse beendet. Damit dieses Fenster keine schwieligen Augen hat, ist es schön, es versteckt laufen zu lassen. Glücklicherweise verfügt Windows über einen integrierten VBScript-Interpreter, mit dem Sie dies in einer Zeile tun können:
WScript.CreateObject("Shell.Application").ShellExecute "wsl", "cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session", "", "open", 0
Lassen Sie mich erklären, was hier passiert. Wir weisen VBscript an, die wsl-Anwendung mit dem cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session
cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session
, der cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session
ist für uns nicht wichtig, also die leere Zeile, die offene Aktion - Start, 0 - versteckter Modus. Wir geben wsl selbst den Befehl zum Ausführen: Gehen Sie zum Benutzerordner und führen Sie mit der Einstellung der Umgebungsvariablen DISPLAY (X-Server-Anzeige) und LANG (verwendetes Gebietsschema) xfce4-session im Auftrag unseres Benutzers user1 aus (dank des Befehls su).
- start.bat - Batch-Datei, die ausgeführt werden soll. Optional können Sie sie starten
start config.xlaunch wscript x-run.vbs
Als nächstes können wir unsere start.bat ausführen und das Xfce-Panel für uns selbst konfigurieren. Ich stelle fest, dass ich hier auf ein weiteres Problem gestoßen bin: Das Bedienfeld wird perfekt über allen Fenstern angezeigt, kann sich jedoch keinen Platz wie ein Bedienfeld auf dem Windows-Desktop zuweisen. Wenn jemand eine Lösung für dieses Problem kennt, teilen Sie in den Kommentaren.
Nun, am Ende dieses Teils ein Screenshot meines Desktops:

Das Zusammenspiel der Windows-Umgebung und der Umgebung des Linux-Subsystems
Sie können Linux-Anwendungen direkt unter Windows mit denselben drei Befehlen ausführen - bash, wsl oder ubuntu. Vergessen Sie nicht, dass der Start standardmäßig von root aus erfolgt. Sie sollten daher die Berechtigungen durch su
verringern. Denken Sie auch daran, die Umgebungsvariable DISPLAY =: 0 zu übergeben, wenn für die Anwendung ein X-Server erforderlich ist. Sie müssen auch den Ordner ändern, aus dem die Anwendung über die CD in der WSL arbeiten soll. Beispiel: Berechnen wir md5 für file.txt auf Datenträger D mit Linux md5sum:
wsl md5sum < d:\file.txt
Der Zugriff auf das Linux-Dateisystem ist ebenfalls verfügbar. Er befindet sich in %localappdata%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
. Sie können Dateien auf diese Weise lesen, aber es ist nicht ratsam, sie zu schreiben. Sie können das Dateisystem beschädigen. Ich denke, das Problem ist, dass Windows nicht mit den Rechten und Eigentümern des Linux-Dateisystems arbeiten kann.
Unter Linux können Sie auch Windows-Anwendungen ausführen. Führen Sie einfach den exe-shnik aus und er wird im Hauptsystem ausgeführt.
Windows-Laufwerke werden in /mnt
entsprechend ihren Kleinbuchstaben gemountet. Beispielsweise wird Laufwerk D in /mnt/d
. Unter Linux können Sie Windows-Dateien frei lesen und schreiben. Sie können Symlinks darauf erstellen. Die Rechte solcher Dateien sind immer 0777 und der Eigentümer ist root.
Der Netzwerkstapel des Subsystems ist bei Windows üblich. Der unter Linux ausgelöste Server ist auf localhost unter Windows verfügbar und umgekehrt. Unix-Domain-Socket für Windows ist jedoch nur eine leere Datei. Sie können damit nur unter Linux arbeiten. Linux hat auch Zugriff auf das externe Netzwerk, einschließlich des Abhörens von Ports, wenn die Firewall dies nicht verbietet.
ifconfig unter Linux und ipconfig unter Windows bieten dieselben Informationen zu Netzwerkschnittstellen.
Über den Windows-Task-Manager können Sie den Prozess innerhalb des Linux-Subsystems sicher beenden. Linux sieht jedoch nur seine Prozesse.
Funktionen, Einschränkungen und Fallstricke
Der Linux-Kernel in der WSL ist nicht real. Dies ist nur eine Emulatorschicht, die ein Teil der Linux-spezifischen Aufgaben selbst ausführt, und ein Teil der Proxys direkt zum winNT-Kernel. Der größte Teil der API ist darin implementiert, aber nicht alle. Sie können Ihren Kernel weder zusammenstellen noch die Kernelmodule (.ko, Kernel Object) verbinden.
Der WSL-Init-Prozess ist auch ein eigener und das Ersetzen durch beispielsweise system.d funktioniert nicht. Ich hatte lange den Wunsch, unterwegs einen Daemon-Manager zu schreiben, der mit system.d-Einheitendateien funktioniert und eine ähnliche Schnittstelle bietet, aber nicht alle Hände erreichen.
OpenFUSE wird nicht unterstützt. Dementsprechend schlägt das Mounten eines virtuellen oder Remote-Dateisystems fehl. Es ist auch unmöglich, Mount aus einer Datei zu machen. Mount scheint nichts anderes zu können, als hier zu binden.
Es gibt auch keine Möglichkeit, ein Linux-Dateisystem in mehrere Partitionen / Festplatten zu partitionieren.
Ein direkter Zugang zu Eisen fehlt praktisch. Trotzdem befinden wir uns in der Windows-Sandbox und nicht unter Linux. / dev und / sys sind merklich leer, sie enthalten nur virtuelle Geräte. Zugriff auf die GPU - nur direkt über den X-Server - in irgendeiner Weise, sodass Sie neuronale Netze in Windows trainieren müssen.
Bei der JS-Entwicklung bin ich auf die Tatsache gestoßen, dass Electron.js sich weigerte, in WSL ausgeführt zu werden. Ich musste die Umgebung von node.js unter Windows duplizieren.
Zusammenfassung
Der Artikel hat sich als ziemlich lang herausgestellt, ich hoffe, dass er auch nützlich sein wird.
Die WSL hat sich für mich persönlich als vollständig verwendbares Tool herausgestellt, das meine Probleme löst Fullstack Backend-Entwickler. Eine virtuelle Maschine mit Linux wurde sechs Monate lang nicht benötigt. Das allgemeine Gefühl ist, dass Windows + WSL viel funktionaler ist als Linux + Wine.
Beim Schreiben eines Artikels stellte ich fest, dass die WSL-Assembly mit Debian 9.3 im Microsoft Store angezeigt wurde. Diese Distribution ist für mich hübscher als Ubuntu, daher werde ich versuchen, sie zu installieren.