Erfahrung in der Konfiguration und Verwendung von WSL (Linux-Subsystem in Windows 10)

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
 # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac # don't put duplicate lines or lines starting with space in the history. # See bash(1) for more options HISTCONTROL=ignoreboth # append to the history file, don't overwrite it shopt -s histappend # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=1000 HISTFILESIZE=2000 # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. shopt -s checkwinsize # If set, the pattern "**" used in a pathname expansion context will # match all files and zero or more directories and subdirectories. #shopt -s globstar # make less more friendly for non-text input files, see lesspipe(1) [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" # set variable identifying the chroot you work in (used in the prompt below) if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then debian_chroot=$(cat /etc/debian_chroot) fi # set a fancy prompt (non-color, unless we know we "want" color) case "$TERM" in xterm|xterm-color|*-256color) color_prompt=yes;; esac # uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt #force_color_prompt=yes if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then # We have color support; assume it's compliant with Ecma-48 # (ISO/IEC-6429). (Lack of such support is extremely rare, and such # a case would tend to support setf rather than setaf.) color_prompt=yes else color_prompt= fi fi if [ "$color_prompt" = yes ]; then if [[ ${EUID} == 0 ]] ; then PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\h\[\033[01;34m\] \W \$\[\033[00m\] ' else PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;34m\]\w \$\[\033[00m\] ' fi else PS1='${debian_chroot:+($debian_chroot)}\u@\h \w \$ ' fi unset color_prompt force_color_prompt # If this is an xterm set the title to user@host:dir case "$TERM" in xterm*|rxvt*) PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h \w\a\]$PS1" ;; *) ;; esac # enable color support of ls and also add handy aliases if [ -x /usr/bin/dircolors ]; then test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" alias ls='ls --color=auto' #alias dir='dir --color=auto' #alias vdir='vdir --color=auto' alias grep='grep --color=auto' alias fgrep='fgrep --color=auto' alias egrep='egrep --color=auto' fi # colored GCC warnings and errors #export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' # some more ls aliases alias ll='ls -alF' alias la='ls -A' alias l='ls -CF' # Add an "alert" alias for long running commands. Use like so: # sleep 10; alert alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' # Alias definitions. # You may want to put all your additions into a separate file like # ~/.bash_aliases, instead of adding them here directly. # See /usr/share/doc/bash-doc/examples in the bash-doc package. if [ -f ~/.bash_aliases ]; then . ~/.bash_aliases fi # enable programmable completion features (you don't need to enable # this, if it's already enabled in /etc/bash.bashrc and /etc/profile # sources /etc/bash.bashrc). 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 

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:


  1. 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" /> 
  2. 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).


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

Source: https://habr.com/ru/post/de412633/


All Articles