WSL2 – la synergie Linux / Windows

Pour une raison que je ne m’explique pas mais que l’on retrouve de plus en plus dans le monde de l’entreprise, nous avons l’interdiction d’installer nos ordinateurs sous Linux.

Ils sont fournis avec un Windows préinstallé, plus ou moins verrouillé (même si c’est illusoire de croire que l’on peut vraiment verrouiller ce type de matériel).

Comme cela pose parfois soucis, notamment dans l’usage de Docker et autres outils bien intéréssants, tel qu’ansible, j’ai voulu avoir un environnement Linux complet.

Ce guide a été rédigé dans ce but.

Installation de WSL2 avec chocolatey

Je ne présente plus chocolatey qui a déjà fait l’object d’un article complet sur ce blog.

choco install wsl2

Installation de Linux sous WSL2

wsl --install -d ubuntu

Installation de XFCE4

On lance wsl en tapant dans une ligne de commande « wsl ».

Puis :

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install xfce4
sudo apt-get install xfce4-goodies

Installation de XRDP

L’astuce pour que ce soit le plus simple et le plus « transparent » possible, c’est d’atteindre votre environnement Linux via RDP. Vous aurez donc un environnement Linux complet sur votre machine avec vos outils préférés (sublime text, etc.).

sudo apt-get install xrdp

On va changer le port par défaut vers le 3390 (pour éviter un conflit avec le 3389, port par défaut du RDP de votre machine Windows) :

sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini

Pensez aussi à modifier /etc/xrdp/startwm.sh :

#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession

# lancement xfce4
/usr/bin/startxfce4

On peut déjà lancer XRDP :

sudo /etc/init.d/xrdp start

Désactivation de la mise en veille

Si vous ne désactivez pas la mise en veille de XFCE, vous vous retrouverez régulièrement avec un écran noir sous votre session RDP.
Pour ce faire, allez dans « Applications / Paramètres / Gestionnaire d’alimentation » et dans l’onglet « Ecran », on désactive purement et simplement la mise en veille :

Script pour lancer votre session RDP Linux sous Windows

Le problème de WSL2, c’est que l’IP change tout le temps. Afin d’éviter de devoir à chaque fois retrouver l’IP pour m’y connecter en RDP, j’ai créé un petit script powershell tout simple :

wsl.exe sudo /etc/init.d/ssh start
$wsl_ip = (wsl hostname -I).trim()
Write-Host "WSL Machine IP: ""$wsl_ip"""
$rdp = $wsl_ip+":3390"
Start-Process "$env:windir\system32\mstsc.exe" -ArgumentList "/v:$rdp"

A noter : il vous faudra modifier le port en fonction, ici c’est 3390

Vous n’avez plus qu’à créer un raccourci sur votre bureau du type :

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "C:\Users\pmietlicki\Documents\rdp_linux.ps1"

Redirection de ports depuis Windows vers Linux

Si vous voulez pouvoir accéder à des services (SSH, RDP), vous pouvez très bien le faire en utilisant cette commande (où 172.19.237.178 est l’adresse IP de votre machine WSL2 que vous aurez récupéré via wsl hostname -I).

Pour RDP :

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3390 connectaddress=172.19.237.178 connectport=3390

Pour SSH :

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=172.19.237.178 connectport=22

Vous pouvez très bien adapter le script powershell du paragraphe précédent pour lancer automatiquement l’ouverture des ports au démarrage de Windows.

Pour lancer un job automatique au démarrage :

$trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:15
Register-ScheduledJob -Trigger $trigger -FilePath C:\route_ssh_to_wsl.ps1 -Name RouteSSHtoWSL

Lancement des applications Windows sous Linux

Comme je ne voulais plus avoir à m’embêter à « switcher » entre Windows et Linux, j’ai eu l’idée de lancer des « remoteapp » RDP depuis Linux (faire du RDP dans du RDP en somme…). Bon on est un peu dans inception mais c’est bien pratique. Evidemment on peut très bien utiliser le même concept depuis un autre ordinateur sous Windows qui fera finalement office de serveur d’applications Windows (dans ce cas autant installer un serveur TSE).

Installation de RDP Wrapper

L’intêret de RDP Wrapper est qu’il va nous permettre d’accéder à des « remoteapp », en somme tous les logiciels que l’on utilise sous Windows que l’on veut rendre accessible sous Linux.

