Transférer un OS d’une machine vers QEMU

Ces derniers jours mon portable, une machine qui a quelques années derrière elle, s’est décidée à me faire des frayeurs: des gels réguliers pour soi-disant faire une réinitialisation du sous-système disque, c’est à dire des choses du genre:

ata2.01: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x2 frozen
ata2.01: cmd a0/00:00:00:00:00/00:00:00:00:00/b0 tag 0
         cdb 00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
         res 50/00:01:00:00:00/00:00:00:00:00/b0 Emask 0x2 (HSM violation)
ata2.01: status: { DRDY }
ata2: soft resetting link
.

Bref des choses qui me font dire que le disque dur n’est pas éternel et qu’il a déjà quelques heures de vol (smart me dit environ 3200 heures).

J’ai sur cette machine 2 OS: une Debian dont je me sert quasiment exclusivement et un Windows XP qui me sert à compiler un logiciel développé à l’aide de la bibliothèque Qt.

Pour ce qui est de la Debian, je n’ai pas grand chose à sauvegarder: les sources du logiciel et quelques fichiers de configuration, donc je m’en débrouille très bien. Par contre pour ce qui est de la partition Windows, j’ai mis en place un environnement de compilation qui m’a donné beaucoup de fil à retordre et qui ne serait pas évident à réinstaller même avec les 10 pages de notes que j’avais prises à l’époque.

D’autre part, depuis un bout de temps, j’avais envie de pouvoir m’affranchir du portable, de manière à pouvoir bosser indépendamment de la machine: je trimbale juste une clef usb bootable (une flash de Mandriva par exemple) et je peux m’installer sur n’importe quel PC pourvu qu’il y ait une connexion Internet. De là, je récupère par le réseau ce dont j’ai besoin et pour la « machine à compiler » Windows, je lance un QEMU situé sur un serveur.

Donc y’avait plus qu’à …

Première étape: état des lieux.

- le partitionnement de mon portable est le suivant:

Disk /dev/sda: 100.0 GB, 100030242816 bytes
255 heads, 63 sectors/track, 12161 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000aa1b9

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1         261     2096451    6  FAT16
/dev/sda2             262        1477     9767520   83  Linux
/dev/sda3            1478        1599      979965   82  Linux swap / Solaris
/dev/sda4            1600       12161    84839265    5  Extended
/dev/sda5            1600       11325    78124063+  83  Linux
/dev/sda6           11326       12161     6715138+   7  HPFS/NTFS
.

On remarquera qu’il y a une partition en FAT16 (je ne sais pas ce qu’elle fait là, ça doit être une partition créée par le constructeur) et la partition qui m’intéresse, la sda6, celle en NTFS. Quand on est sous Windows, on voit 2 partition: la C: (sda1) et la H: (sda6).

Donc, si vous avez suivi, vous savez que c’est la partition sda6 que je veux mettre dans mon QEMU. Je vais donc commencer par copier cette partition dans un fichier à l’aide d’un:

dd if=/dev/sda6 of=sda6.img
.

Ce qui me donne un gros fichier contenant l’image de la partition Windows, qu’en fait, j’avais copié directement sur une autre machine via NFS, mais ça n’a pas d’importance.

Deuxième étape: création de l’image disque.

A l’aide de la commande qemu-img, je crée une image disque de 10 Go:

qemu-img create disque.img 10G
.

Ensuite, le but du jeu étant de transférer l’image de la partition sur le disque, je démarre QEMU avec mon image disque toute neuve comme premier disque dur, l’image disque de la partition comme 2ème disque dur et le CD netinst de Debian (et oui, il faut bien pouvoir booter sur quelque chose):

qemu -hda disque.img -hdb sda6.img -cdrom debian-40r1-i386-netinst.iso -boot d
.

Vous pouvez choisir ce que vous voulez comme CD de démarrage pourvu que vous ayez accès à un shell (alt+F2 avec le CD d’installation de Debian, de préférence une fois que le clavier est configuré et les modules d’installation chargés). On peut maintenant partitionner le disque à l’aide de fdisk.

fdisk /dev/hda
.

Vous créez une nouvelle partition (qui va être hda1) de type NTFS (7) et la rendez bootable (commande a dans fdisk). Faites attention de bien prendre le même nombre de cylindre que la partition originale (et n’oubliez pas qu’il y a toujours un piquet de plus que de pans de clôture), vous devez obtenir exactement le même nombre de blocs que dans le partitionnement original (dans mon cas  6715138 blocs).

Ensuite, il nous faut copier l’image de la partition vers notre nouvelle partition toute neuve, toujours avec dd:

dd if=/dev/hdb of=/dev/hda1
.

Là, vous pouvez aller boire une bière, voire même plusieurs… (vous êtes dans une machine virtuelle et ça se ressent). De plus, si vous êtes dans la même situation que moi (système Windows sur une partition autre que C:) , ça ne fonctionnera pas, on verra après pourquoi.

Troisième étape: on tente de démarrer l’image transférée.

