Virtualiser son dual boot avec VirtualBox

Depuis le premier confinement en mars, mon PC de jeu me sert aussi de machine de travail. Jusqu'ici, la machine était installée sous Windows puisque quasi-exclusivement réservée au jeu vidéo. L'idée de migrer sous Linux me trottait dans la tête, d'autant que le perfectionnement de Proton1 a significativement augmenté le nombre de jeux AA et AAA jouables sous Linux. À titre d'exemple, un tour sur ProtonDB m'informe que sur les 500 jeux de ma bibliothèque Steam :

  • 200 sont disponibles nativement sous Linux,
  • 31 sont sur la liste blanche de Valve en termes de compatibilité avec Proton,
  • 225 ont une compatibilité Or ou Platine sur ProtonDB,
  • 44 sont injouables ou difficilement jouables avec Proton (incompatibles ou compatibilité Bronze/Argent).

La contrainte du télétravail m'a finalement convaincu à basculer la machine sous Linux. Sauf que je ne peux pas entièrement me passer de Windows, pour deux raisons : 1. il y a une poignée de jeux et de logiciels qui ne fonctionnent pas vraiment sous Wine/Proton, 2. mon casque de réalité virtuelle a une compatibilité Linux inexistante.

Je suis donc au dual boot en UEFI avec une partition Windows et une partition Manjaro Linux. Avec un SSD, le redémarrage se fait en une dizaine de secondes mais si j'ai besoin d'accéder à Windows ponctuellement 2, est-ce que je peux m'éviter d'avoir à redémarrer ?

La réponse est oui en passant par la virtualisation d'un disque physique.

Avertissement : n'utilisez la technique décrite ci-dessous qu'avec la plus grande prudence. En amont, il faudra désactiver l'hibernation dans Windows. À l'usage, il faut s'assurer de bien éteindre correctement la machine virtuelle pour éviter des corruptions de données ou des états incohérents du système de fichiers. Faites une sauvegarde de vos données et soyez prêts à réinstaller votre système en cas de plantage si vous vous lancez dans cette opération.

1. Préparation

La plupart des virtualiseurs modernes sont capables d'utiliser comme disque dur une partition physique (plutôt que les disque durs virtuels habituellement émulés). Bien sûr, cela signifie alors que la machine virtuelle manipule des données réelles sur les disques et qu'il faudra donc ne pas faire n'importe quoi puisque l'invité n'est plus isolé de l'hôte.

