Windows Subsystem for Linux
WSL2 avec LXC
Conditions préalables
À présent, pour ceux qui lisent le blog, vous devriez connaître l’exercice.
Voici les prérequis pour suivre cet article de blog :
- Système d’exploitation: Windows 10 Insider Slow - la version utilisée est 19042
WSL2 activé WSL pour windows serveur
- Pour installer les distributions en tant que WSL2 par défaut, une fois WSL2 installé, exécutez la commande dans Powershell
wsl.exe --set-default-version 2
WSL2 Ubuntu distro installé à partir du Windows Store - la distribution utilisée est Ubuntu-18.04
[Facultatif] Terminal Microsoft installé à partir du Windows Store
- Ouvrez le magasin Windows et tapez « Terminal » dans la recherche, ce sera (normalement) la première option

LXD : mise en route
Avant de pouvoir commencer à jouer avec LXD, nous devons le démarrer et exécuter la configuration initiale.
Et, heureusement pour nous, les distributions Store ont déjà LXD intégré, ce qui nous permet de rester dans un environnement « vanille ».
Assez de théorie, sautons dans notre coquille:
# Run the LXD init setup > we should get an error
sudo lxd init
# Start the LXD service
sudo service lxd start
# [Optional] start the service when the distro starts
sudo update-rc.d lxd enable
# Check if the LXD network interface already exists > needed for the init setup
ifconfig lxdbr0
# Run again the LXD init setup
sudo lxd init
# Keep all the default values except for the nework if it already exists

Une fois que tout a été configuré, essayons de nous connecter à notre nouveau service LXD:
# List all created containers > this will result with an error
lxc list
# List all created containers with sudo
sudo lxc list
# To avoid using sudo all the time, let's add our user to the lxd group
sudo usermod -aG lxd $USER

Quittez la session en cours et ouvrez-en une nouvelle :

Nous sommes maintenant prêts à passer à l’étape suivante et à créer notre premier conteneur.
LXC : conteneurs sans Docker
Nous pouvons enfin commencer et le but est simple: créer un conteneur, le configurer « WSL2 way » et l’importer en tant que nouvelle distribution.
Cela nous permettra de préconfigurer la distribution, donc une fois que nous l’avons importée, nous pouvons commencer à travailler avec tout de suite.
Un autre point (important ?) est que, du moins pour moi qui aime tester de nouvelles distributions WSL2, nous pouvons automatiser plusieurs étapes répétitives entre les distributions (création d’utilisateur, fichier wsl.conf, etc...).
Ok, nous sommes prêts, alors plongeons-nous:
# List the images available for Funtoo distro
lxc image list images:funtoo
# Create a new container based on the Funtoo distro
lxc launch images:funtoo/1.3
# Check if the container has been correctly created
lxc list

Astuce: pendant que nous prenions la distribution Funtoo, si vous avez besoin de voir toutes les images disponibles, exécutez
lxc image list images:
Le conteneur est créé, alors personnalisons-le.
Il y a deux façons d’effectuer cette tâche : soit « en externe » en exécutant toutes les commandes à partir du shell hôte : soit, ce que nous suivrons pour ce blog, « en interne » en basculant vers le shell dans le conteneur :lxc exec wslconf -- <command>
# Start a shell inside the container
lxc exec <container name> bash
# Check the user logged in > should be root
id
# Create a new user
useradd -m -s /bin/bash <username>
# Change the password for the new user
passwd <username>
# [Optional] Change the password for the root user
passwd

Avant de pouvoir installer de nouveaux paquets, nous devons mettre à jour la liste des dépôts (pensez):apt update

Maintenant que la liste des paquets est mise à jour, nous pouvons installer les quelques paquets dont nous avons besoin dans notre configuration initiale:

Astuce: lorsque vous essayez d’installer un paquet qui pourrait être présent dans différents référentiels, nous devons installer le « chemin complet ». C’est ce dont nous avions besoin avec le package
daemonize
Enfin, ajoutons l’utilisateur au :sudoers
# Edit the sudoers file and enable the %wheel group (with or without password)
visudo
# I uncommented the group without password
# Add the user to the group
usermod -aG wheel <username>

Fichier LXC: ajout de contenu aux conteneurs
Une fois que tout a été configuré à l’intérieur du conteneur, quittons et ajoutons des fichiers supplémentaires:
# Exit the container
exit
# Create the wsl.conf file to be copied
vi wsl.conf
# Push the file to the container
lxc file push wsl.conf <container name>/etc/wsl.conf
# Check if the file has been correctly added
lxc exec <container name> -- ls -l /etc/wsl.conf

LXC à WSL2 : un petit conteneur devient une grande distribution
Avec notre conteneur entièrement configuré, il est maintenant temps de sauvegarder notre travail et de l’importer en tant que distribution WSL2.
LXD fonctionnera comme Docker: nous devons enregistrer « l’état du conteneur » (lire: instantané) et ensuite l’enregistrer dans un fichier:.tar
# Save the container state
lxc snapshot <container name> <snapshot name>
# Publish it as a temporary image > this might take some time
lxc publish <container name>/<snapshot name> --alias <image name>
# Check if the image has been correctly created
lxc image list
# Export the image to a .tar file
lxc image export <image name> .
# Check if the image has been correclty exported > the file name is the image ID (hash)
ls <image ID>.tar.gz

Maintenant, alors qu’avec Docker, nous pouvons importer directement l’image exportée, dans LXD, nous devons effectuer une étape supplémentaire car l’image exportée contient plus que :rootfs
# Create a temporary directory that will contain the extracted image
mkdir temp
# Extract the image to the temporary directory > Important to do it with sudo and the '--same-owner' flag
sudo tar -xzf <image id>.tar.gz --same-owner -C temp/
# Check the content extracted
ls temp/
# Enter the rootfs directory
cd temp/rootfs
# Check the content inside the rootfs
ll
# Create a new .tar file with only the rootfs content > Important to do it with sudo and the '--same-owner' flag
sudo tar -czf $HOME/<WSL2 distro name>.tar.gz --same-owner *
# [Optional] Create a directory for your custom distros and the sources on Windows side
mkdir -p /mnt/c/wsldistros/sources
# Copy/move the .tar file to the Windows side > sudo is optional
sudo mv $HOME/<WSL2 distro name>.tar.gz /mnt/c/wsldistros/sources/

Enfin, importons le fichier dans WSL2 en tant que nouvelle distribution..tar
Grâce à l’interopérabilité entre WSL2 et Windows, nous pouvons lancer les exécutables Windows directement à partir de WSL2, nous n’avons donc pas besoin de lancer un shell Powershell pour exécuter les commandes suivantes:
# Enter the custom distros directory
cd /mnt/c/wsldistros/
# Import the .tar file as a WSL2 distro > Just to be sure, I will add the version
wsl.exe --import <WSL2 distro name> ./<WSL2 distro name> ./sources/<WSL2 distro name>.tar.gz --version 2
# Login into the new WSL2 distro
wsl.exe -d <WSL2 distro name>
# Enjoy your new distro

source : WSL2+LXD: Let's have some Fun too :: ~/wsl.dev — Get your Linux On