Obtention d'un accès refusé en essayant de monter un VHDX dans WSL sous Windows 11

J’ai créé un nouveau VHDX via le gestionnaire de disques, et j’essaie de le monter dans WSL2 (version 1.0.3), en exécutant la commande suivante :

wsl -d Ubuntu-22.04 --mount --vhd D:\wsl2\wsl2-drive.vhdx --bare

Cela échoue avec :

Failed to attach disk '\\?\D:\wsl2\wsl2-drive.vhdx' to WSL2: Access is denied.
Error code: Wsl/Service/AttachDisk/MountVhd/E_ACCESSDENIED

Choses que j’ai essayées sans que cela change quoi que ce soit :

  • L’exécuter depuis un PowerShell élevé

  • Créer un VHD au lieu d’un VHDX

  • Omettre --bare

  • Omettre -d Ubuntu-22.04

  • Avoir le VHDX dans différents états :

  • “Not Initialized / Unallocated” : l’état après la création dans le gestionnaire de disques

  • Choisir ‘Initialize disk’ dans le Gestionnaire de disques

  • Créer une partition (mais cela semble incorrect, puisqu’elle ne devrait pas être en NTFS pour Linux ?)

  • Le détacher complètement dans le Gestionnaire de disques

Résolu via les commentaires, donc transfert des informations dans une réponse (avec quelques informations supplémentaires).

Les messages d’erreur WSL (relativement) récents ont été utiles dans ce cas. Le Wsl/Service/AttachDisk/MountVhd/E_ACCESSDENIED indiquait un problème de permissions d’un certain type.

Normalement, d’après ce que je peux constater, un fichier .vhdx créé via le Gestionnaire de disques sera possédé par le groupe Administrateurs local. Dans la plupart des cas, l’utilisateur local qui a installé et exécute WSL est membre de ce groupe, donc il n’y a pas de problèmes de permissions.

Cependant, dans ce cas, cela ne semble pas être le cas, puisque le changement de propriétaire du .vhdx a finalement résolu l’erreur ACCESSDENIED.

Quelques éléments supplémentaires :

Le disque virtuel doit être détaché du Gestionnaire de disques (Clic droit → Détacher le VHD) sinon l’erreur suivante se produira :

Failed to attach disk '<path_to>\wsl2-drive.vhdx' to WSL2: The process cannot access the file because it is being used by another process.
Error code: Wsl/Service/AttachDisk/MountVhd/0x80070020

Je recommande personnellement de créer le .vhdx depuis un compte PowerShell administratif en utilisant :

new-vhd -Dynamic -SizeBytes 100gb -BlockSizeBytes 1mb -path <path_to>/<name>.vhdx

La taille de bloc s’avère assez importante pour la vitesse de croissance du disque dynamique. La taille de bloc de 1 Mo est celle que WSL utilise pour ses disques virtuels intégrés.

Également, --bare est requis tant qu’il n’y a pas de système de fichiers sur le lecteur que WSL peut gérer. Votre prochaine étape sera de créer un système de fichiers sur ce disque virtuel depuis l’intérieur de WSL. Comme mentionné dans la documentation WSL, utilisez lsblk pour identifier le disque nouvellement monté.

Ce n’est pas une mauvaise idée de s’assurer complètement que vous formatez le bon périphérique en démontant, lsblk, puis remonter et lsblk à nouveau. Le nouveau périphérique sera évident dans ce cas. Bien entendu, une taille de disque unique est également un moyen valide de l’identifier.

Une fois le périphérique identifié, vous utiliserez quelque chose comme :

sudo mkfs.ext4 /dev/<device> # e.g. sde

Après avoir créé un système de fichiers sur le périphérique, tant que le système de fichiers est reconnu par WSL2 (ext4, btrfs, et probablement quelques autres), vous pouvez omettre l’option --bare pour les montages futurs.

À ce stade, c’est une bonne idée de passer à l’utilisation de --name <name> afin que la partition/le système de fichiers soit monté à un emplacement connu. Par défaut, ce sera /mnt/wsl/<name>.

Le -d Ubuntu-22.04 dans ce cas est un no-op. Je suis un peu surpris que cela ne génère pas d’erreur, mais le périphérique est toujours monté dans toutes les distributions, que vous spécifiiez une distribution avec wsl -d ou non.