Introduction

L'objectif de cet article est de présenter une méthode pour passer d'un système physique à un système virtuel. La méthode utilisée n'a pas la prétention de faire référence, c'est juste un moyen que j'ai trouvé pour parvenir à mes fins.

Passer d'un système MS-Windows XP physique à une machine virtuelle s'est révélé plein de surprises et pas forcément si simple que ça. Voilà pourquoi j'ai préféré concentrer la documentation dans ce document.

Par ailleurs, je suis sûr que les informations qui y sont présentes pourront être utiles à quelqu'un.

Étape zéro: l'état des lieux

Nous avons une installation physique organisée de la manière suivante:

  • Une machine avec un seul disque dur (/dev/sda)
  • Ce disque dur dispose de plusieurs partitions organisée de la manière suivante:
    • Partition 1 (25Go) NTFS Racine MS Windows XP (/dev/sda1)
    • Partition 2 (10Go) ext4 / GNU/Linux (/dev/sda2)
    • Partition 3 (4Go) swap GNU/Linux (/dev/sda3)
    • Partition 4 (50Go) ext4 /opt GNU/Linux (/dev/sda4)

Le bootloader de cette machine est GRUB2. Cette machine est, à l'origine, une machine sous MS Windows XP Pro dont nous avons réduit la partition initiale (qui occupait tout le disque) grâce à un système d'exploitation GNU/Linux sous forme de LiveCD.

Une fois la place libérée, nous avons utilisé l'espace disponible pour installer notre nouveau système d'exploitation.

Nous voulons maintenant prendre le système d'exploitation installé sur la première partition (et tous les logiciels/paramétrages qui vont avec) et le virtualiser. Le fichier d'image disque sera situé dans /opt/ qui est une partition suffisamment dimensionnée pour accueillir le volume de données.

Pour atteindre cet objectif, nous allons utiliser VirtualBox et quelques outils systèmes supplémentaires.

Etape 1: Importer les données

Pour commencer, il nous faut un moyen de récupérer les données de la première partition et de les rendre exploitables pour VirtualBox. En d'autres termes, nous devons fabriquer un fichier VDI qui contiendra le système de fichiers présents dans notre partition n°1.

La commande '''VBoxManage convertfromraw''' permet de faire ce genre d'opération. Toutefois, un détail important ne vous a sans doute pas échappé ! En effet, un fichier VDI est une image d'un disque et non d'une partition. Pour être exploitable, il faut donc cloner un disque avec sa table de partition et tout ce dont il a besoin pour démarrer.

Si vous avez installé GRUB2, il vous faudra donc récupérer également la partition /boot qui contient les binaires et les fichiers de conf de GRUB2. Dans le cas contraire, vous aurez droit à un plantage de GRUB (grub rescue).

Notre problème est donc de bien faire attention à récupérer notre disque et non notre partition. Mais, dans notre situation, notre machine ne dispose que d'un seul disque dur physique avec un espace assez contraint. Nous allons donc devoir ruser et récupérer un début d'image de disque contenant notre table de partition et notre partition MS Windows XP complète. Nous récupérerons une image disque VDI non bootable dans un premier temps (GRUB2 tentera d'accéder à des fichiers non présents dans l'image car situés trop loin sur le disque physique).

Pour commencer, vous devez connaître le nombre d'octets de votre partition MS Windows XP. Pour cela, nous allons utiliser fdisk (sous root) :

  # fdisk -s /dev/sda1
  25602016

Pour obtenir notre taille en octets, il suffit de multiplier par 1000. Toutefois, nous devons également récupérer notre table de partition au début. Le nombre d'octets que nous allons devoir récupérer est donc un peu plus important que prévu. Dans le doute, autant en mettre un peu plus. Nous utiliserons donc la valeur de 25702016000.

Pour importer tout ça, nous allons utiliser la commande suivante:

cat /dev/sda | VBoxManage convertfromraw stdin /opt/VM/WinXP.vdi 25712016000