Ce qui est génial, c’est qu’il y a presque tout sous chocolatey :

choco install rdpwrapper

Si vous avez des problèmes avec votre antivirus, il va falloir mettre sous « liste blanche » quelques répertoires et fichiers :

C:\ProgramData\chocolatey\lib\rdpwrapper
C:\Program Files\RDP Wrapper
C:\Program Files\RDP Wrapper\rdpwrapper.dll
%SystemRoot%\System32\termsrv.dll

Si vous avez des soucis concernant rdpwrapper.ini qui ne serait pas compatible avec votre version de Windows, vous pouvez récupérer une version fonctionnelle sur ce site :

https://raw.githubusercontent.com/sebaxakerhtc/rdpwrap.ini/master/rdpwrap.ini

Installation de RemoteApp

C’est là où je souhaitais en venir, remoteapp va vous permettre de tirer partie de RDP Wrapper en empaquetant vos applications préférées via des « remoteapp » :

choco install remoteapp

Enfin, on va créer toutes les applications voulues via l’outil disponible dans C:\tools\RemoteApp\RemoteApp Tool.exe :

L’outil est extrêmement simple et intuitif, il suffit de cliquer sur le « + » pour ajouter l’application que l’on souhaite.

Installation des outils sous Linux

Afin d’accéder facilement aux applications Windows sous Linux, vous pouvez installer rdesktop et xfreerdp :

sudo apt-get install rdesktop
sudo apt-get install freerdp2-x11

A noter : xfreerdp est beaucoup plus récent que rdesktop et contient plus de fonctionnalités. Malheureusement je n’ai pas réussi à faire fonctionner correctement les remoteapp sous celui-ci. Les remoteapp fonctionnent très bien sous rdesktop.

Modification du bashrc

Dans ~/.bashrc, j’ai ajouté les lignes suivantes :

export HOST_IP="$(ip route |awk '/via/{print $3}')"


function remoteapp_func() {
  nohup rdesktop "$HOST_IP" -u user-d DOMAIN -s "||$1" -r sound:local:alsa -r clipboard:CLIPBOARD -g 1920x1080
 -T "$1" -P &
}

function xfreerdp_func() {
  # xfreerdp remoteapp mode is /app:"||word" but not working
  nohup xfreerdp /d:DOMAIN /u:user /v:"$HOST_IP" /microphone:sys:alsa /sound:sys:alsa /cert-ignore /shell:"C:\Users\pmietlicki\AppData\Local\Programs\Alcatel-Lucent Enterprise\Rainbow\Rainbow.exe" /dynamic-resolution /t:"Rainbow"
}

function mount_homedir_func() {
  sudo mount -t cifs //srvstockage.in/homedir/pmietlicki /media/pmietlicki -o vers=2.0,credentials=/home/
pmietlicki/.smbcredentials,file_mode=0777,dir_mode=0777,cache=loose,actimeo=60
}

alias remoteapp=remoteapp_func
alias rainbow=xfreerdp_func


alias mounthomedir=mount_homedir_func

Des options plus complètes existent pour xfreerdp, par exemple on peut récupérer le microphone et le son de la machine locale : /microphone:sys:alsa /sound:sys:alsa

Option similaire sous rdesktop : sound:local:alsa

Pour récupérer le son de la machine distante sous xfreerdp : /audio-mode:1

Ce bashrc me permet de lancer simplement une remoteapp avec la commande suivante :

remoteapp nomappli

Par exemple (si on reprend les applis ajoutées dans remoteapp) :

remoteapp word
Exemple du lancement de Word sous Linux

Astuces

Pour accéder aux dossiers de votre machine Linux depuis Windows, on peut utiliser le point de montage :

\\wsl$

Pour « tuner » les ressources de WSL, vous pouvez créer un fichier « .wslconfig » dans C:\Users\nomutil (par exemple C:\Users\pmietlicki). Le mien a ces options :

[wsl2]
memory=6GB
swap=2GB
processors=2

Guacamole

Cela fera sans doute l’objet d’un autre article à part entière mais en installant un outil comme guacamole (de préférence via l’image docker et guacd afin d’avoir tout le temps la dernière version), on pourra proposer nos « remoteapp » directement en mode Web ! Un projet déjà mis en oeuvre au CHT pour proposer nos applications locales via une authentification sécurisée à double facteur afin d’assurer la continuité des soins sur toute la Nouvelle-Calédonie pendant la période de confinement.