Le chapitre 9 de la documentation de VirtualBox a une section consacrée à l'accès direct à un disque dur physique. L'approche la plus simple consiste à monter l'intégralité d'un disque comme un disque virtuel (c'est-à-dire créer un fichier .vmdk spécial qui fait le lien entre la machine virtuelle et le disque réel). Cela fonctionne si votre Windows est installé sur un disque physique différent de votre disque Linux mais ce n'est pas mon cas. En effet, mon disque réel est divisé en cinq partitions :

  1. partition de récupération Windows,
  2. partition EFI,
  3. partition réservée Microsoft,
  4. partition NTFS Windows,
  5. partition ext4 Manjaro Linux.

Ce n'est pas indispensable mais pour éviter de passer par le superutilisateur système, on va supposer que l'utilisateur actuel a les permissions pour manipuler VirtualBox et les droits d'accès sur toutes les données des disques montés. Si ce n'est pas le cas, pour la plupart des distributions Linux cela signifie qu'il faut ajouter l'utilisateur aux groupes disk (accès aux disques physiques) et vboxusers (permission d'utiliser VirtualBox) :

sudo usermod -aG disk,vboxusers nom_de_mon_utilisateur

2. Création du disque virtuel

On commence par créer un disque dur virtuel au format VirtualBox (.vmdk) que l'on pourra ensuite associer à la machine virtuelle correspondante. Une fois n'est pas coutume avec VirtualBox, il faut passer par la ligne de commande et l'outil VBoxManage. La commande suivante permet de créer disque virtuel qui permettra à la machine virtuelle d'accéder aux bonnes partitions :

VBoxManage internalcommands createrawvmdk -filename mon_disque_windows.vmdk -rawdisk /dev/sda -partitions 1,2,3,4 -relative

Décortiquons les options :

  • /dev/sda correspond au disque vu par Linux (à remplacer par le disque sur lequel se trouvent vos partitions Windows),
  • -partitions 1,2,3,4 indique que l'on souhaite un accès en écriture aux partitions 1 à 4 3,
  • -relative n'est nécessaire que si l'utilisateur qui lance VirtualBox n'a pas l'accès en écriture à tout le disque (il faut au moins l'accès en écriture aux partitions concernées),
  • -filename spécifie le nom du fichier correspondant au disque virtuel.

3. Création de la machine virtuelle

Cette étape est relativement simple, il suffit de créer une machine virtuelle classique en utilisant VirtualBox. Vous pouvez lui allouer la mémoire et le nombre de cœurs processeurs que vous souhaitez mais je vous conseille de ne pas dépasser 50% des ressources de votre machine.

Une fois que c'est fait, on peut ensuite importer le fichier .vmdk dans le gestionnaire de médias de VirtualBox puis l'attacher à la machine virtuelle nouvellement créée.

Attention : lors de la création de la machine virtuelle, il faut s'assurer que l'architecture système virtualisée correspond à celle du système réel. Si vous utilisez un système 64 bits, il faudra activer la virtualisation matérielle (SVM/AMD-V pour les processeurs AMD, VT/VT-X pour les processeurs Intel) dans le BIOS.

Pour éviter les problèmes d'activation de la licence Windows, il est recommandé de cloner l'identifiant hardware du système pour que la machine virtuelle et la machine physique utilisent le même :

# remplacer Win10native par le nom de la VM
VBoxManage modifyvm Win10native --hardwareuuid `sudo dmidecode -s system-uuid`

4. Démarrage

Si l'on démarre la VM, il y a des chances que celle-ci ne sache pas comment démarrer. En passant par le menu de démarrage (F12 ou Échap au lancement de la machine), on peut distinguer deux cas :

  • le disque est au format GPT avec un UEFI : c'est le plus simple. Il faut activer le mode EFI dans les paramètres de la VM (carte mère > Activer le mode EFI). Dans les options du Boot Maintenance Manager (Échap au démarrage de la VM), on peut ajouter une option de démarrage (Add Boot Option) et sélectionner le script de démarrage de Windows (EFI/Microsoft/Boot/bootmgfw.efi 4). Alternativement on peut aussi utiliser l'option Boot from file et démarrer ce même script, il semblerait que l'option soit alors automatiquement ajoutée.
  • le disque est au format MBR : la VM devrait démarrer et arriver sous Grub, auquel cas il faut un peu plus bricoler pour démarrer. La seule option à ma connaissance est de récupérer le MBR d'un disque installé sous Windows avec le bon partitionnement et d'utiliser l'option -mbr de la commande createrawvmdk pour l'injecter dans la VM 5. L'avantage est que cela permet de ne pas toucher à l'UEFI et de mieux isoler la machine virtuelle, puisque celle-ci ne doit gérer que les partitions Windows (et pas la partition EFI du système hôte).

Une fois ce travail fait, vous devriez normalement pouvoir accéder à votre système Windows réel depuis votre machine virtuelle ! En théorie, avec un GPU connecté via un PCI passthrough, on pourrait même jouer sous Windows de cette façon mais VirtualBox ne semble plus gérer cette option et elle nécessite de toute façon deux cartes graphiques pour fonctionner correctement.

Références


  1. une surcouche développée par Valve (l'entreprise derrière Steam) autour de Wine pour lancer des jeux Windows sous Linux. 

  2. c'est-à-dire pas pour jouer mais pour éditer un PDF signé avec Adobe, etc. 

  3. mais pas le 5ème partition, qui est celle de Linux. Monter dans une VM invitée la partition sytème de la machine hôte me semble être une idée désastreuse. La documentation prévient en tout cas que cela risque fortement de dégénérer en corruption généralisée du système de fichiers. 

  4. attention à bien sélectionner bootmgfw.efi et pas bootmgr.efi (ce dernier correspond au démarrage en mode BIOS). 

  5. voir par exemple ce fil (en anglais) du forum VirtualBox. 

links