Press "Enter" to skip to content

Linux Dienste mit Windows 10 Windows-Subsystem for Linux (WSL) als Service betreiben

Manuel 0

In der Vergangenheit habe ich in der Regel eine virtuelle Maschine genutzt, um Web-Anwendungen zu entwickeln. Da diese in der Regel produktiv auch später auf Linux-Systemen betrieben wurden, machte es Sinn direkt auf dem Zielsystem zu entwickeln um spätere Unverträglichkeiten zu vermeiden.

Das Setup hat aber einige Nachteile. Das fängt damit an, dass man natürlich eine VM betreiben muss die Ressourcen benötigt, man muss entweder direkt mit einer IDE in der VM entwickeln oder aber die Dateien „rausholen“ z.B. über Netzwerkfreigaben aus der VM heraus, was auch sehr umständlich ist.

Entsprechend habe ich von Anfang an schon ein Auge auf die Möglichkeit in Windows 10 gehabt, Linux Anwendungen quasi „native“ direkt zu betreiben mit dem Windows-Subsystem for Linux (WSL). Nachdem es zu Anfang wie zu erwarten noch einige Kinderkrankheiten hatte und nicht wirklich produktiv nutzbar war, hat sich das mittlerweile geändert nachdem WSL den Beta-Status verlassen hat.

Leider fehlen dem WSL noch einige Features, damit es „out of the box“ direkt sinnvoll zur Entwicklung von Software genutzt werden kann. So ist es z.B. so, dass wenn man einen Service (Daemon) gestartet hat, dieser beendet wird sobald die letzte Shell geschlossen wird.

Dankenswerterweise gibt es aber einen Workaround, mit dem man das doch hinbekommt. Ich beschreibe hier einen Weg, wie ich es für mich zum laufen bekommen habe, jeder kann sich das aber natürlich für die eigenen Bedürfnisse anpassen (Grundprinzip sollte ja dann nachvollziehbar sein).

Schritt für Schritt Anleitung

Schritt 1: Notwendige Zusatzsoftware herunterladen

Zuerst muss man unter https://github.com/131/dispatcher/releases die verfügbaren exe-Dateien herunterladen und in einem Order (z.B. C:\Program Files\dispatcher) ablegen.

Schritt 2: Dateien kopieren

Anschließend kopiert man die Datei dispatcher_win_64.exe und benennt die Kopie um in service-bash.exe, das gleiche wiederholt man nochmals und nennt das ganze services-linux-start.exe und das gleiche für services-linux-stop.exe.

Schritt 3: Konfiguration anlegen

Anschließend legt man nun im gleichen Verzeichnis Dateien mit folgendem Inhalt an:

service-bash.exe.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="PATH" value="C:\Windows\System32\bash.exe"/>
    <add key="ARGV0" value="-c"/>
    <add key="ARGV1" value="/bin/bash"/>
    <add key="USE_SHOWWINDOW" value="true"/>
  </appSettings>
</configuration>

services-linux-start.exe.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="PATH" value="C:\Windows\System32\bash.exe"/>
    <add key="ARGV0" value="-c"/>
    <add key="ARGV1" value="sudo /opt/bin/services-start.sh"/>
    <add key="USE_SHOWWINDOW" value="true"/>
  </appSettings>
</configuration>

services-linux-stop.exe.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="PATH" value="C:\Windows\System32\bash.exe"/>
    <add key="ARGV0" value="-c"/>
    <add key="ARGV1" value="sudo /opt/bin/services-stop.sh"/>
    <add key="USE_SHOWWINDOW" value="true"/>
  </appSettings>
</configuration><span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>

Schritt 4: Skripte in der WSL Installation anlegen

Als nächstes öffnet man nun die Bash-Konsole zu der WSL Installation und wechselt dort in das Verzeichnis /opt/bin mit

cd /opt/bin

Wenn das Verzeichnis noch nicht existieren sollte, mit

mkdir -p /opt/bin

einfach anlegen. Als nächstes legt man dort folgende Dateien an:

services-start.sh

#!/bin/bash

mount | awk '{ print $3 }' | grep -w "/var/www/html" >/dev/null 2>&1
if [ "$?" -eq 0 ] ; then
    echo "Already mounted"
else
    mount --bind /mnt/c/Development /var/www/html
fi

service apache2 start
service mysql start

services-stop.sh

#!/bin/bash

umount /var/www/html
service apache2 stop
service mysql stop

Schritt 5: Berechtigungen anpassen

Als nächstes, weiterhin noch in der WSL Shell, öffnet man die Datei /etc/sudoers und fügt am Ende folgende Zeilen hinzu:

mb ALL=(ALL:ALL) NOPASSWD:/opt/bin/services-start.sh
mb ALL=(ALL:ALL) NOPASSWD:/opt/bin/services-stop.sh

Zu beachten ist:

  • Die Datei kann nur mit dem Benutzer root bearbeitet werden. Entsprechend musst du dich mit
    su -

    zum Benutzer root machen.

  • „mb“ ist durch den Benutzernamen zu ersetzen, den Ihr in der WSL Shell verwendet.

Jetzt könnt ihr die geöffnete Shell erst mal schließen.

Erklärung, was hier passiert

So, was genau passiert hier? Die Software, die du heruntergeladen hast, dient dazu, andere Software im Hintergrund auszuführen ohne dass ein Fenster angezeigt wird. D.h. wenn du jetzt die Datei service-bash.exe ausführst, sucht sich die Software die gleichlautende Config-Datei in der dann drin steht, dass die Bash-Shell gestartet werden soll. Die läuft dann im Hintergrund, ohne dass du die siehst – damit hast du also das Problem schon mal ausgehebelt, dass beim Beenden der Shell irgendwelche bereits gestarteten Dienste beendet werden, weil immer ein Bash-Prozess immer im Hintergrund läuft den du nicht versehentlich beenden kannst.

Als nächstes kommen wir zu services-linux-start.exe und services-linux-stop.exe. Diese Dateien rufen jeweils das in der Config genannte Gegenstück auf. Dieses Gegenstück ist dazu da, Apache und mySQL zu starten bzw. zu stoppen. Desweiteren wird im Start-Skript ein Ordner „umgebogen“ für den Apache-Server. D.h. der Ordner C:\Development (/mnt/c/Development) wird auf den Ordner /var/www/html umgemappt, wo der Apache Webserver seine Dateien „serviert“. D.h. legst du unter Windows etwas im Ordner C:\Development ab, kann der Apache-Webserver direkt darauf zugreifen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

This site uses Akismet to reduce spam. Learn how your comment data is processed.