Et si Linux pouvait tourner sur Windows nativement ?

wsl

Le screenshot que vous voyez là, pris sous Windows, ressemble fort à un terminal Linux, et c'est normal parce qu'en réalité c'en est un.

WSL est le diminutif de "Windows Subsystem for Linux" (wiki), une implémentation d'un noyau Linux au sein même de Windows.

Alors certains vont me dire qu'il existe déjà Cygwin/Msys2 qui émule les outils de Linux et la couche POSIX sur Windows, mais c'est là que WSL est très fort: il ne s'agit pas d'une émulation.
En réalité, le travail de Microsoft consiste à faire tourner de façon native les exécutables de Linux (au format ELF) sous Windows.

À quoi ça peut servir ?

Il y a de multiples raisons pour lesquelles avoir un environnement Linux sur Windows pourrait vous servir :

  • Si vous êtes plus à l'aise avec les commandes Linux qu'avec cmd.exe ou Powershell.
  • Si vous utilisez souvent des logiciels venant de Linux (git par exemple)
  • Si vous concevez des logiciels ayant pour vocation d'être portables et que vous souhaitez les tester facilement sur Linux.

Pour ma part, ces trois raisons sont vraies et WSL m'a permis de me débarrasser de ma machine virtuelle Linux et de me faciliter la vie.

Alors évidemment, ne me faites pas dire ce que je n'ai pas dit, WSL n'a pas pour vocation de remplacer Linux, de la même façon que Wine n'a pas pour vocation de remplacer Windows.
Je dirais que ça peut vous servir si vous n'avez pas envie de changer de système d'exploitation mais que vous devez ou avez envie de travailler avec les outils de Linux.

