Comment récupérer l'espace disque inutilisé d'Ubuntu sur WSL2 ?

J’utilise Ubuntu 20.04 sur WSL2 sous Windows 10, et j’ai remarqué qu’après avoir supprimé des fichiers sur Ubuntu, je ne récupérais pas l’espace occupé par les fichiers supprimés. Par exemple : avant d’avoir supprimé des fichiers sur Ubuntu, l’Explorateur Windows montrait que mon espace libre sur le lecteur (C:) était d’environ 46 Go. Puis après avoir supprimé environ 10 Go de fichiers, qui dans mon cas étaient des sites Gatsby temporaires, cela a résulté en encore moins d’espace libre, environ 45 Go, ce que j’ai trouvé très bizarre.

Alors comment puis-je récupérer ces bits inutilisés ? Existe-t-il une commande terminal que je puisse utiliser ou puis-je faire quelque chose via l’interface graphique Windows ou autre ?

Il y a quelques options ici, mais je réorganise les choses dans cette modification. Ma réponse « originale » redevient la méthode préférée. Voir le bas de cette réponse pour une méthode alternative expérimentale.

Réponse « originale » (préférée)

Il y a un ticket ouvert sur GitHub WSL à ce sujet. WSL fait automatiquement croître le disque virtuel (ext4.vhdx), mais le réduire pour récupérer l’espace inutilisé est quelque chose qui doit actuellement être fait manuellement.

La première chose à faire est de connaître l’emplacement de votre ext4.vhdx. Pour une installation Ubuntu par défaut, il devrait se trouver dans quelque chose comme %USERPROFILE%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\

Ensuite, il y a plusieurs techniques que vous pouvez utiliser pour supprimer l’espace inutilisé. Je recommande de commencer par un wsl --shutdown et de copier le vhdx comme sauvegarde. Si vous exécutez Docker Desktop, arrêtez-le aussi, sinon il pourrait par inadvertance tenter de redémarrer WSL après votre --shutdown.

Si vous êtes sur Windows Professionnel ou supérieur, vous pouvez installer Hyper-V et utiliser la commandlet Optimize-VHD comme décrit dans le ticket original.

Sur Windows Famille (et supérieur), vous pouvez utiliser diskpart comme décrit dans ce commentaire.

Exporter la distribution WSL et la réimporter dans une nouvelle instance WSL (comme dans ce commentaire) récupérera aussi l’espace. Notez que vous devrez réinitialiser le nom d’utilisateur par défaut après une importation. Voir ici (et ici pour des options alternatives).

J’ai testé et confirmé personnellement les deuxième et troisième techniques.

Alternative (Avertissement)

La fonctionnalité suivante reste en statut « Expérimental » un an après son apparition, et bien que je sois sûr qu’elle fonctionne bien pour beaucoup, trop d’utilisateurs continuent de signaler des corruptions de leurs distributions WSL et parfois même du système de fichiers de l’hôte Windows lors de son utilisation.

Merci aux commentaires de @MarkCh et @willnode, j’ai modifié la réponse pour à la fois déplacer cette méthode sous la réponse originale et mettre en évidence cet avertissement.

En septembre 2023, une pré-version de WSL (2.0.0) a activé un nouveau mode « sparse » pour les images disque qui est destiné à réduire automatiquement l’image quand des fichiers sont supprimés. (Surtout compte tenu de l’avertissement ci-dessus) Maintenez toujours de bonnes sauvegardes, surtout quand vous utilisez des fonctionnalités récentes qui affectent l’ensemble du disque virtuel. Je n’ai pas encore testé cela personnellement.

Cela dit, d’après l’annonce du DevBlog, vous pouvez convertir une image disque existante en sparse avec la commande suivante depuis PowerShell :

wsl --manage <distro> --set-sparse true

Vous pouvez aussi ajouter ce qui suit dans votre .wslconfig (situé dans votre répertoire de profil Windows, pas à l’intérieur de WSL) pour que toute image de distribution nouvellement créée soit sparse :

[experimental]
sparseVhd=true