Le développement sous Linux depuis Windows 10 avec WSL 2
WSL pour Windows SubSystem Linux, est une solution développée par Microsoft vous permettant de faire tourner différentes distributions Linux sur Windows 10.
Un peu de contexte
Note
Pour plus d’informations sur l’implémentation de WSL 2, une vidéo de présentation et des slides sont disponibles.
WSL premier du nom, est un driver pour Windows implémentant l’API du noyau Linux, qui transforme les appels au noyau en instructions compatibles Windows NT. Ce qui pose de nombreux problèmes de compatibilité notamment avec l’API permettant d’accéder au système de fichiers.
Pour résoudre les différents problèmes de compatibilité, de performances et pour réduire les coûts de maintenance de WSL, la version 2 fait tourner un véritable noyau Linux compilé et maintenu par Microsoft dans Hyper-V (qui est un hyperviseur de type 1).
Activation de WSL 2
À la rédaction de ce guide, pour profiter de WSL2, il vous faudra rejoindre le programme Windows Insider
- Ouvrez les paramètres Windows Insider
- Choisir le type de version d’évaluation “Rapide”
- Ouvir Windows Update
- Cliquer sur “Rechercher les mises à jour” pour télécharger le dernier build
Lancer PowerShell en tant qu’administrateur
- ⊞ Win + R
- Saisir
powershell
- Ctrl + ⇧ Shift + ↵ Entrée
Activer les fonctionnalités optionnelles nécessaires
Enable-WindowsOptionalFeature -Online -NoRestart -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -Online -NoRestart -FeatureName Microsoft-Windows-Subsystem-Linux
Restart-Computer
Important
Votre ordinateur va redémarrer pour activer les fonctionnalités optionnelles de Windows.
Installer une distribution Linux
Vous pouvez obtenir la liste des distribution disponibles ici
Dans ce guide nous allons installer Ubuntu, libre à vous d’expérimenter avec d’autres distributions.
- Installer Ubuntu puis cliquer sur le bouton Lancer (un terminal s’ouvre alors)
- Choisir un nom d’utilisateur et un mot de passe.
- Quitter le terminal
- Dans Powershell, lister les distributions Linux installées
wsl --list --verbose
NAME STATE VERSION
* Ubuntu Stopped 1
Passer Ubuntu en WSL2
wsl --set-version Ubuntu 2
Lancer Ubuntu et se positionner dans le répertoire de l’utilisateur courant.
wsl ~ -d Ubuntu
Installer Docker
Arrivé à cette étape, vous vous trouvez maintenant dans le shell Ubuntu.
Pour installer Docker, nous allons passer par le script d’installation de Docker
# Installation de Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# On ajoute l'utilisateur courant au groupe Docker
sudo usermod -aG docker $USER
# On se reconnecte avec l'utilisateur courant pour appliquer les droits
su - $USER
# On lance le démon Docker
sudo service docker start
# Tester Docker (Ctrl+C pour stopper le conteneur)
docker run --rm -it -p 80:80 containous/whoami
Ouvrir votre navigateur et visiter http://localhost
Note
Les distributions Linux conçues pour tourner dans WSL2 ne sont pas livrées avec des scripts de démarrage tels que System V, Systemd ou encore Upstart. Ce qui veut dire qu’il faudra lancer vous-même le démon docker au démarrage d’Ubuntu via sudo service docker start
.
À savoir
Par défaut Windows arrête les conteneurs Linux au bout de quelques secondes en l’absence de tâches de fond. Si telle est votre intention, pensez à arrêter le démon docker via sudo service docker stop
avant d’éxécuter la commande exit
ou de fermer votre terminal.
Utiliser Systemd
Si vous souhaitez démarrer automatiquement des services au lancement d’Ubuntu, Shayne Sweeney a écrit un guide plutôt complet permettant de lancer Systemd au démarrage d’Ubuntu.
Attention
La section de l’article Access localhost ports from Windows n’est plus nécessaire car la dernière version de WSL 2 le fait déjà.
Info
Dans les grande lignes, l’astuce consiste à remplacer le shell de l’utilisateur root
par un script qui lance systemd et qui vous authentifie sur votre session utilisateur via nsenter
Windows Terminal
Windows Terminal (source) est un terminal moderne, configurable et personnalisable qui centralise PowerShell, Cmd, Azure Cloud Shell et vos shells Linux en une seule application.
Personnalisation
L’application est personnalisable via un fichier .json
. Utilisez Ctrl + , pour y accéder ou utilisez l’interface de l’application.
Le schéma du fichier est décrit via JSON Schema, le lien est consultable via la propriété $schema
. Si vous utilisez VSCode, vous aurez accès à de l’autocomplétion 🎉.
profiles
contient toutes les configurations par défaut de chacun de vos shellsschemes
vous permet de déclarer des thèmes, utilisables par la suite dans le profil de votre shell via la propriétécolorScheme
.keybindings
vous permet de configurer vos raccourcis clavier
Pour plus d’informations sur la personnalisation de Windows Terminal, je vous invite à consulter les articles de Kayla Cinnamon, Program Manager chez Microsoft mais aussi cet article de Scott Hanselman
Info
Des thèmes pour Windows Terminal sont disponibles dans le dépôt Github mbadolato/iTerm2-Color-Schemes. Personnellement, j’utilise le thème Argonaut
pour mon shell Ubuntu.
Copier/Coller
Windows identifie les fins de lignes avec la séquence CRLF \r\n
. Sous Linux, les fins de lignes n’utilisent que le caractère LF \n
.
Pour éviter de vous retrouver avec des doublements de lignes dans Windows Terminal quand vous collez du texte, je vous suggère d’utiliser AutoHotKey, (qui est un utilitaire permettant d’automatiser des tâches sous Windows).
On va commencer par ouvrir le répertoire des scripts lancés au démarrage de Windows :
- ⊞ Win + R
- Saisissez
shell:startup
puis ↵ Entrée - Créez un fichier
copy-paste-on-windows-terminal.ahk
- Éditez-le, et ajoutez le script suivant :
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
; Replace Windows line termination from CRLF to LF while copy/pasting into Windows Terminal
#if WinActive("ahk_exe WindowsTerminal.exe")
RemoveCrlfFromClipBoard() {
Var := Clipboard
Clipboard := RegExReplace(Var, "\r\n?|\n\r?", "`n")
return
}
RButton::
^+v::
RemoveCrlfFromClipBoard()
MouseClick, Right
return
#if
Info
Par défaut, dans Windows Terminal, l’opération coller se fait via 🖱️ Droit ou la combinaison Ctrl + ⇧ Shift + V. Le script les intercepte pour replacer les séquences \r\n
par \n
Bug d’affichage
Windows Terminal étant en “Development Preview”, il existe encore des bugs qui peuvent ruiner votre expérience utilisateur, mais dans l’ensemble, le terminal est plutôt stable et utilisable.
Si vous rencontrez un bug d’affichage rendant l’interface complètement noire en déplaçant la fenêtre sur votre bureau…
… Il suffit de renseigner une largeur initiale pour la fenêtre de 110
via l’option initialCols
. Cela fonctionne aussi avec des valeurs au-delà de 130
🤷 (le mystère reste entier).
Lancer des applications graphiques Linux
Commencez par installer un serveur X pour Windows tel que :
- X410 (payant avec version d’essai),
- ou encore VcXsrv Windows X Server (open-source).
Astuce
Si vous utilisez X410, activez l’option Allow Public Access.
Astuce
Pour VcXsrv, utilisez l’utilitaire Xlaunch, conservez les options par défaut et choisissez Disable Access Control.
Pour finir, ajoutez dans le fichier de configuration de votre shell Linux (ex: .bashrc
, .zshrc
)
# Récupère l'adresse IP permettant d'accèder au server X tournant sur Windows
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2; exit;}'):0.0
Puis lancez une application graphique
apt update && apt install -y mesa-utils && glxgears
Vous pouvez même lancer les applications graphiques depuis Docker 🐳. Jess Frazelle, dans son article Docker Containers on the Desktop aborde en détail la marche à suivre. Son dépôt est disponible ici
# Exemple avec InkScape
docker run --rm -it -e DISPLAY jess/inkscape
Les alias utiles
À ajouter dans votre fichier .bashrc
ou .zshrc
# Rediriger la sortie d'une commande dans le presse-papier Windows
# ex: cat ~/.ssh/id_rsa.pub | copy
alias copy='clip.exe'
# Permet d'ouvrir un fichier, un dossier ou une url dans Windows
alias open="rundll32.exe url.dll,FileProtocolHandler"
# Alias d'`open` pour des raisons de compatibilité
alias xdg-open="open"
Logiciels Windows compatibles avec WSL
Précision
Ceci n’est pas une liste exhaustive, mais de plus en plus de logiciels prévoient le support de WSL 2.
Visual Studio Code
VSCode pour Windows supporte WSL avec le module Remote - WSL
PHPStorm
The 2019.3 Early Access Program gets close to the finish line. But we have something new for you in the fresh build – WSL Support! https://t.co/PgVZbyYoAU pic.twitter.com/wvzdEOrYAo
— JetBrains PhpStorm (@phpstorm) October 25, 2019
L’Early Access 2019.3 de PHPStorm pour Windows ajoute le support de WSL et la fonctionnalité ne tardera pas à rejoindre la version stable de L’IDE.