Outils pour utilisateurs

Outils du site


informatique:linux:dd

Ceci est une ancienne révision du document !


dd

Les bases

La structure de la commande a la forme générale suivante :

dd if=<source> of=<cible> bs=<taille des blocs> skip= seek= conv=<conversion>

source représente les données à copier, cible est l'endroit où les copier.

bs est habituellement une puissance de 2, pas inférieure à 512, représentant un nombre d'octets (par exemple : 512, 1024, 2048, 4096, 8192, 16384, mais cela peut être tout nombre raisonnable).

:!: Attention ! Si vous inversez la source et la cible, vous pouvez perdre beaucoup de données. Cette caractéristique a inspiré le surnom de dd : le Destructeur de Données !!

Le paramètre bs

Comment choisir bs (block size = taille des blocs) ? Un paramètre bs= correctement choisi accroitra significativement la vitesse d'exécution.

Sur du matériel moderne (moins de 5 ans) bs=4096 est un bon pari.

On peut aussi avoir : bs=16065b qui peut être meilleur. bs=32130b encore meilleur. Ces deux dernières tailles de bloc correspondent à des nombres entiers de cylindres. Un cylindre en mode LBA = 255 têtes * 63 secteurs par piste = 16065 secteurs = 16065 * 512 octets = 16065b. Le b signifie * 512 (512 octets étant la taille d'un secteur). 32130b représente un bloc de deux cylindres. Lorsque vous utilisez des tailles de blocs représentant des nombres entiers de cylindres, vous n'avez jamais à vous soucier de la copie de la dernière fraction de bloc car les partitions sont toujours faites d'un nombre entier de cylindres. Les partitions ne peuvent pas contenir de cylindres partiels. Un cylindre comprend 8 225 280 octets.

Les blocs et les octets peuvent être suivis par les suffixes multiplicateurs suivants (les valeurs numériques représentent des nombres d'octets) : c 1, w 2, b 512, kB 1000, k 1024, MB 1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024

Ainsi :

dd if=/dev/sda of=/dev/sdb bs=1GB

utilisera des blocs de taille un gigaoctet.

bs=4b donnera à dd un bloc de taille de 4 secteurs de disque. 1 secteur=512 octets.

bs=4k indiquera à dd d'utiliser un bloc de taille 4 kiloctets. J'ai trouvé que bs=4k est le plus rapide pour la copie de disques sur une machine moderne.

Copier une partition de disque dur sur un autre disque dur

dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=notrunc,noerror

sda2 et sdb2 sont des partitions. Vous voulez copier sda2 dans sdb2. Si sdb2 n'existe pas, dd commencera au début du disque et le créera.

:!: Faites attention à l'ordre de if et of. Vous pouvez écrire un disque vierge sur un disque utilisé si vous êtes désordonné.

Cloner un disque dur en entier

dd if=/dev/sda of=/dev/sdb conv=notrunc,noerror

Dans cet exemple, sda est la source. sdb est la cible. N'intervertissez pas les sources et cibles ainsi désignées. Étonnamment, beaucoup de personnes le font !

  • notrunc signifie « ne pas tronquer le fichier en sortie » (voir notrunc pour plus de détails).
  • noerror signifie de continuer en cas d'erreur. Normalement, dd s'arrête en cas d'erreur. Si vous vous interrogez sur un disque dur, si vous vous demandez s'il fonctionne ou pas, vous pouvez tenter de l'utiliser, à titre de test, comme lecteur source de la commande dd. Vous devriez obtenir une erreur s'il ne fonctionne pas. Les lecteurs cibles en revanche doivent être vraiment en très mauvais état pour provoquer une erreur due à dd.

Copier un grand disque sur un autre disque plus petit

La seule différence entre une grande partition et une petite partition, hormis la taille, est la table de partition. Si vous copiez sda vers sdb, un disque entier avec une seule partition, sdb étant plus petit que sda, alors vous devez faire :

dd if=/dev/sda skip=2 of=/dev/sdb seek=2 bs=4k conv=noerror

Les paramètres skip et seek

Skip (voir ligne de commande précédente) saute des blocs d'entrée au début du média (sda). Seek saute autant de blocs sur le média de sortie avant d'écrire (sdb). en agissant ainsi, vous laissez intacts les 4 premiers Ko sur chaque disque : vous ne voulez pas dire à un lecteur qu'il est plus gros qu'il n'est en réalité en écrivant une table de partition depuis un lecteur plus gros vers un lecteur plus petit.

dd d'une petite partition vers une plus grande : créer un fichier image de la partition

Les 63 premiers secteurs d'un lecteur sont vides, sauf le secteur 1, le MBR. Si vous copiez une partition plus petite vers une plus grande, la plus grande partition affichera sa taille correcte avec :

fdisk -l

Mais pas avec :

df -h

Cela parce que fdisk lit la table de partition et df lit l'info de format.

Si vous dd une plus petite partition vers une plus grande, la plus grande sera maintenant formatée identique à la plus petite et il n'y aura aucune place libre sur le lecteur. La façon de régler cela est de construire un fichier image de la partition :

dd if=plus_petite__partition of=/home/sam/plus_petite_partition.img

Montez l'image comme un lecteur en utilisant :

mount -o loop /home/sam/plus_petite_partition.img /mnt/directory
cd /mnt/directory
cp -r * /mnt/plus_grande_partition_deja_partitionée_et_formatée_a_la_taille_desiree

La commande cp a un commutateur -r pour la copie récursive.

Alternative : Agrandir la partition après le dd

Une autre technique fait usage de la commande resize2fs. Cette commande va agrandir le système de fichiers à la taille de la partition :

  • 1 - Ne travailler que sur des partitions démontées
  • 2 - Ouvrir une console root (ou travailler depuis un live CD) et taper
e2fsck -f /dev/xx

où xx est évidemment le nom de la partition concernée, afin de vérifier l'intégrité du système de fichiers. Pour info, l'option -f force la vérification, sans se contenter d'un simple “check” du journal. De toutes façons, si vous ne ne faites pas, la commande suivante vous l'exigera avant de s'exécuter.

  • 3 - agrandir le système de fichiers :
resize2fs /dev/xx

dd d'une grande partition vers une plus petite

Maintenant, si vous copiez sda3 vers sda2 (plus petit que sda3), c'est différent. Ce que vous désirez faire est alors cela :

dd if=/dev/sda3 of=/dev/sda2 bs=4096 conv=noerror

La toute fin d'un lecteur contient généralement des zéros. Ainsi, si vous avez de la place dans sda2 pour les données de sda3, les zéros de sda3 sont tronqués (les blocs contenant uniquement des zéros sont remplacés par des chaines de cinq caractères astérisque) et c'est OK.

Dans ce cas, il ne faut pas utiliser conv=notrunc, qui copierait tous les blocs contenant uniquement des zéros tels quels, sans les tronquer.

Réaliser l'image ISO d'un CD

La commande :

dd if=/dev/hdc of=/home/sam/moncd.iso bs=2048 conv=notrunc

Les secteurs de CD ont une taille de 2 048 octets, vous faites donc ainsi une copie secteur par secteur. Le résultat sera un fichier image du CD sur le disque dur. Vous pouvez faire un chmod a+rwx moncd.iso pour permettre d'écrire dans l'image.

Vous pouvez monter l'image avec :

mkdir /mnt/moncd

écrire cette ligne dans le fstab :

/home/sam/moncd.iso   /mnt/moncd  iso9660 rw,user,noauto 0 0

Enregistrer le fstab, et réaliser le montage :

mount -o loop /mnt/moncd

Le système de fichiers est maintenant visible avec ses fichiers et dossiers dans le répertoire /mnt/moncd. Vous pouvez éditer l'image autant que vous le souhaitez, le nouveau fichier sera /home/sam/moncd.iso.

dd ne peut pas écrire dans un CD. Pour cela vous devez avoir recours à un logiciel de gravure ou à la commande cdrdao.

Effacer un lecteur

Si vous êtes inquiet au sujet d'espions avec des détecteurs supra-conducteurs à interférences quantiques, vous pouvez toujours ajouter une boucle for pour effacer le disque d'un niveau de sécurité gouvernemental : copier coller les deux lignes suivantes dans un éditeur de texte :

#!/bin/bash
for n in `seq 7`; do dd if=/dev/urandom of=/dev/sda bs=8b conv=notrunc; done

Maintenant vous avez un script shell qui exécute sept passes d'inscriptions aléatoires de caractères sur tout le disque.

Faites :

chmod a+x <fichierscript>

pour le rendre exécutable.

Créer une clé USB bootable

Pour créer une clé USB bootable: télécharger les 50 Mo de la distribution Debian ici

http://sourceforge.net/projects/insert/

Connectez la clé dans le port USB. Faites :

dmesg | tail

Regardez où est le nouveau lecteur, sdb ou quelque chose de similaire (sous une Mandriva il suffira de regarder, dans la fenêtre qui s'ouvre après insertion de la clé, le contenu de la rubrique Emplacement).

Faites :

dd if=/home/sam/insert.iso of=/dev/sdb ibs=4b obs=1b conv=notrunc,noerror

Maintenant modifiez le BIOS pour booter sur l'USB, connectez la clé et bootez la machine.

Copier seulement le MBR d'un disque dur

dd if=/dev/sda of=/home/sam/MBR.image bs=446 count=1

Ceci copiera les 446 premiers octets du disque dur dans un fichier.

:!: Attention ! Si vous ne l'avez pas encore deviné, intervertir les arguments de if= et of=, dans la ligne de commande de dd intervertit le sens de l'écriture !

Sauvegarde de tout le disque

sur deux disque complètement identiques. Avant de faire quelque chose qui pourrait être dangereux, démarrer à partir dd'un live CD et lancer :

dcfldd   if=/dev/sda    of=/dev/sdb/  bs=4096  conv=notrunc,noerror

(vous pouvez utiliser dd à la place de dcfldd) on copie ici ainsi le lecteur système de travail courant sur le lecteur sdb. Si l'installation est cassée sur sda, démarrer à partir dd'un live CD et lancer :

dcfldd if=/dev/sdb  of=/dev/sda  bs =4096 conv=notrunc,noerror

Notez bien que bs=4096 marche plus rapidement pour des machines ayant au moins 128Mo de RAM. dd utilise pas mal de tampons (buffers). Avec bs=4096, sur des machines modernes, la vitesse de transfert optimal pour les disques durs est atteinte.

Effacer toutes les données d'un disque dur

Vous devrez booter depuis un CD pour cela, http://www.efense.com/helix est un bon CD de boot (mais il y en a bien d'autres !). L'environnement de boot helix contient la version DoD de dd appelée dcfldd. Elle fonctionne de la même manière que dd, mais possède une barre de progression.

dcfldd if=/dev/zero of=/dev/sda conv=notrunc

Ceci est très utile pour rendre le lecteur presque comme neuf, cela permet de le débarrasser des virus, des chevaux de Troie etc… La plupart des lecteurs ont 0x0000ffh écrit en usine dans chaque secteur.

informatique/linux/dd.1216727734.txt.gz · Dernière modification: 2018/09/06 18:59 (modification externe)