Certains me diront que MSys2 (basé sur Cygwin) fait déjà bien le travail, mais cela ne fonctionne que pour le code source (vous devez recompiler l'application pour Windows) et c'est plus lent que WSL (étant une émulation de POSIX n'ayant pas le luxe de pouvoir travailler en coopération avec le noyau Windows).

Qu'est-ce que WSL est capable de faire ?

Comme je l'ai dit plus haut, WSL vous permet d'exécuter des binaires Linux non-modifiés sous Windows, cependant il s'agit encore d'une technologie en développement depuis peu de temps et qui a son lot de limitations.
Tout d'abord WSL ne fonctionne que sur les systèmes et pour les exécutables 64 bits, ensuite il faut savoir que ça marche surtout pour les programmes consoles ne faisant pas trop d'appels systèmes peu courants, et évitant d'utiliser la carte son ou la carte graphique.
Il faut aussi noter que, bien que l'exécution des binaires Linux ne soit pas émulée, le système de fichier de Linux l'est, rendant les opérations utilisant beaucoup le disque plus lentes.

Git par exemple fonctionne correctement:

Git sur WSL

Vous avez également la possibilité de faire tourner plusieurs distributions simultanément:

Crédits: anandtech.com

Et il est possible d'utiliser la carte son ou la carte graphique, au stade actuel il vous faudra un peu de patience et installer des logiciels sous Windows, par exemple un serveur X pour pouvoir lancer des applications graphiques.

Comme par exemple Firefox:

Firefox tournant sur WSL

Ou glxgears (utilisant OpenGL):

glxgears avec WSL

Il est même possible d'aller jusqu'à faire tourner OpenArena avec plus ou moins de difficulté (notamment au niveau des contrôles).
À savoir que Microsoft prévoit d'autoriser les applications exécutées par WSL à accéder directement au matériel dans le futur, via par exemple OpenCL et CUDA (plus d'info).
Si vous êtes curieux, je vous envoie également vers un article détaillant comment lancer le jeu Quake par le biais de WSL (par ici).

Je termine sur une petite particularité sympathique de WSL; sa capacité à interagir avec les exécutables Windows comme s'il s'agissait d'exécutables Linux.

Vous permettant de faire ceci:

lynix@Frites-PC:~$ ipconfig.exe | grep IPv4 | cut -d: -f2
192.168.1.13

Ou même:

$ ls -la | findstr.exe foo.txt

Et cela fonctionne aussi dans l'autre sens, cmd.exe peut appeler le sous-système Linux et récupérer le résultat de ses commandes.

C:\Users\Lynix>wsl ls -la /proc/cpuinfo
-r--r--r-- 1 root root 0 févr.  5 13:42 /proc/cpuinfo

Si vous voulez plus d'information sur les performances de WSL par rapport à un Linux natif, je vous invite à aller voir du côté de ce benchmark.
Vous pourrez voir que les performances sont extrêmement proches (et parfois supérieures) à un Linux natif, mais s'effondrent dès qu'il s'agit d'opération touchant au disque (dû à l'émulation du système de fichier évoquée plus haut).

Alors tout ça, comment ça fonctionne ?

Dans les grandes lignes, il faut savoir que votre processeur se fiche pas mal du système d'exploitation tournant sur votre ordinateur, et pour cause: votre processeur exécute les mêmes instructions de la même façon dans tous les cas (à quelques exceptions près).
Du coup, il suffit à WSL de décoder les fichiers exécutables utilisés par les systèmes Unix (et pour info, essentiellement tout ce qui n'est pas Windows) au format ELF et d'exécuter le fichier binaire comme si c'était un bon petit .exe traditionnel non ? Pas tout à fait.
Si votre programme se contente d'additionner des chiffres, par exemple:

int add(int a, int b)
{
    return a + b;
}

l'assembleur généré (Clang 5.0 avec -Os) sera le suivant:

add(int, int): # @add(int, int)
  imul edi, esi
  mov eax, edi
  ret

Et là, aucun problème, ça ne dépend en soi que de l'architecture du processeur (ici x86_64) et de la convention d'appel et seule cette dernière change de Windows à Linux (ce qui n'est pas un problème tout de suite car tous les binaires exécutés par WSL sont des binaires Linux et suivent donc la convention d'appel utilisé par ce dernier).

Seulement voilà, les programmes ne passent pas leur temps à faire des calculs dans leur coin, certains font du réseau, ouvrent des fichiers, affichent une interface graphique, etc.
Au final, dans une certaine mesure, tous les programmes font ce que l'on nomme des appels systèmes, et c'est ça la principale difficulté que les ingénieurs de Microsoft doivent surmonter: ils doivent implémenter les appels systèmes Linux par-dessus Windows.

Un exemple de la traduction de l'appel getdents vers NtQueryDirectoryFile
Plus d'informations sur le site de Microsoft.

Le principe derrière Wine est identique jusqu'à ce point, la petite différence étant que le support de WSL s'étend jusque dans le noyau de Windows, là où, à ma connaissance, Wine n'est implémenté que de façon externe au noyau.

Par exemple, les processus créés par WSL ne sont pas des processus Windows traditionnels ("NT"), ils ne chargent pas ntdll.dll, sont créés sans thread principal (WSL se chargeant de ça), ont plusieurs autres subtilités que je ne saurais vous expliquer et sont appelés "Pico process".
Microsoft a également révélé que le noyau Windows était capable de fork (dupliquer) les processus, une feature très Unixienne, et qui est utilisée pour WSL.

WSL est également bien intégré dans Windows, le gestionnaire des tâches montrant les processus (et leur PID) tournant sous WSL:

Le gestionnaire des tâches montrant des processus WSL

Pour plus de détails sur la gestion des processus de WSL, je vous invite à aller lire l'article écrit par les développeurs de Microsoft.

Et de façon plus générale, tout ceci n'est qu'un résumé de ce que vous pouvez trouver sur le devblog de WSL, dont je vous recommande la lecture si le sujet vous intéresse.

Conclusion

WSL est un outil très pratique, l'équivalent fonctionnel tant attendu de Wine sous Windows et un excellent remplaçant de Cygwin, même au stade actuel de son développement.
Je l'utilise dans la vie de tous les jours et ça m'a remplacé mon installation/émulation de Linux (je préfère préciser que je n'ai jamais été un gros utilisateur de Linux sur desktop de toute façon).

Plusieurs personnes pensent que WSL est un concurrent à Linux et je pense qu'elles se trompent, le sous-système Linux de Microsoft est au contraire une espèce d'intégration de Linux au sein de l'environnement Windows, permettant d'utiliser des outils Linux (nativement, je le rappelle) et favorisant leur utilisation par rapport aux outils Microsoft.
Alors bien sûr, il y a des gens dont je fais partie qui ont désinstallé Linux de leur ordinateur au profit de WSL, mais ces gens-là n'ont jamais été de véritables utilisateurs de Linux de toute façon, donc il n'y a pas de mal.

On ne va quand même pas reprocher à un Windowsien d'utiliser les mêmes outils qu'un Linuxien tout de même. ;p

Ainsi se termine mon premier article, un peu brouillon et écrit sur plusieurs semaines mais qui a le mérite d'exister.
Les prochains articles que j'écrirai seront certainement un peu plus consacrés à la programmation ou à un de mes projets (Nazara / Utopia).

Je vous invite à laisser des commentaires sous cet article, si j'ai réussi à les faire fonctionner à l'heure où vous lisez ces lignes. ;o
À la prochaine !