Niveau :      
Résumé : losetup, qemu-img, dd, fdisk

Sous unix tout est fichier. Un disque est un fichier, une partition est un fichier, un fichier est un fichier. Ceci a de gros avantage, par exemple il n'y a quasiment pas de différence entre monter une partition et monter une image disque. Exemple :

image_disque.png

Image disque

Créons maintenant une image d'un disque :

$ dd if=/dev/cdrom of=image.iso

Et voila, c'est tout simple nous avons extrait une image de CD.

Maintenant si nous voulons utiliser cette image plutôt que le CD, la commande mount a tout prévu pour nous. Le montage est très simple :

$ mount -o loop image.iso /mnt

Et ceci fonctionne aussi avec l'image d'une partition, il suffit de remplacer /dev/cdrom par /dev/hda1.

Détaillons l'action de mount pour mieux la comprendre. Elle se passe en 2 temps. Tout d'abord elle crée un fichier spécial loopback à partir de l'image. Ceci transforme un fichier normal en fichier de type device. Indispensable pour que le noyau accepte de monter le contenu.

$ losetup -f  # cherche le premier loopback disponible
> /dev/loop1
$ losetup /dev/loop1 image.iso # crée le loopback

Nous avons maintenant le device /dev/loop1 qui est un device normal. Mount peut donc faire son travail :

$ mount /dev/loop1 /mnt

Image d'un disque

Compliquons un peu la chose. Supposons que vous ayez l'image d'un disque complet, avec la table des partitions.

$ dd if=/dev/hda of=image.img

La méthode précédente ne fonctionne plus car on ne trouve pas directement de système de fichier dans l'image. Il existe certains patchs pour permettre le partitionnement de loop device. Mais en leur absence, il existe une autre solution. Détaillons !

Commençons par fdisk qui voit lui aussi les disques comme des fichiers, il peut donc lire leur table de partition.

$ fdisk image.img
> Commande (m pour l'aide): u
> Commande (m pour l'aide): p

Disque image.img: 0 Mo, 0 octets
255 têtes, 63 secteurs/piste, 0 cylindres, total 0 secteurs
Unités = secteurs de 1 * 512 = 512 octets

Périphérique Amorce    Début         Fin      Blocs    Id  Système
image.img1   *          63     3566429     1783183+  83  Linux
image.img2         3566430     4192964      313267+  82  Linux swap / Solaris

> Commande (m pour l'aide): q

Les informations importantes ici sont l'unité et la position de début des partitions. Supposons que nous voulions monter la partition 1, ce qui nous faut est la position du début de la partition en octets :

$ echo $((512*63)) # nombre de secteur * taille des secteurs
> 32256

Et ô miracle, losetup dispose de l'option qui nous intéresse :

$ losetup -o 32256 /dev/loop2 image.img

Et nous avons notre partition dans le fichier /dev/loop2 que l'on peut monter naturellement. Par contre, faites attention, ce n'est pas réellement la partition, mais un peu plus (tout le disque à partir de la position 32256 en fait). Ce qui veut dire que pour une activité autre que le mount (dd, mkfs, ...) c'est à vous de faire attention à ne pas dépasser la taille de la partition en écriture.

Image qemu

Et maintenant si vous avez une image disque au format qemu, ceci ne fonctionne pas. En fait, il vous suffit d'utiliser la commande qemu-img pour changer le format de l'image et retomber dans la situation précédente.

$ qemu-img convert image.qemu -O raw image.img

Bien sûr il vous faut un peu de place libre pour écrire la nouvelle image.