Rechercher

Le développement sous Linux depuis Windows 10 avec WSL 2


25 Octobre 2019 | 9 mins Guillem Canal

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.

wsl1-architecture

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).

wsl2-architecture

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

insider

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

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.

windows-terminal-settings

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 shells
  • schemes 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).

ahk-logo

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…

windows-terminal-rendering-bug

… 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 :

Astuce

Si vous utilisez X410, activez l’option Allow Public Access.

x410-public-access

Astuce

Pour VcXsrv, utilisez l’utilitaire Xlaunch, conservez les options par défaut et choisissez Disable Access Control.

vcxsrv-configuration

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

vscode-remote-wsl

PHPStorm

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.

Auteur(s)

Guillem Canal

Architecte Technique. _Collaboration over competition_ 🖖

Utilisation hors-ligne disponible