Création
de l'image d'une partition ou d'un DVD
sous
Linux avec l'utilitaire dd
L'utilitaire dd de Linux, présent dans toutes les distributions, permet de copier des données, bloc par bloc, d'un périphérique vers un autre. Un "périphérique" peut être :
Au niveau du disque dur, ce qui est appelé "bloc" par dd est en réalité 2 secteurs du disque, c'est à dire 1ko (un secteur étant un ensemble insécable de 512 octets, accessible "d'un coup" par la tête de lecture du disque dur). L'utilitaire dd permet donc de réaliser une image "physique" d'une partition, en copiant tous ses secteurs un par un. Cela permet de sauvegarder l'intégralité d'une partition, quelque soit le système de fichier présent sur la partition (FAT32, Ext2, Ext3, NTFS, etc ...)
Le secteur boot du disque dur est le premier secteur du disque en LBA. C'est à ce secteur boot que le BIOS passe la main au démarage du PC, après avoir testé le matériel. C'est également dans ce secteur que LILO est installé (si vous avez choisi une installation de LILO dans le MBR). Comme tous les secteur d'un disque dur, le secteur boot a une taille de 512 octets.
Pour sauvegarder le secteur boot sous Linux avec l'utilitaire dd, la ligne de commande est :
On obtient alors un fichier /home/secteur_boot.dd d'une taille de 512 octets, contenant la valeur des 512 octets du secteur boot du disque dur /dev/hda
Pour restaurer le secteur boot sous Linux avec l'utilitaire dd, la ligne de commande est :
dd if=/home/secteur_boot.dd of=/dev/hda bs=512 count=1
Le paramètre bs ("Bloc Size") de dd définie la taille en octets des blocs manipulés (lus ou écrits), et le paramètre count permet de définir le nombre de bloc à copier. Par défaut, la taille d'un bloc est de 1ko pour dd.
Bien que l'utilitaire dd réalise des images parfaites du disque dur, il présente 2 inconvénients :
Pour diminuer la taille de l'image, nous allons la compresser avec gzip. Les utilitaires dd et gzip peuvent utiliser l'entrée et la sortie standard pour recevoir et transmettre le flux de données qu'ils traitent : ils pouront donc être enchaînés avec des tubes sur la ligne de commande pour se transmettre les données.
La ligne de commande suivante réalise une image compressé de la partition /dev/hda1, et la met dans le fichier compressé /mnt/hdb5/sauvegarde.gz :
Grâce à la compression par gzip, la taille du fichier image sera environ égale à la moitié de la taille de la partition.
La restauration est environ 3 fois plus rapide que la création (10 minutes par Go environ). La ligne de commande suivante restaure la partition /dev/hda1 qui a été sauvegardée précédemment :
L'utilitaire zcat lit un fichier compressé .gz, et envoie le résultat de la décompression sur sa sortie standard. Grâce au tube, ce flux de données est redirigé vers l'entrée standard de dd, qui copie alors les informations bloc par bloc sur le périphérique /dev/hda1 : ainsi, chaque secteur de la partition /dev/hsa1 retrouve sa valeur d'origine, qu'il avait avant la sauvegarde.
Remarques :
Comme nous sommes obligés de faire les sauvegardes et les restaurations sous Linux (et que nous le faisons très volontier :-), nous bénéfitions de tous les avantages du système Linux lors de la création des images (avantages que nous n'avions pas en bootant sur une disquette contenant seulement Drive Image), et notament :
J'ai sauvegardé la partition de mon disque dur contenant Linux Red Hat 9 avec les 2 méthodes : Drive Image sous DOS, puis copie physique avec dd (compressé par gzip) sous Linux. La taille totale de la partition est de 3.5 Go.
Le fichier image réalisé avec Drive
Image 3.0 sous DOS a une taille de 1.7 Go
Le fichier image réalisé par dd et
compressé avec gzip a une taille de 1.5 Go
L'image réalisé par dd sous Linux est donc plus petite que l'image créée par Drive Image sous DOS.
Pour finir, ne me demandez pas quelle méthode j'ai définitivement adoptée pour sauvegarder régulièrement mes partitions, je vous laisse deviner : Drive Image sous DOS, ou dd sous Linux ?
Il arrive parfois qu'on n'ait pas assez de place sur un disque dur pour y créer sa propre image. Par exemple, on a un ordinateur possédant un seul dirque dur de 4Go plein à 98% : il est alors impossible d'enregistrer une image du disque (ou d'une partition) sur le disque local. La solution est alors de profiter de la place libre sur un disque installé sur un autre ordinateur, et de sauvegarder l'image par le réseau. Pour transférer l'image d'un PC à l'autre à travers le réseau, nous allons ici utiliser NFS.
Configuration de base
Voici la configuration (simplifiée) de mon réseau : il est constitué de 2 machines, fonctionnant toutes les deux sous Linux :
L'ordinateur Asus fonctionne sous Linux Red Hat 9.0 (mais le principe décrit ici reste valable pour des distributions Linux plus récentes), et possède un disque dur amovible (monté sur un tiroir) avec une partition /dev/hdb5 destinée à recevoir les fichiers images des partitions des différentes machines du réseau.
L'ordinateur Alpha fonctionne sous Linux RedHat 7.2 (mais le principe décrit ici reste valable pour des distributions Linux plus récentes). On veut sauvegarder la partition /dev/hda1 de l'ordinateur Alpha sur la partition /dev/hdb5 de l'ordinateur Asus.
Pour créer un lien entre les deux machines, nous allons utiliser le système de fichier réseau NFS, qui va permettre à Alpha de mounter dans son arborescence un répertoire de Asus. La machine Alpha est ici le client NFS, et la machine Asus est le serveur NFS (Asus met son disque dur à la disposition de Alpha).
Commençons par créer un nouveau répertoire image_dd à la racine de l'arborescence Linux sur chacune des machines Alpha et Asus.
cd /
mkdir image_dd
Configuration du serveur NFS
Sur le serveur Asus il faut mounter la partition /dev/hdb5 dans le répertoire image_dd, puis partager ce répertoire par NFS. Pour cela nous allons rajouter une ligne dans deux fichiers de configuration de Linux :
Dans le fichier /etc/fstab il faut rajouter la ligne suivante :
/dev/hdb5 /image_dd ext2 defaults 1 1
Dans le fichier /etc/exports il faut rajouter la ligne suivante :
/image_dd (rw)
Remarques diverses :
Configuration du client NFS
Pour mounter la partition /dev/hdb5 de Asus (le serveur NFS) sur Alpha (le client NFS) il faut taper la ligne de commande suivante sur le client Alpha :
mount -t nfs 192.168.0.3:/image_dd /image_dd
Dans cette ligne, l'adresse ip 192.168.0.3 est l'adresse ip du serveur NFS.
Sauvegarde d'une partition de Alpha en créant le fichier image sur Asus
Une fois NFS installé et configuré, pour sauvegarder la partition /dev/hda1 de Alpha en créant le fichier image directement sur la partition /dev/hdb5 de Asus (sans faire une image en local), il suffit de taper la ligne de commande suivante sur le client Alpha (comme vu précédemment) :
dd if=/dev/hda1 | gzip -v6 | dd of=/image_dd/sauvegarde.gz
Le répertoire /image_dd du client Alpha est "relié" grâce à NFS à la partition /dev/hdb5 du serveur Asus. En d'autres termes, la partition /dev/hdb5 de Asus est mountée dans le répertoire /image_dd de Alpha (le répertoire /image_dd de Alpha est le point de mountage de la partition /dev/hdb5 de Asus).
Restauration d'une partition sur Alpha
Enfin, pour restaurer une partition sur l'ordinateur Alpha, alors que le fichier image de cette partition est enregistré sur l'ordinateur Asus, il faut taper la ligne de commande suivante sur le client NFS Alpha :
zcat /image_dd/sauvegarde.gz | dd of=/dev/hda1
Ici encore le répertoire /image_dd de Alpha représente le point de mountage de la partition /dev/hdb5 de Asus.
Le grand avantage de cette méthode de sauvegarde par le réseau est avant tout la possibilité de sauvegarder des disques dur qui sont pleins et qui ne possède pas suffisamment de place libre pour enregistrer leur propre fichier image. En contre parti, cette méthode sera plus lente qu'une sauvegarde en local.