WSL: Services automatisch starten

Beiträge der WSL Serie

Wir haben im letzten Blog ssh installiert und den Service gestartet.

Wenn wir aber Windows neu gestartet oder WSL mit „wsl -t debian“ beendet haben, dann mussten wir feststellen, dass der ssh Service nicht mehr lief.

WSL startet kein Linux System, wie wir es von vollwertigen Installationen gewohnt sind. Dies kann man auch gut erkennen, wenn wir einmal systemctl aufrufen:

konrad@ZBook15G2:~$ systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
konrad@ZBook15G2:~$

Dies ist sehr ärgerlich, denn davon sind alle Dienste betroffen. Aber wir wollen ggf. ja cron Einträge machen oder oder per ssh zugreifen. Daher müssen wir dafür sorgen, dass die Dienste, die wir brauchen, gestartet werden.

Schritt 1: sudo ohne Passwort aufrufen

Damit wir generell services manipulieren können, ohne dass ein Passwort eingegeben werden muss, tragen wir dies bei sudoers ein:

echo "%sudo   ALL=(ALL) NOPASSWD: /usr/sbin/service *" > /etc/sudoers.d/service

Danach können wir nun den service Befehl mittels sudo aufrufen ohne dass wir unser Passwort eingeben müssen.

Schritt 2: Prüfen, ob ein Service läuft

Nun können wir prüfen, ob ein Service läuft. Den Status von ssh können wir mittels

service ssh status

anzeigen lassen.

In einem Script können wir den Status auswerten und bei Bedarf den Service neu starten:

[ "`service ssh status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service ssh start

Damit wird in der Ausgabe nach „not running“ gesucht um aus dem ganzen Text ein „nok“ zu machen. So das erfolgreich war, wird der Service neu gestartet.

Schritt 3: Script, das alle Services startet, die wir brauchen

In dem Homelaufwerk von meinem User habe ich ein Script services.sh erstellt:

#!/bin/bash
# Start Services if not running

[ "`service ssh status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service ssh start
[ "`service dbus status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service dbus start
[ "`service cron status | sed 's/.*not running.*/nok/'`" == "nok" ] && sudo service cron start

Schritt 4: Automatisches Starten des Scripts

Damit sicher gestellt ist, dass die Services laufen, wenn ich mit dem System arbeite, habe ich:

Autostart

Im Autostart ein Shortcut erstellt, welcher aufruf:

wsl.exe bash ~/services.sh

Dadurch werden alle Services in meinem Windows Subsystem für Linux gestartet, wenn ich mich anmelde.

.bashrc

In meiner .bashrc habe ich den Aufruf ~/services.sh aufgenommen. Somit wird bei jedem Öffnen einer Shell noch einmal geprüft, ob die Services alle laufen.

WSL: Interaktion zwischen den Systemen (II)

Beiträge der WSL Serie

In diesem Beitrag möchte ich etwas auf die Interaktion zwischen Linux und Windows Applikationen auf der jeweiligen Shell / Eingabeaufforderung eingehen.

Starten von Linux Programmen unter Windows

Wenn wir eine Windows Eingabeaufforderung geöffnet haben, dann können Linux Prozesse gestartet werden, in dem vor dem Aufruf ein wsl vorrangestellt wird. Wenn ich z.B. in der Windows Eingabeaufforderung das aktuelle Verzeichnis mittels „ls“ anzeigen lassen möchte, dann kann ich dieses mittels

wsl ls

ausführen.

Wenn sich die Befehlszeile aus mehreren Befehlen zusammen setzt (z.B. getrennt durch das Pipe Zeichen („|“), so kann dies bei jedem Befehl erfolgen. Z.B. über

dir | wsl grep file

Der Windows Befehl „dir“ gibt seine Ausgabe an den Linux Befehl „grep file“, d.h. es wird von grep nach Zeilen mit der Zeichenkette ‚file‘ gesucht.

Starten von Windows Programmen aus Linux

Umgekehrt ist es auch möglich, aus der Linux Shell ein Windows Programm zu starten. Dazu muss der Befehl mit der Endung (z.B. .exe) eingegeben werden:

notepad.exe

Links

WSL: Interaktion zwischen den Systemen (I)

Beiträge der WSL Serie

Nach der Installation des Windows Subsystems für Linux und einer Linux Distribution haben wir nun zwei Systeme. Aber die zwei Systeme sind nicht komplett voneinander getrennt zu sehen, denn Microsoft hat viele Möglichkeiten eingebaut, damit die zwei Systeme miteinander agieren können und Anwender so das Beste aus beiden Welten kombinieren können.

Keine getrennten Systeme!

Eine wichtige Tatsache ist, dass es sich hier nicht um zwei getrennte Systeme handelt, wie es z.B. bei den den üblichen VM wie VirtualBox oder Vmware Workstation der Fall wäre.

Um dies etwas aufzuzeigen, installieren wir einmal ssh unter Linux (Debian):

sudo apt-get install ssh
sudo service ssh start

Sobald der ssh Service unter Debian startet bekommen wir unter Windows das Popup der Firewall: Bei welchen „Netzwerkklassen“ darf auf den Port zugegriffen werden.

Wenn wir unter Windows einen ssh Client haben, dann können wir da auch drauf zugreifen über die ip 127.0.0.1.

Wir können aber auch die IPs vergleichen:

ip address

Wir bekommen die Devices angezeigt und die IPs von Windows (Welche wir uns z.B. mit

ipconfig -all

auf der Eingabeaufforderung anzeigen lassen können).

Zugriff auf Windows Dateien aus der WSL

Wenn wir nun in einer Shell von Debian sind, dann können wir auf die Dateien von unserem Windows System zugreifen. Dazu werden die Laufwerke unter /mnt gemounted.

Somit finden wir unter /mnt/c unser Laufwerk C:

Wir können dies unter Linux prüfen über den Befehl

mount

Dies gibt uns unter anderem aus, wie einzelne Filesysteme eingebunden wurden:

C:\ on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,case=off)

Bei einem System von mir, war hier aber uid und gid 0 statt 1000. Daher hatte nur root Schreibzugriff. Dies kann man über die /etc/wsl.conf steuern:

[autoconf]
options = "metadata,uid=1000,gid=1000"

Hier können wir die Optionen, die der mount Befehl unterstützt, eintragen.

Gemeinsames Home

Derzeit ist es so, dass wir zwei Home Laufwerke haben. Unter Linux finden wir unsere Dateien unter /home/<username>/ und unter Windows haben wir c:\Users\<username>.

Dies können wir aber auch noch anpassen und alle unsere Dateien unter c:\users\<username> legen. Der erste wichtige Schritt ist die Kontrolle, dass unser User die notwendigen Schreibrechte auf /mnt/c hat. Ist dies gegeben, dann können wir unser Unix-Homelaufwer verschieben und statt dessen einen Softlink auf das Windows Verzeichnis einrichten.

In dem folgenden Beispiel habe ich <username> durch konrad ersetzt – mein User unter Linux und Windows ist konrad:

cd /home
sudo mv konrad konrad.old
sudo ln -s /mnt/c/Users/konrad konrad
cp konrad.old/.??* konrad/

Der letzte Befehl kopiert die Dateien, die mit . anfangen, in das Windows Homeverzeichnis. Hier ist vor allem die .bashrc mit Einstellungen für die Linux Shell wichtig.

Sollten bereits weitere Dateien erzeugt worden sein, so sind diese ggf. auch noch zu kopieren.

Zugriff auf Linux Dateien von Windows aus

Nun haben wir unter Linux auf die Windows Dateien zugegriffen. Aber vielleicht wollen wir auch den umgekehrten Fall: Zugriff aus z.B. dem Windows Explorer auf die Dateien des Linux Subsystems.

Dafür hat Microsoft den Share \\wsl$ erzeugt. Wenn man im Windows Explorer in der Adresszeile 

\\wsl$

eingibt, dann werden alle Linux Subsysteme angezeigt. (Bei mir gibt es nur das Debian System, somit wird Debian angezeigt)

Ein Doppelclick zeigt dann den Inhalt des Debian Dateisystems an. Ich kann aber auch immer die Adresse direkt angeben:

\\wsl$\Debian

Damit haben wir nun Zugriff auf alle Dateien sowohl unter Linux als auch unter Windows.

Im nächsten Beitrag „WSL: Interaktion zwischen den Systemen (II)“ werde ich auf die Interaktion zwischen Projekten eingehen.

Windows Subsystem für Linux (WSL)

Beiträge der WSL Serie

Microsoft hat schon eine ganze Zeit lang das Windows Subsystem für Linux (kurz: WSL) unter Windows 10 bereit gestellt so dass dies inzwischen aus dem „Versuchsstadium“ heraus sein sollte.

Unter Windows war ich bisher ein Fan von cygwin, denn ich wollte unter Windows auch die gewohnten Tools nicht missen.

Daher wird es nun für mich Zeit, diese Microsoft Lösung näher anzusehen und eine kleine Serie aufzusetzen, welche die wichtigsten Schritte kurz erläutert und auch mögliche Anwendungsgebiete aufzeigt.

WSL 1 und WSL 2

Das Windows Subsystem für Linux existiert nun schon in der zweiten Version. Microsoft hat hier aus meiner Sicht kräftig nachgebessert, so dass ich auf jeden Fall empfehlen würde, immer gleich auf die WSL 2 gehen.

Voraussetzung für WSL 2 ist Windows 10 in Version (Build) 19041 oder neuer

Installation

Die Installation erfolgt entweder über die GUI:
– Einstellungen Öffnen
– Apps auswählen
– Ganz unten „Programme und Features“ anklicken
– im neuen Fenster dann „Windows Features aktivieren oder deaktivieren“
– Feature „Windows-Subsystem für Linux“ auswählen und Installation starten.

Oder man öffnet einfach eine Eingabeaufforderung oder PowerShell mit Administrator-Rechten und gibt ein:

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

Nach der Installation des Windows Subsystems für Linux müssen wir den Rechner einmal neu starten.

Das blanke Subsystem nützt uns aber erst einmal nichts. Was wir nun noch benötigen ist eine Linux Distribution. Diese können wir einfach über den Microsoft Store installieren. Die gängigsten Distributionen sind verfügbar und als Debian Fan ist meine Wahl direkt auf Debian gefallen.

Nach der Installation können wir uns noch einen Eintrag in dem Startmenü anlegen lassen.

Der ersten Start dauert etwas, da jetzt die Debian Installation weiter konfiguriert wird. Im Rahmen dieser Installation wird der User erstellt, mit dem zukünftig gearbeitet werden kann.

Erster Überblick

Beim Start von Debian öffnet sich ein Fenster und man sieht eine Shell vom angelegten User.

Sudo ist eingerichtet und man kann sich z.B. per

sudo su -

eine root-Shell holen (nach Eingabe des vergebenen Passwortes).

Unter /mnt werden die Windows Laufwerke gemappt, jedoch hat hier nur root Schreibzugriff (Dies passen wir noch im nächsten Beitrag an).

Software

Auf dem System ist noch nicht viel an Software installiert. Je nachdem, was man alles machen will, kann man aber Debian Pakete nachinstallieren. Ein X11 Server steht hier aber erst einmal nicht zur Verfügung, so dass X11 Programme erst einmal nicht zur Verfügung stehen. Wie diese Thematik gelöst werden kann, werde ich in Kürze ebenfalls beleuchten.

Der Zugriff auf die Repositories funktioniert aber ohne Probleme, wie man mit apt-get schnell sehen kann. Eine Aktualisierung des Systems erfolgt über die folgenden zwei Befehle:

sudo apt-get update
sudo apt-get upgrade

Links