La commande importe les données du disque /dev/sda depuis le début et transforme le tout en image disque au format VDI (celui de VirtualBox). L'import s'arrêtera au bout de 25712016000 octets ce qui nous permettra de récupérer proprement:

  • la table de partition,
  • la partition MS Windows XP
  • probablement un bout de la deuxième partition (dont nous n'avons que faire).

Etape 2: Objectif: Booter sous Windows XP

Si vous essayez de créer une machine virtuelle en lui attachant cette image disque et que vous bootez dessus, vous serez vite arrêté par GRUB qui passera en mode rescue: il manque en effet tous les fichiers de la deuxième partition (/dev/sda2) qui sont utiles à GRUB pour se lancer.

Comment faire pour booter sur Windows XP ?

J'ai utilisé la démarche suivante:

  • Créer une machine virtuelle vierge.
  • Lui installer un système GNU/Linux Debian (en fait peu importe la distribution) avec peu d'espace (4Go ça suffit).
  • Ajouter notre image disque initiale (celle qui contient Ms Windows XP) en tant que disque secondaire de la machine virtuelle.
  • Booter notre machine virtuelle normalement (à partir de maintenant, tout se passe sur cette machine virtuelle qui dispose de deux disque: /dev/sda et /dev/sdb alias notre image de Windows XP)
  • Installer testdisk dans le système GNU/Linux Debian de la machine virtuelle. Testdisk permet de réparer la table de partition qui est défectueuse (normal, on n'a pas tout importé). Il va notamment supprimer l'entrée qui pose problème (/dev/sdb2 qui n'existe pas physiquement).
  • Lancer grub-update afin de prendre en compte la partition /dev/sdb1 (WinXP) dans le processus de démarrage de notre machine virtuelle.
  • Lancer grub-install /dev/sdb pour écraser notre grub originel.
  • À partir de ce stade, on peut booter sur Windows XP (qui en profite pour mettre à jour plein de trucs).

Toutefois, notre objectif est d'avoir une machine virtuelle qui ne contient que MS Windows XP. Il faudrait donc supprimer la partition qui permet de lancer Debian. Mais cette suppression va poser des problèmes à GRUB qui a besoin de fichiers situés dans la partition Debian pour pouvoir s'exécuter correctement.

Pour contourner le problème, il faudrait donc installer un bootloader capable de booter sur MS-windows XP. Il en existe pléthore mais mon choix s'est rabattu sur celui de ms-sys. Ce dernier permet d'installer un bootloader (non libre) simpliste permettant de démarrer MS-Windows XP. Comme le bootloader n'est pas libre, il n'est pas packagé dans Debian. Il faut donc le récupérer et le compiler. C'est ce travail que nous allons réalisé dans notre Debian virtuelle (qui a accès à tous les disques).

  • Éteindre la machine virtuelle.
  • Reconfigurer ses disques en inversant les disques: grub va quand même pouvoir gérer ça comme un grand (grâce aux UUID).
  • Booter sous GNU/Linux (maintenant /dev/sdb1).
  • Installer build-essential et gettext: '''aptitude install build-essential gettext'''
  • Récupérer le logiciel ms-sys et le compiler (un simple make suffit).
  • Aller dans le répertoire bin après la compilation.
  • Lancer la commande: '''./ms-sys -m /dev/sda1'''
  • Arrêter la machine virtuelle.
  • Déconnecter le deuxième disque (celui où GNU/Linux est installé).
  • Windows XP doit maintenant booter tout seul comme un grand.

Conclusion

Grâce à ces quelques outils, on peut récupérer un système MS-Windows valide, même sans le mot de passe administrateur de ce système d'exploitation. Bien entendu, il restera des choses à faire comme installer les extensions VirtualBox et pour lesquelles il faut justement un compte d'administrateur. Mais ceci est une autre histoire...

Je suis sûr qu'il existe d'autres techniques mais celle qui est présentée permet de se débrouiller avec une seule machine disposant d'une seul disque.