WSL

WSL auf der Windows-Seite

Commands Insatllation CMD Line
Starten von WSL
wsl.exe [-u user-name]
Starten von WSL als Root z.B. zur Passwortfestlegung

wsl -u root

passwd

Aktuelle Konfiguration mit auslesen
wslconfig /l
Aufheben einer registeirung
wslconfig /u [Distribution Name]
Aktuelle WSL Version ausgeben

wsl --list --verbose

wsl -l -v

Verfügbare Distribution anzeigen

wsl.exe -list --online

wsl.exe -l -o

Distribution installieren
wsl --install -d [Distribution Name]
WSL händisch beenden
wsl --shutdown
WSL händisch beenden
wsl --unregister [Distribution Name]
WSL delault Version setzen (aktuell 1 od. 2)
wsl --set-default-version [num]
WSL Version (1,2) für eine Dstribution setzen (aktuell 1 od. 2)
wsl --set-version [distro-name] [num]
Den Standartbenutzer für den Linuxstart festlegen

[Linunx-Distro][XXXX].exe config --default-user [user]

Bsp.: ubuntu2004.exe config --default-user root

WIN - Netzwerk

Mit netsh per Powerscitpt verschiedene Prots des 'localhost' auf WSL umleiten

und die Friewal für die Ports öffnen

Zu dem Thema unten ein Code-Snippet für ein ps1 Script

Invoke-Expression "netsh interface portproxy add v4tov4 listenport=[$port] connectport= [port] connectaddress= [remote-port]"

Invoke-Expression "netsh advfirewall firewall add rule name=[$port] dir=in action=allow protocol=TCP localport=[$port]";
Über netsh in der PS Information über Ports auslesen
Invoke-Expression "netsh interface portproxy show v4tov4";
Auf der Console mit netsh Information über Ports auslesen
netsh interface portproxy show v4tov4

WSL - Neztzwerk

Um über WSL auf das Netzwerk (Internet und Lan) zuzugreifen sollte der
IpV4-DNS-Server (Standardgateway) in der /etc/resolv.conf unter nameserver
eingeragen werden. Der ist für das lokale Netzwerk überlicher Weise: [192.168.0.1].
Die IP des Standardgateway kann mit win-cmd ipconfig ermittlet werden.
Invoke-Expression "netsh interface portproxy show v4tov4";

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:

# [network]

# generateResolvConf = false

nameserver 192.168.0.1

WSL auf der Linux-Seite

init ist der root Prozess der Wsl-Anwndeung und resultiert in der PID 1 was mit pgrep init abgefragt werden kann.

init ist verantworlich für folgende Dinge

  • Lesen der /etc/wsl.conf
  • Automatiche generierierung der /etc/resolv.conf , wenn es nicht in /etc/wsl.conf mit '[network] generateResolvConf = false' deaktiviert wurde.
  • Auto-mounting aller Windows Laufwerke /mnt/[laufwerk] , so dass sie mit /mnt/c aufgerufen werden können.
  • Bestimmt den aktuellen Benutzer, zunächst über die Abfrage des Parameter [-u] mit dem die wsl.exe augerufen werden kann, dann wird in der /etc/wsl.conf gesucht und in der Windows Registry nach der Benuzerinstanz, Wenn dort nichts gefunden wurde wird der Benutzer [root] gewählt.
  • Den Windows Pfad wird dem Linux Pfad hinzugefügen
  • Setzen WSL spezifischer Umgebeungsvariablen in der Instanz

Beispiel einer /etc/wsl.conf

# Automatically mount Windows drive when the distribution is launched

[automount]

# Set to true will automount fixed drives (C:/ or D:/) with DrvFs under the root directory set above. Set to false means drives won't be mounted automatically, but need to be mounted manually or with fstab.

enabled = true

# Sets the directory where fixed drives will be automatically mounted. This example changes the mount location, so your C-drive would be /c, rather than the default /mnt/c.

root = /


# DrvFs-specific options can be specified.

options = "metadata,uid=1003,gid=1003,umask=077,fmask=11,case=off"


# Sets the `/etc/fstab` file to be processed when a WSL distribution is launched.

mountFsTab = true

 

# Network host settings that enable the DNS server used by WSL 2. This example changes the hostname, sets generateHosts to false, preventing WSL from the default behavior of auto-generating /etc/hosts, and sets generateResolvConf to false, preventing WSL from auto-generating /etc/resolv.conf, so that you can create your own (ie. nameserver 1.1.1.1).

[network]

hostname = [hostname]

generateHosts = false

generateResolvConf = false


 

# Set whether WSL supports interop process like launching Windows apps and adding path variables. Setting these to false will block the launch of Windows processes and block adding $PATH environment variables.

[interop]

enabled = false

appendWindowsPath = false

# Set the user when launching a distribution with WSL.

[user]

default=[user-name]

 

# Set a command to run when a new WSL instance launches. This example starts the Docker container service.


[boot]

command="echo WSL booted at $(/bin/date/ + '%Y-%m-%d %H:%M:%S) >> /home/uli/wsl-boot.log"

Config

wsl.conf editieren
sudo /etc/wsl.conf
In PS WSL - Instanz neu starten
wsl.exe --shutdown
Status der Dienste anzeigen
systemctl list-unit-files --type=service

Mögliche Boot-Einträge
[boot]
Systemdaemon starten
systemd=true
Docker mit Systemstart starten

command = service docker start


Mögliche Einsellugen für das Netzwerk
[network]
Hostnamen ändern
hostname = DemoHost
Automatische generierung des Hostnamen verhindern
generateHosts = false
Automatische generierung der /etc/resolv.conf verhindern
generateResolvConf = false

Snipets

$User = ["username"]
$Password = ["password"] | ConvertTo-SecureString -asPlainText -Force
$MyCredential = New-Object System.Management.Automation.PSCredential($User,$Password)

# Die ganze Sache muss als Admin ausgeführt werden
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments -Credential $MyCredential
Break
}

# Die akuelle IP vom WSL mus rausgefuden werden
$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if ($found) {
$remoteport = $matches[0];
echo "Ip: $found"
echo "Port: $remoteport"
}
else {
Write-Output "IP address could not be found";
exit;
}

# Array mit umzuschreibenden Ports erstellen
$ports = @(80, 8080, 443);
$listener=127.0.0.1

# Die alten Daten löschen
Invoke-Expression "netsh interface portproxy reset";

# ueber das Array iterieren und die abzuhoerenden Ports auf die aktuelle IP setzen
for ($i = 0; $i -lt $ports.length; $i++) {
$port = $ports[$i];
#Invoke-Expression "netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=$port connectport=$port connectaddress=$remoteport";
Invoke-Expression "netsh interface portproxy add v4tov4 listenport=$port connectport=$port connectaddress=$remoteport";
Invoke-Expression "netsh advfirewall firewall add rule name=$port dir=in action=allow protocol=TCP localport=$port";
}

# Invoke-Expression "netsh interface portproxy show v4tov4";