J'ai été invité à écrire cet article par une question sur le grille-pain lié à WSL. Après plusieurs années d'utilisation de systèmes sur le noyau Linux, il y a environ six mois, je suis passé à Windows 10 sur un ordinateur personnel. La dépendance du terminal et de l'environnement Linux dans mon travail m'a presque immédiatement amené à la question: soit installer une machine virtuelle soit essayer WSL. J'ai choisi le second et j'étais complètement satisfait.
Sous le chat, je vais vous dire comment installer et configurer WSL, quels problèmes et limitations j'ai rencontrés, comment exécuter des applications Linux à partir de Windows et vice versa, ainsi que comment intégrer des éléments d'environnement Xfce dans l'environnement de bureau Windows.

Je n'ai jamais pensé que je serais de retour sur Windows un jour, mais une combinaison de circonstances m'a donné une raison d'essayer: ma femme, qui était loin de l'informatique, a tiré presque chaque fois qu'elle avait besoin d'utiliser un ordinateur; réveillé la nostalgie d'un match, mais elle ne voulait pas travailler correctement sous le vin; puis ils m'ont donné un Windows 10 Pro en boîte. J'ai installé WSL presque immédiatement après l'installation du système, joué pendant plusieurs soirées, j'ai réalisé que le produit convenait à mes tâches, mais je veux un terminal plus familier et généralement quelques commodités.
Installer WSL et la distribution
Faites immédiatement une réservation, sur Internet, vous pouvez trouver une description de l'installation en exécutant la commande lxrun /install
sur la ligne de commande ou la console PowerShell. Cette méthode ne fonctionne plus (après la sortie de WSL dans une version stable). Pour autant que je sache, WSL ne peut désormais être installé qu'à partir du Microsoft Store avec votre distribution préférée.
Je note également que lorsque j'ai fait l'installation, les distributions OpenSUSE, SUSE Linux Enterprise et Ubuntu 16.04 étaient disponibles au choix - la dernière que j'ai installée. Ubuntu 18.04, Debian 9 et Kali Linux sont également disponibles maintenant, et d'autres distributions peuvent apparaître. Les étapes d'installation peuvent varier. En outre, certains des problèmes décrits dans l'article peuvent déjà être résolus.
Nous trouvons la distribution souhaitée dans le magasin et l'installons. L'installation sera rapide, car elle ne téléchargera que l'émulateur du noyau Linux et l'utilitaire de lancement du sous-système, qui se trouvera dans le dossier système dans trois cas: wsl.exe, bash.exe et ubuntu.exe (au lieu d'ubuntu, il y aura le nom de votre kit de distribution). Tous sont équivalents et font la même chose - ils exécutent leur propre émulateur de terminal, dans ce bash linux'ovy fonctionnant sous l'émulateur du noyau. Au premier démarrage, il nous sera demandé de fournir un nom d'utilisateur et un mot de passe par défaut pour l'utilisateur, puis la distribution sera installée directement. En tant qu'utilisateur par défaut, spécifiez root sans mot de passe - cela sera nécessaire pour les étapes suivantes. La sécurité ne sera pas affectée, en outre, lors de la préparation du matériel pour l'article, dans le didacticiel en anglais, je suis tombé sur des informations selon lesquelles les nouvelles versions de WSL font désormais l'utilisateur root par défaut sans mot de passe sans poser de questions inutiles.
Nous attendons l'installation. Ensuite, la première chose est de mettre à jour les miroirs apt pour le prochain. Pour ce faire, vous avez besoin d'un éditeur de texte CLI. Seul vi est inclus, mais je préfère nano plus, donc je le mets:
apt install nano
sudo n'est pas requis, car nous sommes déjà root. Modifiez le fichier /etc/apt/sources.list:
nano /etc/apt/sources.list
Les miroirs Yandex fonctionnent le mieux pour moi, donc mon fichier ressemble à ceci:
deb http://mirror.yandex.ru/ubuntu/ xenial main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial main universe restricted deb http://mirror.yandex.ru/ubuntu/ xenial-security main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial-security main universe restricted deb http://mirror.yandex.ru/ubuntu/ xenial-updates main universe restricted deb-src http://mirror.yandex.ru/ubuntu/ xenial-updates main universe restricted
Appuyez sur Ctrl + O pour enregistrer et Ctrl + X pour quitter. Vous pouvez maintenant mettre à jour le système à l'état actuel:
apt update && apt upgrade
Après la mise à jour, vous pouvez créer notre utilisateur principal. Dans cet article, je l'appellerai user1, mais vous pouvez spécifier le nom habituel:
addgroup --gid 1000 user1 adduser --home /home/user1 --shell /bin/bash --uid 1000 -G user1,sudo user1
Ensuite, accédez au dossier de l'utilisateur, accédez-y, définissez un mot de passe et modifiez le fichier ~ / .bashrc:
cd /home/user1 su user1 passwd nano .bashrc
Mon .bashrc de base ressemble à ceci Tout, le sous-système est prêt à l'emploi ... presque ...
Installation de X Server, Xfce et d'autres applications GUI
Le premier problème que j'ai rencontré - l'achèvement de bash dans l'émulateur de terminal proposé a fonctionné, pour le dire légèrement, incorrectement. De plus, cet émulateur ne sait pas comment utiliser les onglets, et chaque instance de celui-ci démarre tout dans un nouvel espace de processus, avec un init séparé (qui, en passant, ne peut pas être remplacé). Je voulais un émulateur de terminal normal, quelques autres applications GUI, ainsi qu'un socket pour démarrer le tout rapidement.
Lorsque j'ai recherché cette question sur Google, je suis tombé sur de nombreux problèmes, tels que la nécessité de traduire dbus en protocole TCP. Pour le moment, il n'y a pas de tels problèmes. Les sockets de domaine Unix fonctionnent normalement dans le sous-système et tout communique calmement à travers eux.
Tout d'abord, nous avons besoin d'un serveur X, en plus, installé dans le système principal (sous Windows). Personnellement, j'utilise VcXsrv à cet effet - le port X11 sous Windows. Le site officiel spécifié dans à propos de l'utilitaire lui-même ne le fournit pas maintenant, donc nous recherchons l'installateur sur Google et installons tout par défaut.
Pendant que l'installation est en cours, nous revenons au terminal WSL, avec la commande exit, nous revenons à root. Tout d'abord, configurez les paramètres régionaux russes:
locale-gen ru_RU locale-gen ru_RU.UTF-8 update-locale
Ensuite, installez certains composants Xfce. Bien sûr, vous pouvez l'installer entièrement à partir du méta-package, mais nous n'aurons pas besoin de la plupart des composants, et l'architecture modulaire de Xfce nous permet de fournir uniquement le nécessaire:
apt install -y xfce4-session xfce4-notifyd xfce4-appfinder xfce4-panel xfce4-quicklauncher-plugin xfce4-whiskermenu-plugin xfce4-xkb-plugin xfce4-settings xfce4-terminal xfce4-taskmanager mousepad
Ce n'est pas très pratique d'exécuter l'environnement avec vos mains à chaque fois, j'ai donc automatisé ce processus. Pour ce faire, dans le système principal, créez un dossier dans un endroit qui nous convient et 3 fichiers à exécuter:
- config.xlaunch - fichier de paramètres pour VcXsrv
<?xml version="1.0" encoding="UTF-8"?> <XLaunch WindowMode="MultiWindow" ClientMode="NoClient" LocalClient="False" Display="0" LocalProgram="xcalc" RemoteProgram="xterm" RemotePassword="" PrivateKey="" RemoteHost="" RemoteUser="" XDMCPHost="" XDMCPBroadcast="False" XDMCPIndirect="False" Clipboard="True" ClipboardPrimary="True" ExtraParams="" Wgl="True" DisableAC="False" XDMCPTerminate="False" />
x-run.vbs - WSL démarre toujours avec son émulateur de terminal; si vous le fermez, tous ses processus enfants se termineront. Pour que cette fenêtre n'ait pas les yeux durs, il est agréable de l'exécuter cachée. Heureusement, Windows a un interpréteur VBScript intégré qui vous permet de le faire en une seule ligne:
WScript.CreateObject("Shell.Application").ShellExecute "wsl", "cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session", "", "open", 0
Permettez-moi d'expliquer ce qui se passe ici. Nous demandons à VBscript d'exécuter l'application wsl avec le cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session
cd /home/user1; DISPLAY=:0 LANG=ru_RU.UTF-8 su user1 -c xfce4-session
, le dossier de démarrage n'est pas important pour nous, donc la ligne vide, l'action d'ouverture - démarrage, 0 - mode caché. Nous donnons à wsl lui-même la commande à exécuter: allez dans le dossier utilisateur, puis avec le réglage des variables d'environnement DISPLAY (affichage X-server) et LANG (locale utilisée), nous exécutons xfce4-session au nom de notre utilisateur user1 (grâce à la commande su)
- start.bat - fichier batch à exécuter, vous pouvez éventuellement le mettre au démarrage
start config.xlaunch wscript x-run.vbs
Ensuite, nous pouvons exécuter notre start.bat et configurer le panneau Xfce pour nous-mêmes. Je note qu'ici, je suis tombé sur un autre problème - le panneau est parfaitement affiché au-dessus de toutes les fenêtres, mais il ne peut pas se attribuer une place comme un panneau sur le bureau Windows. Si quelqu'un connaît une solution à ce problème, partagez les commentaires.
Eh bien, à la fin de cette partie, une capture d'écran de mon bureau:

L'interaction de l'environnement Windows et de l'environnement du sous-système Linux
Vous pouvez exécuter des applications Linux directement à partir de Windows via les mêmes 3 commandes - bash, wsl ou ubuntu. N'oubliez pas que par défaut, le lancement est à partir de la racine, vous devez donc réduire les privilèges via su
, vous devez également vous rappeler de passer la variable d'environnement DISPLAY =: 0 si l'application nécessite un serveur X. Vous devez également modifier le dossier à partir duquel l'application doit fonctionner via cd dans WSL. Exemple, calculons md5 pour file.txt sur le disque D en utilisant le md5sum Linux:
wsl md5sum < d:\file.txt
L'accès au système de fichiers Linux est également disponible, il se trouve dans %localappdata%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs
. Vous pouvez lire les fichiers de cette façon, mais l'écrire n'est pas conseillé; vous pouvez casser le système de fichiers. Je pense que le problème est que Windows ne peut pas travailler avec les droits et les propriétaires du système de fichiers Linux.
Depuis Linux, vous pouvez également exécuter des applications Windows. Exécutez simplement l'exe-shnik et il sera exécuté dans le système principal.
Les lecteurs Windows sont montés dans /mnt
selon leurs lettres minuscules. Par exemple, le lecteur D sera monté dans /mnt/d
. Depuis Linux, vous pouvez librement lire et écrire des fichiers Windows. Vous pouvez créer des liens symboliques dessus. Les droits de ces fichiers seront toujours 0777 et le propriétaire sera root.
La pile réseau du sous-système est courante avec Windows. Le serveur élevé sur Linux sera disponible sur localhost sur Windows et vice versa. Cependant, unix-domain-socket pour Windows ne sera qu'un fichier vide, vous ne pouvez travailler avec cela que sous Linux. Linux a également accès au réseau externe, y compris l'écoute des ports, si le pare-feu ne l'interdit pas.
ifconfig sous Linux et ipconfig sous Windows donnent les mêmes informations sur les interfaces réseau.
À partir du gestionnaire de tâches Windows, vous pouvez battre le processus en toute sécurité à l'intérieur du sous-système Linux. Cependant, Linux ne verra que ses processus.
Caractéristiques, limites et pièges
Le noyau Linux dans WSL n'est pas réel. Il s'agit simplement d'une couche d'émulateur, dont une partie des tâches spécifiques à Linux s'exécute elle-même, et une partie des proxys directement sur le noyau winNT. La plupart des API y sont implémentées, mais pas toutes. Vous ne pourrez pas assembler votre noyau, ni connecter les modules du noyau (.ko, Kernel Object).
Le processus d'initialisation WSL est également le sien et le remplacer, par exemple, par system.d ne fonctionnera pas. J'ai depuis longtemps le désir d'écrire un gestionnaire de démon en marche qui fonctionnerait avec les fichiers d'unité system.d et fournirait une interface similaire, mais toutes les mains n'atteignent pas.
Il n'y a pas de support pour openFUSE; en conséquence, le montage d'un système de fichiers virtuel ou distant échouera. Il est également impossible de faire un montage à partir d'un fichier, le montage ne semble pas être capable de faire autre chose que de se lier ici.
Il n'y a également aucun moyen de partitionner un système de fichiers Linux en plusieurs partitions / disques.
L'accès direct au fer est pratiquement absent. Tout de même, nous sommes dans le bac à sable de Windows, et non en plein Linux. / dev et / sys sont sensiblement vides, ils ne contiennent que des périphériques virtuels. L'accès au GPU - uniquement via le serveur X, directement - de quelque manière que ce soit, vous devrez donc former des réseaux de neurones sous Windows.
Dans le développement JS, j'ai rencontré le fait qu'électron.js refusait de s'exécuter en WSL, j'ai dû dupliquer l'environnement node.js sous Windows.
Résumé
L'article s'est avéré assez long, j'espère qu'il sera également utile.
WSL pour moi s'est avéré être un outil complètement utilisable qui résout mes problèmes fullstack développeur backend. Pendant six mois, une machine virtuelle avec Linux n'a pas été nécessaire. Le sentiment général est que Windows + WSL est beaucoup plus fonctionnel que Linux + Wine.
En écrivant un article, j'ai découvert que l'assembly WSL avec Debian 9.3 est apparu dans le Microsoft Store, cette distribution est plus jolie pour moi qu'Ubuntu, donc je vais essayer de l'installer.