Pour éviter d’avoir à refaire le dd précédent et être obligé d’aller reboire des bières, vous pouvez soit faire une copie de votre nouvelle image disque, soit faire toutes les manips suivantes avec l’option -snapshot de QEMU qui n’écrira pas sur la nouvelle image disque les changements, sauf si vous lui demandez (une fois que tout fonctionne me parait être à un bon moment).

On démarre maintenant la nouvelle image disque avec le CD d’installation de Windows XP, le but étant de recréer le MBR et le chargeur de démarrage. Vous pouvez, soit créer une image iso de votre CD d’installation, soit utiliser directement le périphérique de cdrom de linux avec QEMU. Perso, j’avais déjà l’image iso, donc je l’ai utilisée (non, je n’ai pas lancé un nouveau dd pour la créer de manière à aller boire une autre bière !).

qemu -hda disque.img -cdrom /chemin/vers/Win_XP_Pro.iso -boot d
.

Une fois le programme d’installation lancé, vous choisissez l’option ‘R’ (pour réparer), et si tout se passe bien il va vous détecter la partition système Windows que vous allez choisir (’1′). Vous vous retrouvez alors dans une sorte de shell avec quelques commandes disponibles (faut pas rêver, c’est pas une busybox non plus, et vous ne pouvez même pas éditer un fichier).

Deux commandes vous nous être utiles: FIXMBR et  FIXBOOT, vous les lancez les 2. Peu importe l’ordre, FIXMBR va écrire un nouveau MBR (master boot record, les 512 premiers octets du disque dur) et FIXBOOT va copier le chargeur de démarrage.

Il ne reste plus qu’à redémarrer (ça se fait tout seul si vous tapez exit)… et là si vous êtes dans le même cas que moi (partition système Windows autre que C:), vous croyez tenir le bon bout mais le système se fige lamentablement au démarrage; ça n’est pas la peine d’attendre et d’en profiter pour aller boire des bières, ça ne va pas plus loin.

Après divers tests (avec plein de dd très longs) pour arriver à faire démarrer mon Windows, j’en ai déduit qu’il fallait absolument que le partitionnement de la nouvelle image disque ressemble le plus possible à celui de la machine originale de manière à avoir la partition système Windows sur H:. J’ai essayé avec fdisk sous Linux et je ne suis pas arrivé à mes fins. Après réflexion, je pense que ça doit être possible mais j’en ai un peu marre des essais à vrai dire.

J’ai donc recréé le partitionnement de l’image disque avec le CD d’installation de windows (mode réparation) à l’aide de la commande diskpart. J’ai créé la première partition en FAT16 de la même taille que sda1 sur mon portable et plusieurs petites partitions en FAT16 (de 20 Mo) jusqu’à arriver à H: où j’ai créé la grosse partition NTFS. Dans diskpart, vous ne pouvez donner que des tailles en Mo, donc pour recréer le même nombre de blocs que dans votre partitionnement original, il vous faudra peut-être tâtonner un peu.

Chez moi j’obtiens ça (le partitionnement a été fait avec diskpart, mais je l’affiche ici avec fdisk ):

Disk /dev/hda: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1         261     2096451    6  FAT16
/dev/hda2             262        1304     8377897+   f  W95 Ext'd (LBA)
/dev/hda5             262         264       24066    6  FAT16
/dev/hda6             265         267       24066    6  FAT16
/dev/hda7             268         270       24066    6  FAT16
/dev/hda8             271         273       24066    6  FAT16
/dev/hda9             274        1109     6715138+   7  HPFS/NTFS
.

Une fois que le partitionnement est bon, vous pouvez recommencer depuis le début pour copier vos partitions (j’ai mis aussi la sda1 tant que j’y étais, mais je ne sais pas si c’était utile) avec la même méthode, vous démarrez QEMU avec les images des partitions comme disque dur et vous faites des dd.

Si tout va bien, une fois que vous avez reconstruit le MBR et le chargeur de démarrage, vous aurez l’immense satisfaction de voir enfin démarrer votre Windows (avec quelques toussotements et crachotements puisque le matériel émulé par QEMU n’est surement pas le même que sur votre machine originale).

Pour ma part, j’ai transférere l’image sur un serveur (via une ligne ADSL). J’ai compressé l’image avant de la transférer (avec bzip2) et je suis passé de 10 Go à 3,5 Go, donc c’est faisable, faut pas être pressé et puis vous pouvez en profiter pour aller boire une bière parce que, arrivé là, vous l’aurez bien méritée.

Ensuite il ne reste plus qu’à lancer QEMU sur le serveur avec l’option -vnc pour l’utiliser à distance avec vncviewer (faites quand même attention à la sécurité, tout est prévu pour, alors faites un tour dans la doc de QEMU).

N’oubliez pas une fois que tout est terminé d’effacer le Windows original car je doute que la licence de Windows vous permette de faire tourner plusieurs copies en même temps (je doute même que tout ce que je décris ci-dessus soit compatible avec la licence… si ça vous amuse, lisez-là).

Vus : 443
Publié par Jopa : 29