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.
Table of Contents
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
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.