Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
dd [Le 06/12/2017, 10:42] – [dd d'une grande partition vers une plus petite] 82.246.79.153 | dd [Le 31/12/2020, 07:46] (Version actuelle) – [Introduction] bcag2 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag> | ||
+ | ---- | ||
+ | ====== Commande “dd” ====== | ||
+ | <note warning> | ||
+ | |||
+ | =====Introduction===== | ||
+ | |||
+ | La commande dd permet de copier tout ou partie d'un disque − **[[smartmontools| EN BON ÉTAT]]** − par blocs d' | ||
+ | <note help> | ||
+ | |||
+ | Contrairement à la copie avec [[/ | ||
+ | |||
+ | D' | ||
+ | |||
+ | |||
+ | <note warning> | ||
+ | |||
+ | Vous trouverez un guide d' | ||
+ | |||
+ | Le contenu d'une (petite !) partie de ce lien a été traduit en français, ci-dessous, par lebarhon et révisé/ | ||
+ | |||
+ | Une autre page utile sur dd - hélas elle aussi en anglais - est : [[http:// | ||
+ | |||
+ | Voir aussi | ||
+ | * [[ssh# | ||
+ | * Pour la copie de sauvegarde ou de synchronisation, | ||
+ | * Lorsque la copie porte sur un gros volume, on peut suivre l' | ||
+ | |||
+ | <note tip>Il existe une interface graphique à dd qui permet de créer des clés bootables d' | ||
+ | =====Les bases===== | ||
+ | |||
+ | La structure de la commande a la forme générale suivante : | ||
+ | < | ||
+ | |||
+ | **source** représente les données à copier, **cible** est l' | ||
+ | |||
+ | **bs** (**b**lock **s**ize) est habituellement une puissance de 2, supérieure ou égale à 512, représentant un nombre d' | ||
+ | |||
+ | <note warning> | ||
+ | ====Le paramètre bs==== | ||
+ | |||
+ | Comment choisir bs ? (// | ||
+ | |||
+ | Un paramètre **bs=** correctement choisi accroitra significativement la vitesse d' | ||
+ | |||
+ | 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 x 63 secteurs par piste = 16065 secteurs = 16065 x 512 octets = 16065b. Le **b** signifie **x512** (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. | ||
+ | |||
+ | |||
+ | < | ||
+ | |||
+ | Pour bien comprendre les notions originelles de tête, cylindre et secteur, auxquelles l' | ||
+ | * [[wpfr> | ||
+ | * http:// | ||
+ | |||
+ | D' | ||
+ | |||
+ | Pour mémoire : | ||
+ | |||
+ | //Un cylindre en mode LBA// = 255 têtes x 63 secteurs par piste (chaque tête lit une piste pour un cylindre donné) = 16 065 secteurs = 16 065 x 512 octets = **16065b**. Le **b** signifie | ||
+ | |||
+ | **32130b** représente la taille d'un bloc de deux cylindres. | ||
+ | |||
+ | Lorsqu' | ||
+ | |||
+ | |||
+ | Les blocs et les octets peuvent être suivis par les suffixes multiplicateurs suivants (les valeurs numériques représentent des nombres d' | ||
+ | |||
+ | Ainsi : | ||
+ | |||
+ | < | ||
+ | dd if=/dev/sda of=/dev/sdb bs=1MB | ||
+ | </ | ||
+ | |||
+ | utilisera des blocs de taille un mégaoctet. | ||
+ | |||
+ | **bs=4b** donnera à dd un bloc de taille de 4 secteurs de disque. 1 secteur = 512 octets. | ||
+ | |||
+ | **bs=4k** indiquera à dd d' | ||
+ | |||
+ | ====Copier une partition de disque sur un autre disque==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | <note warning> | ||
+ | * sda2 et sdb2 sont des partitions : pensez à mettre celles qui correspondent à vos besoins. Faites attention à l' | ||
+ | * Si sdb2 n' | ||
+ | * L' | ||
+ | * La partition complète va être copiée : la partition de destination aura exactement la même taille et le même [[uuid_et_label|uuid]] qui est censé être unique. Cela peut être source de conflit. Vous pouvez toujours [[uuid_et_label# | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | * Veillez à ce que tout soit attaché après " | ||
+ | * A priori l' | ||
+ | </ | ||
+ | |||
+ | |||
+ | Une solution alternative pour voir l' | ||
+ | Alternative en mode root, pour voir la progression toutes les 30 secondes: < | ||
+ | Une autre solution est d' | ||
+ | |||
+ | ====Cloner un disque dur en entier==== | ||
+ | |||
+ | < | ||
+ | dd if=/dev/sda of=/dev/sdb conv=notrunc, | ||
+ | </ | ||
+ | <note warning> | ||
+ | Dans cet exemple, sda est la source. sdb est la cible. | ||
+ | N' | ||
+ | Étonnamment, | ||
+ | |||
+ | **notrunc** signifie «ne pas tronquer le fichier en sortie». | ||
+ | |||
+ | **noerror** signifie de continuer en cas d' | ||
+ | |||
+ | ====Disque défectueux bit par bit==== | ||
+ | **Cette copie sera un clone identique** du disque Source. | ||
+ | * Lire ici la procedure: [[http:// | ||
+ | * Utiliser de préférence l' | ||
+ | |||
+ | ====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=1 of=/dev/sdb seek=1 bs=4k conv=noerror status=progress | ||
+ | </ | ||
+ | |||
+ | Une autre technique pour traiter ce genre de situation, est proposée à [[http:// | ||
+ | |||
+ | ===Les paramètres skip et seek=== | ||
+ | |||
+ | **skip** (voir ligne de commande précédente) saute des blocs d' | ||
+ | |||
+ | **seek** saute autant de blocs sur le média de sortie (sdb) avant d' | ||
+ | |||
+ | ==== Copie bit à bit d'un support : créer un fichier image parfait ==== | ||
+ | |||
+ | <note tip>Pour les partitions d'un disque dur, 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 partitions et df lit l'info de format. | ||
+ | </ | ||
+ | |||
+ | Si vous copiez avec dd une petite partition vers une plus grande, la plus grande sera maintenant formatée de façon identique à la plus petite et il n'y aura contrairement à ce que vous attendez aucune place disponible sur le lecteur. Le reste de la partition étant ignoré par dd, de même que pour le système d' | ||
+ | |||
+ | À chaud, le moyen le plus simple est de construire un fichier image du support concerné : | ||
+ | |||
+ | < | ||
+ | dd if=< | ||
+ | </ | ||
+ | <note important> | ||
+ | <note tip>Si le support concerné contient des erreurs, il faut ajouter l' | ||
+ | dd if=< | ||
+ | Dans ce cas, la copie bit à bit n'est pas possible, de même que dans le cas de l' | ||
+ | L' | ||
+ | </ | ||
+ | Une fois fait, vous pourrez monter l' | ||
+ | |||
+ | < | ||
+ | mkdir / | ||
+ | mount -o loop / | ||
+ | </ | ||
+ | Puis copier les données vers son nouveau support via une simple copie cp | ||
+ | < | ||
+ | cp -a * / | ||
+ | </ | ||
+ | La commande cp a un commutateur -a pour la copie récursive et garder les droits inchangés. | ||
+ | |||
+ | ===Alternative : Agrandir la partition après le dd === | ||
+ | Une autre technique fait usage de la commande [[https:// | ||
+ | |||
+ | 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' | ||
+ | De toutes façons, si vous ne ne faites pas, la commande suivante vous l' | ||
+ | |||
+ | 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=/ | ||
+ | </ | ||
+ | ou | ||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | 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 chaînés de cinq caractères astérisque). | ||
+ | |||
+ | Dans ce cas, il ne faut pas utiliser **conv=notrunc**, | ||
+ | |||
+ | ===== Opérations sur d' | ||
+ | ====Réaliser l' | ||
+ | |||
+ | La commande : | ||
+ | |||
+ | < | ||
+ | dd if=/dev/hdc of=/ | ||
+ | </ | ||
+ | |||
+ | 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 ' | ||
+ | |||
+ | Vous pouvez monter l' | ||
+ | |||
+ | < | ||
+ | mkdir /mnt/moncd | ||
+ | mount -o loop / | ||
+ | </ | ||
+ | |||
+ | Le système de fichiers est maintenant visible avec ses fichiers et dossiers dans le répertoire /mnt/moncd. | ||
+ | Vous pouvez éditer l' | ||
+ | |||
+ | dd ne peut pas écrire dans un CD. Pour cela vous devez avoir recours à un logiciel de gravure. | ||
+ | |||
+ | ====Effacer un lecteur==== | ||
+ | |||
+ | Si vous êtes inquiet au sujet d' | ||
+ | |||
+ | < | ||
+ | #!/bin/bash | ||
+ | for n in `seq 7`; do dd if=/ | ||
+ | </ | ||
+ | |||
+ | Maintenant vous avez un script shell qui exécute sept passes d' | ||
+ | |||
+ | Faites : | ||
+ | |||
+ | < | ||
+ | chmod a+x < | ||
+ | </ | ||
+ | |||
+ | pour le rendre exécutable. | ||
+ | |||
+ | Voir aussi [[https:// | ||
+ | |||
+ | ====Créer une clé USB bootable==== | ||
+ | |||
+ | **Note : méthode réservée aux utilisateurs avancés et concentrés, | ||
+ | |||
+ | |||
+ | Remarquez également que toutes les données présentes sur la clé seront perdues.** | ||
+ | |||
+ | Faites un : | ||
+ | < | ||
+ | sudo fdisk -l | ||
+ | </ | ||
+ | |||
+ | Connectez la clé dans le port USB, puis faites à nouveau un '' | ||
+ | |||
+ | Note : pour un point de montage du type ''/ | ||
+ | |||
+ | Ensuite, tapez : | ||
+ | |||
+ | < | ||
+ | dd bs=4M if=/ | ||
+ | </ | ||
+ | |||
+ | [[https:// | ||
+ | ==== Créer un DVD bootable ==== | ||
+ | exemple | ||
+ | < | ||
+ | 1089364480 bytes (1,1 GB, 1,0 GiB) copied, 2420 s, 450 kB/s | ||
+ | 2127840+0 enregistrements lus | ||
+ | 2127840+0 enregistrements écrits | ||
+ | 1089454080 bytes (1,1 GB, 1,0 GiB) copied, 2419,85 s, 450 kB/s | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ====Copier seulement le MBR d'un disque dur==== | ||
+ | |||
+ | < | ||
+ | dd if=/dev/sda of=/ | ||
+ | </ | ||
+ | |||
+ | Ceci copiera les 446 premiers octets du disque dur dans un fichier. | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | ====Sauvegarde de tout le disque==== | ||
+ | |||
+ | Pour ma part je travaille sur plusieurs machines, mais sur celle que j' | ||
+ | < | ||
+ | dd | ||
+ | </ | ||
+ | et je copie ainsi mon lecteur système de travail courant sur le lecteur sdb. Si je casse mon installation sur sda, je démarre avec le live CD et je fais : | ||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Notez bien que **bs=4096** marche plus rapidement pour des machines ayant au moins 128Mo de RAM. dd utilise pas mal de tampons (' | ||
+ | |||
+ | ==== Faire de multiples copie d'un support grâce à un fichier Master-image compressé ==== | ||
+ | |||
+ | On génère d' | ||
+ | < | ||
+ | sudo dcfldd if=/dev/sdX bs=4k conv=notrunc, | ||
+ | </ | ||
+ | |||
+ | On déploie le fichier Master-image sur un support de stockage PLUS GRAND | ||
+ | < | ||
+ | gzip -cd ~/ | ||
+ | </ | ||
+ | Cette méthode maintient le MBR, les Flag... | ||
+ | |||
+ | |||
+ | ====Effacer toutes les données d'un disque dur==== | ||
+ | |||
+ | Vous devrez booter depuis un CD pour cela, | ||
+ | http:// | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | 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. | ||
+ | |||
+ | ====Écrire par dessus toute la place libre d'une partition==== | ||
+ | |||
+ | C'est à dire rendre impossible la récupération des fichiers effacés. | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Quand dd dit : « plus d' | ||
+ | |||
+ | < | ||
+ | rm fichieroccupanttoutlespacelibre | ||
+ | </ | ||
+ | |||
+ | =====Quelques trucs pour les geek===== | ||
+ | |||
+ | ====Pour voir la mémoire vive==== | ||
+ | |||
+ | < | ||
+ | sudo dd if=/ | ||
+ | </ | ||
+ | |||
+ | utilisez PgUp, PgDn, flèche vers le haut, flèche vers le bas pour se déplacer dans les pages. less est mon éditeur préféré. Ou plutôt il le serait s'il permettait l' | ||
+ | |||
+ | ====Quels systèmes de fichiers sont installés==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | ====Tous les modules chargés==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | ====Table des interruptions==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | ====Depuis combien de temps fonctionne le système==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | ====Partitions et tailles en Ko==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | ====Etat de la mémoire==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Créer un disque de sauvegarde==== | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | Je place deux disques identiques dans chacune de mes machines. Avant de faire toute chose pouvant être désastreuse, | ||
+ | |||
+ | < | ||
+ | dcfldd if=/dev/sda of=/dev/sdb bs=4096 conv=notrunc, | ||
+ | </ | ||
+ | |||
+ | et copie mon disque de travail en cours sda vers le disque sdb. Si je détruis l' | ||
+ | |||
+ | < | ||
+ | dcfldd if=/dev/sdb of=/dev/sda bs=4096 conv=notrunc, | ||
+ | </ | ||
+ | |||
+ | et je retrouve chaque chose exactement comme avant qu'un truc idiot que j' | ||
+ | Vous pourriez aussi envisager de faire une partition root séparée de /home, et rendre /home assez grand pour contenir la partition root, Vous pouvez alors faire : | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | pour réaliser un backup de root puis : | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | pour remettre l' | ||
+ | |||
+ | ====Créer un fichier de 100 octets aléatoires==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Ici | ||
+ | * **urandom** est un générateur Linux de nombres aléatoires. | ||
+ | * **mes_octets_aleatoires** est un fichier. | ||
+ | * La taille de bloc est égale à 1 octet (**bs=1**) | ||
+ | * et on envoie 100 blocs, donc au total 100 octets (**count=100**). | ||
+ | |||
+ | **gpg** a besoin d'une graine (' | ||
+ | |||
+ | |||
+ | /dev/random génère autant de bits aléatoires que la réserve entropique peut en contenir. Cela produit des valeurs hautement aléatoires pour des clés de cryptographie. Si davantage d' | ||
+ | |||
+ | ====Écrire des données aléatoires par dessus un fichier avant de l' | ||
+ | |||
+ | d' | ||
+ | |||
+ | < | ||
+ | ls -l | ||
+ | </ | ||
+ | |||
+ | pour trouver la taille du fichier : | ||
+ | |||
+ | < | ||
+ | ls -l unfichier | ||
+ | -rw------- ... 3769 Nov 2 13:41 < | ||
+ | </ | ||
+ | |||
+ | dans ce cas elle est de 3769. | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Ceci écrira des caractères aléatoires par dessus la totalité du fichier . | ||
+ | |||
+ | Ainsi même quelqu' | ||
+ | |||
+ | ====Copier une partition de disque dans un fichier placé sur une partition différente==== | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Cela créera un fichier qui est l' | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Ou si cela ne fonctionne pas, essayez : | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Crée une archive gzip de la partition complète. Pour la restauration, | ||
+ | |||
+ | < | ||
+ | gunzip partition.image.gz > /dev/sda1 <-???? | ||
+ | </ | ||
+ | |||
+ | <note tip>Si cela ne fonctionne pas, essayez : | ||
+ | < | ||
+ | zcat partition.image.gz | dd of=/ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Pour bzip2 (plus lent, plus petit), remplacer par bzip2 et bunzip2 | ||
+ | |||
+ | |||
+ | ==== Restaurer une partition de disque depuis un fichier image==== | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | De cette façon, vous pouvez avoir un grand disque dur et le partitionner, | ||
+ | semez la pagaille dans votre partition root, vous n'avez qu'à booter depuis le CD helix (ou un live CD quelconque) et restaurer l' | ||
+ | |||
+ | ====Convertir un fichier tout en caractères majuscules==== | ||
+ | |||
+ | |||
+ | < | ||
+ | dd if=Fichier_Source of=Fichier_Cible conv=ucase | ||
+ | </ | ||
+ | \\ | ||
+ | ou\\ | ||
+ | \\ | ||
+ | < | ||
+ | dd if=Fichier_d\' | ||
+ | </ | ||
+ | |||
+ | ====Créer un lecteur virtuel==== | ||
+ | |||
+ | Le noyau Linux crée généralement nombre de disques virtuels que vous pouvez transformer en lecteurs virtuels. Vous devez d' | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | ce qui crée un disque virtuel de 16 Mo plein de zéros... | ||
+ | |||
+ | Ensuite : | ||
+ | |||
+ | < | ||
+ | mkfs.ext3 -m0 /dev/ram7 4096 | ||
+ | </ | ||
+ | |||
+ | place un système de fichiers sur le disque virtuel le transformant en lecteur virtuel. | ||
+ | <code lang=" | ||
+ | hdparm -t /dev/ram7 | ||
+ | /dev/ram7: Timing buffered disk reads: 16 MB in 0.02 seconds = 913.92 MB/sec | ||
+ | #Débit de lecture du disque bufférisé: | ||
+ | </ | ||
+ | |||
+ | Vous pouvez êtes tenté de ne mesurer le débit qu'une fois. Mais, en fait, il vaut mieux lancer plusieurs fois **hdparm -t / | ||
+ | |||
+ | Vous pouvez monter le disque virtuel avec : | ||
+ | |||
+ | < | ||
+ | mkdir / | ||
+ | mount / | ||
+ | </ | ||
+ | |||
+ | Maintenant, vous pouvez utiliser le lecteur virtuel comme un lecteur matériel. Ceci est particulièrement remarquable pour travailler sur des gros documents ou en programmation. Vous pouvez copier le gros document ou le projet de programmation sur le lecteur virtuel, | ||
+ | |||
+ | ====Copier la mémoire RAM dans un fichier==== | ||
+ | |||
+ | < | ||
+ | dd if=/dev/mem of=/ | ||
+ | </ | ||
+ | |||
+ | Le périphérique : | ||
+ | |||
+ | < | ||
+ | /dev/mem | ||
+ | </ | ||
+ | |||
+ | est votre mémoire système. Vous pouvez en fait copier tout périphérique de type bloc ou caractère dans un fichier avec dd. | ||
+ | |||
+ | =====Copies diverses===== | ||
+ | Vous pouvez en fait copier tout périphérique de type bloc ou caractère dans un fichier avec dd. | ||
+ | |||
+ | La capture de la mémoire sur un système rapide, avec **bs=1024** prend environ 60 secondes, un disque dur de 120 Go environ une heure, un CD vers un disque dur environ 10 minutes, une disquette vers un disque dur environ 2 minutes. | ||
+ | |||
+ | Avec dd, les images sur vos disquettes ne changeront pas du tout. Si vous avez une disquette DOS bootable, et que vous la sauvegardez sur votre disque dur sous forme de fichier image, quand vous restaurez cette image sur une autre disquette, elle sera bootable. | ||
+ | |||
+ | dd est un excellent outil pour créer une image d'un CD d' | ||
+ | |||
+ | dd écrira sur la console si vous oubliez la partie **of=/ | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | écrira le fichier monfichier dans la console. | ||
+ | |||
+ | ====Chercher dans la mémoire système==== | ||
+ | |||
+ | < | ||
+ | dd if=/dev/mem | hexdump -C | grep ' | ||
+ | </ | ||
+ | |||
+ | ====Effacer la RAM==== | ||
+ | |||
+ | Si vous avez besoin d' | ||
+ | |||
+ | < | ||
+ | mkdir /mnt/mem | ||
+ | mount -t ramfs /dev/mem /mnt/mem | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Cela écrira des zéros par dessus toute la mémoire non protégée, et gèlera la machine, vous aurez donc à rebooter (attention, cela empêche aussi le fonctionnement du journal du système de fichiers et pourrait corrompre le système de fichiers). | ||
+ | |||
+ | |||
+ | ====Lire des secteurs du disque==== | ||
+ | Si vous êtes curieux de savoir ce qu'il peut bien y avoir sur votre disque... | ||
+ | ===Lire le MBR=== | ||
+ | |||
+ | Si vous voulez voir à quoi ressemble un MBR, faites : | ||
+ | |||
+ | < | ||
+ | sudo dd if=/dev/sda count=1 2>/ | ||
+ | </ | ||
+ | (" | ||
+ | |||
+ | vous montrera le secteur 1, ou MBR. Le code de l' | ||
+ | ===Lire la fin du disque=== | ||
+ | Pour voir la fin du disque vous devez connaitre le nombre total de secteurs dans le disque, et le disque doit être configuré avec le Maximum Adressable Sector (le secteur adressable maximum) identique au Maximum Native Address (= MNA, l' | ||
+ | |||
+ | < | ||
+ | dd if=/dev/sda of=/ | ||
+ | </ | ||
+ | |||
+ | Ainsi cela lit secteur par secteur, et écrit le dernier secteur dans monfichier. Même avec l' | ||
+ | |||
+ | Pour un cylindre donné il y a 63 secteurs par tête, et on compte 255 têtes par cylindre. Chaque disque possède un nombre total bien déterminé de cylindres. Le nombre total d' | ||
+ | |||
+ | 512x63x255= nombre d' | ||
+ | |||
+ | 63x255= 16 065=nombre de secteurs par cylindre. | ||
+ | |||
+ | 512 est la taille en octets d'un secteur. | ||
+ | |||
+ | Avec 234 441 647 secteurs au total, et 16 065 secteurs par cylindre, vous obtenez 14 593.317584812 cylindres, un nombre qui n'est pas entier, et il y a alors quelques secteurs excédentaires qui ne constituent pas un cylindre entier. Ceci vous laisse avec 5 102 secteurs qui ne peuvent pas être partitionnés car une partition ne comprend que des cylindres entiers. C'est comme avoir une partie de personne, cela ne constitue pas vraiment une personne. | ||
+ | |||
+ | Ainsi, qu' | ||
+ | |||
+ | Pour y voir plus clair sur ces histoires de têtes, cylindres et secteurs, jetez un coup d'oeil plus haut. | ||
+ | |||
+ | Ceci écrit les 5 102 derniers secteurs dans monfichier. : | ||
+ | < | ||
+ | dd if=/dev/sda of=/ | ||
+ | </ | ||
+ | |||
+ | Lancez **Midnight Commander** (mc) pour voir le fichier. Si il y a quelque chose dedans, vous n'en avez pas besoin pour quoi que ce soit. Dans ce cas vous devriez écrire par dessus des caractères aléatoires. | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | Ecrasera les 5 102 secteurs en surplus sur notre notre disque dur Seagate de 120 Go | ||
+ | |||
+ | ===Vérifier une partie quelconque du disque=== | ||
+ | |||
+ | La commande : | ||
+ | < | ||
+ | dd if=/dev/sda of=/ | ||
+ | </ | ||
+ | |||
+ | écrira dans **monfichier**, | ||
+ | |||
+ | Ben oui, quoi !! On saute (**skip**) 4096 * 2000 = 8 192 000 octets, d' | ||
+ | |||
+ | Bon. Comme il y a 512 octets dans un secteur, on a sauté : 8 192 000/512 = 16 000 secteurs !! | ||
+ | |||
+ | Et ensuite on a envoyé (**count=1000**) 1000 blocs de 4096 octets, soit 4 096 000 octets, ce qui fait finalement | ||
+ | |||
+ | Vous pouvez ouvrir ce fichier avec un éditeur hexadécimal, | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Ainsi vous obtenez un //éditeur de disque//. Ce n'est pas le meilleur, mais il fonctionne. | ||
+ | ====Disquettes==== | ||
+ | ===Copier une disquette sur le disque dur=== | ||
+ | |||
+ | < | ||
+ | dd if=/dev/fd0 of=/ | ||
+ | </ | ||
+ | |||
+ | ou | ||
+ | |||
+ | < | ||
+ | dd if=/dev/fd0 of=/ | ||
+ | </ | ||
+ | |||
+ | 18b représente la taille en octets de 18 secteurs de 512 octets chacun, 80x multiplie par le nombre de cylindres, 2x multiplie par le nombre de têtes - au total 1474560 octets - . Cela paramètre une unique requête de lecture de 1474560 octets sur /dev/fd0 et une unique requête d' | ||
+ | |||
+ | Il faut comprendre que, dans le cas d'une disquette, pour chacun des 80 cylindres supposés, 2 têtes (fictives) lisent chacune une piste de 18 secteurs... Pour y voir plus clair en ce qui concerne têtes, cylindres et secteurs voir plus haut. | ||
+ | |||
+ | Cela crée une image de la disquette sur le disque dur, laissant intact l'info de boot. | ||
+ | |||
+ | Le second exemple utilise le **bs=** par défaut de 512, qui est la taille du secteur d'une disquette. | ||
+ | |||
+ | ===Copier l' | ||
+ | Faire : | ||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | ===Créer une disquette de démarrage=== | ||
+ | |||
+ | Vous pouvez créer une disquette de démarrage avec le fichier **boot.img**, | ||
+ | |||
+ | < | ||
+ | dd if=boot.img of=/dev/fd0 bs=1440k | ||
+ | </ | ||
+ | |||
+ | Ceci crée une disquette bootable et vous pouvez ajouter des données dessus. | ||
+ | |||
+ | ===Formater une série de disquettes=== | ||
+ | |||
+ | Prendre une disquette formatée vide qui n'a jamais été utilisée et faites : | ||
+ | < | ||
+ | dd if=/dev/fd0 of=/ | ||
+ | </ | ||
+ | |||
+ | ce qui crée une image de nouvelle disquette formatée sur votre disque dur, puis chargez dans le lecteur de disquettes l'une des disquettes que vous voulez formater et faites : | ||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | Cette disquette se retrouvera alors exactement dans l' | ||
+ | |||
+ | ===Ne copier que le MBR et le secteur de boot d'une disquette=== | ||
+ | |||
+ | Vous le copierez dans un fichier image sur le disque dur ainsi : | ||
+ | |||
+ | < | ||
+ | dd if=/dev/fd0 of=/ | ||
+ | </ | ||
+ | |||
+ | Cela copie les 2 premiers secteurs de la disquette. | ||
+ | |||
+ | ===Réparer une disquette infectée par un cheval de Troie DRM=== | ||
+ | Insérer la disquette et faites : | ||
+ | < | ||
+ | dd if=/ | ||
+ | dd if=/ | ||
+ | </ | ||
+ | Normalement, | ||
+ | |||
+ | ====Créer une image de la partition d'une autre machine en réseau==== | ||
+ | |||
+ | Faire démarrer les deux machines avec le CD helix, juste pour être absolument sûr. | ||
+ | |||
+ | Sur la machine source : | ||
+ | |||
+ | < | ||
+ | dd if=/dev/hda bs=1065b | netcat 192.168.0.1 1234 | ||
+ | </ | ||
+ | |||
+ | Sur la machine cible : | ||
+ | |||
+ | < | ||
+ | netcat -l -p 1234 | dd of=/dev/hdc bs=1065b | ||
+ | </ | ||
+ | |||
+ | Netcat est un programme, disponible par défaut sur presque toutes les installations Linux. C'est comme un couteau de l' | ||
+ | |||
+ | Voici comment cette commande fonctionne : la taille du bloc correspond à un cylindre. bs=1065b équivaut à un cylindre sur un disque LBA. La commande dd est tubée vers netcat, qui prend pour arguments : | ||
+ | 1/ L' | ||
+ | 2/ Le port que vous désirez utiliser (1234). | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | |||
+ | C'est un peu comme cela que Norton Ghost fonctionne pour copier l' | ||
+ | |||
+ | ====Faire une recherche de chaines de caractères dans une partition tout entière==== | ||
+ | |||
+ | Supposons que vous souhaitiez trouver si votre petite amie vous trompe, a des cybers amants, ou se conduit mal avec son ordinateur. Même si l' | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Cherchera dans toute la partition la chaîne de caractères (__pas d' | ||
+ | nous obtenons 67206, | ||
+ | |||
+ | ====Rechercher dans des fichiers effacés==== | ||
+ | |||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | Cette ligne de commande écrira à l' | ||
+ | Mais il est illégal d' | ||
+ | |||
+ | Notez tant qu'on y est que vous pouvez copier la mémoire du système sur un CD. Ceci est utile pour décrire le contenu de la mémoire sans contaminer le disque dur. Je recommande d' | ||
+ | (FIXME : La commande **cdrecord** n' | ||
+ | |||
+ | < | ||
+ | cdrecord dev=ATAPI: | ||
+ | </ | ||
+ | |||
+ | pour trouver le graveur CD : | ||
+ | |||
+ | < | ||
+ | cdrecord -scanbus=ATAPI | ||
+ | </ | ||
+ | |||
+ | dd ne copiera pas ou n' | ||
+ | |||
+ | Pour lire la mémoire ainsi enregistrée faites : | ||
+ | |||
+ | < | ||
+ | dd if=/dev/hdd | less | ||
+ | </ | ||
+ | |||
+ | On fera une recherche en s' | ||
+ | |||
+ | < | ||
+ | dd if=/dev/hdd | hexdump -C | grep ' | ||
+ | </ | ||
+ | |||
+ | La chaîne de caractères entre guillemets est n' | ||
+ | |||
+ | On peut utiliser pour cette recherche grep les classes de caractères POSIX : | ||
+ | |||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | * < | ||
+ | |||
+ | ====Sauvegarde de disquettes sur disque dur==== | ||
+ | |||
+ | Je sauvegarde toutes mes disquettes sur disque dur. Les disquettes ne sont pas éternelles, | ||
+ | |||
+ | < | ||
+ | dd if=/dev/fd0 of=/ | ||
+ | </ | ||
+ | |||
+ | Si ma disquette défaille, je peux faire des copies en nombre illimité : | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | </ | ||
+ | |||
+ | ====Lire le BIOS==== | ||
+ | |||
+ | < | ||
+ | dd if=/dev/mem bs=1k skip=768 count=256 2>/ | ||
+ | </ | ||
+ | |||
+ | ====Sauvegarder un disque en limitant la taille des fichiers==== | ||
+ | Limiter la taille des archives à 2Go et les zipper : | ||
+ | < | ||
+ | dd if=/dev/sdX conv=sync, | ||
+ | </ | ||
+ | Restitution des archives : | ||
+ | < | ||
+ | cat sdX.img.gz.* | gzip -dc | dd of=/dev/sdX conv=sync, | ||
+ | </ | ||
+ | Conserver les deux commandes avec les images, ainsi que la géométrie du disque : | ||
+ | < | ||
+ | fdisk -l /dev/sdX > geometry.txt | ||
+ | </ | ||
+ | =====Pour aller plus loin===== | ||
+ | ====Récupérer des secteurs défectueux==== | ||
+ | |||
+ | Il existe une variante de dd pour récupérer des données sur un média défectueux, | ||
+ | |||
+ | <note tip>Nota Bene : Il existe aussi des paquets dans les dépôts à utiliser avec précaution (voir [[: | ||
+ | |||
+ | L' | ||
+ | |||
+ | ====Sdd==== | ||
+ | |||
+ | Sdd est utile quand la taille des blocs d' | ||
+ | |||
+ | http:// | ||
+ | |||
+ | ====Un des meilleurs liens sur dd==== | ||
+ | |||
+ | http:// | ||
+ | |||
+ | ===== Pour plus de détails techniques ===== | ||
+ | |||
+ | ==== Les opérandes ==== | ||
+ | |||
+ | Les opérandes suivants sont supportés : | ||
+ | |||
+ | === if=fichier === | ||
+ | Spécifie le chemin d'où proviennent les données entrantes. L' | ||
+ | |||
+ | === of=fichier === | ||
+ | Spécifie le chemin où sont dirigées les données en sortie. La sortie standard est la sortie par défaut. | ||
+ | |||
+ | === ibs=n === | ||
+ | Spécifie que la taille des blocs d' | ||
+ | |||
+ | === obs=n === | ||
+ | Spécifie que la taille des blocs de sortie est n octets (512 par défaut). | ||
+ | |||
+ | === bs=n === | ||
+ | Spécifie la taille des blocs d' | ||
+ | |||
+ | Si aucune conversion autre que : sync, noerror et notrunc n'est spécifiée, | ||
+ | |||
+ | === cbs=n === | ||
+ | Spécifie la taille des blocs pour la conversion pour les opérandes block et unblock, en nombre d' | ||
+ | |||
+ | Pour les opérandes ascii et asciib, les données d' | ||
+ | |||
+ | === files=n === | ||
+ | Copie et concatène n fichiers d' | ||
+ | |||
+ | === skip=n === | ||
+ | Saute n blocs d' | ||
+ | |||
+ | Sur les fichiers pointables (' | ||
+ | |||
+ | === iseek=n === | ||
+ | Se positionne n blocs après le début du fichier d' | ||
+ | |||
+ | === oseek=n === | ||
+ | Se positionne n blocs après le début du fichier de sortie avant de copier | ||
+ | |||
+ | === seek=n === | ||
+ | Saute n blocs (en utilisant la taille de bloc de sortie spécifiée par bs ou obs ou la taille par défaut) après le début du fichier de sortie avant de commencer la copie. | ||
+ | |||
+ | Sur les fichiers non pointables (non ' | ||
+ | |||
+ | === count=n === | ||
+ | Ne copie que n blocs d' | ||
+ | |||
+ | === conv=valeur[, | ||
+ | Où les ' | ||
+ | * ascii : Convertit EBCDIC en ASCII. | ||
+ | * asciib : Convertit EBCDIC en ASCII en utilisant les translations de caractères compatibles avec BSD. | ||
+ | * ebcdic : Convertit ASCII en EBCDIC. Lors d'une conversion d' | ||
+ | * ebcdicb : Convertit ASCII en EBCDIC en utilisant les translations de caractères compatibles avec BSD. Lors d'une conversion d' | ||
+ | * ibm : Conversion légèrement différente de ASCII en EBCDIC. Lors d'une conversion d' | ||
+ | * ibmb : Conversion légèrement différente de ASCII en EBCDIC en utilisant les translations de caractères compatibles avec BSD. Lors d'une conversion d' | ||
+ | |||
+ | Les valeurs **ascii** (ou **asciib**), | ||
+ | |||
+ | * block : Les données d' | ||
+ | * unblock : Convertit les enregistrements de taille fixe en enregistrements de taille variable. Lit un nombre d' | ||
+ | |||
+ | Les valeurs **block** et **unblock** sont mutuellement exclusives. | ||
+ | |||
+ | * lcase : Transforme les majuscules en minuscules lorsque la locale définie par LC_CTYPE le permet. Les caractères pour lesquels aucune correspondance majuscules/ | ||
+ | * ucase : Transforme les minuscules en majuscules lorsque la locale définie par LC_CTYPE le permet. Les caractères pour lesquels aucune correspondance majuscules/ | ||
+ | * swab : Permute chaque paire d' | ||
+ | * noerror : N' | ||
+ | * notrunc : Le fichier de sortie ne subit pas de troncation (en son absence les blocs de données formés d' | ||
+ | * sync : Assemble chaque bloc d' | ||
+ | |||
+ | Si des opérandes autres que **conv=** sont spécifiés plus d'une fois, le dernier **operande=valeur** spécifié est utilisé. | ||
+ | |||
+ | Pour les opérandes **bs=**, **cbs=**, **ibs=**, et **obs=**, l' | ||
+ | * un nombre décimal positif | ||
+ | * un nombre décimal positif suivi de **k**, spécifiant ainsi une multiplication par 1024 | ||
+ | * un nombre décimal positif suivi de **M**, spécifiant ainsi une multiplication par 1024*1024 | ||
+ | * un nombre décimal positif suivi de **b**, spécifiant ainsi une multiplication par 512 | ||
+ | * deux ou plusieurs nombres décimaux positifs (avec ou sans **k** ou **b**) séparés par **x**, spécifiant ainsi le produit des valeurs indiquées. | ||
+ | |||
+ | ====Les variables d' | ||
+ | |||
+ | Les variables d' | ||
+ | |||
+ | LANG | ||
+ | |||
+ | Fournit une valeur par défaut pour les variables d' | ||
+ | |||
+ | LC_ALL | ||
+ | |||
+ | Si positionnée sur une valeur de chaîne de caractères non vide, prend le pas sur les valeurs de toutes les autres variables d' | ||
+ | |||
+ | LC_CTYPE | ||
+ | |||
+ | Définit la locale utilisée pour l' | ||
+ | |||
+ | LC_MESSAGES | ||
+ | |||
+ | Détermine la locale à utiliser pour déterminer le format et le contenu des messages de diagnostic écrits dans la sortie standard des erreurs et les messages informatifs écrits dans la sortie standard. | ||
+ | |||
+ | NLSPATH | ||
+ | |||
+ | Détermine l' | ||
+ | |||
+ | ====Obtenir un nombre d' | ||
+ | |||
+ | Remarquer que l' | ||
+ | |||
+ | < | ||
+ | dd if=/ | ||
+ | kill -USR1 $pid; sleep 1; kill $pid | ||
+ | 10899206+0 records in 10899206+0 records out | ||
+ | </ | ||
+ | |||
+ | === Affichage en temps réel de la progression === | ||
+ | Exemple d' | ||
+ | < | ||
+ | sudo dd if=/ | ||
+ | </ | ||
+ | Ce qui nous affiche | ||
+ | < | ||
+ | 9866070045 bytes (1 GB, 0,9 GB) copied, 479,188 s, 2,7 MB/s | ||
+ | </ | ||
+ | |||
+ | Vous pouvez aussi utiliser des versions de **dd** affichant en temps réel la progression comme **[[dcfldd|dcfldd]]** | ||
+ | ou **[[dc3dd|dc3dd]]**. \\ | ||
+ | dcfldd est 100% compatible avec dd, mais supporte quelques commandes supplémentaires et affiche par défaut la progression de l' | ||
+ | |||
+ | En cas d' | ||
+ | Ce qui nous affiche | ||
+ | < | ||
+ | 149+0 records in | ||
+ | 148+0 records out | ||
+ | 620756992 bytes transferred in 704.620913 secs (880980 bytes/sec) | ||
+ | </ | ||
+ | |||
+ | ===== Comparatif de vitesse dd/pv vs dcfldd vs dc3dd ===== | ||
+ | |||
+ | Mes tests sont faits sur une partition de 97.88 GiB. | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | Avec dc3dd : | ||
+ | < | ||
+ | |||
+ | dc3dd 7.2.641 started at 2015-10-13 01:27:13 +0000 | ||
+ | compiled options: | ||
+ | command line: ./dc3dd if=/ | ||
+ | device size: 205279232 sectors (probed), | ||
+ | sector size: 512 bytes (probed) | ||
+ | 105102966784 bytes ( 98 G ) copied ( 100% ), 4741 s, 21 M/s | ||
+ | |||
+ | input results for device `/ | ||
+ | | ||
+ | 0 bad sectors replaced by zeros | ||
+ | |||
+ | output results for device `/ | ||
+ | | ||
+ | |||
+ | dc3dd completed at 2015-10-13 02:46:15 +0000 | ||
+ | |||
+ | |||
+ | real 79m1.429s | ||
+ | user 2m23.994s | ||
+ | sys 13m0.181s | ||
+ | </ | ||
+ | Avec dcfldd : | ||
+ | < | ||
+ | 3207424 blocks (100232Mb) written. | ||
+ | 3207488+0 records in | ||
+ | 3207488+0 records out | ||
+ | |||
+ | real 58m37.099s | ||
+ | user 0m53.673s | ||
+ | sys 7m14.838s | ||
+ | </ | ||
+ | Avec dd/pv : | ||
+ | < | ||
+ | [==================================================================================================> | ||
+ | 18230+1567284 records in | ||
+ | 18230+1567284 records out | ||
+ | 105102966784 bytes (105 GB) copied, 3437.89 s, 30.6 MB/s | ||
+ | |||
+ | real 57m17.896s | ||
+ | user 0m20.587s | ||
+ | sys 8m17.316s | ||
+ | </ | ||
+ | And the winner is ... : dd ! :-) | ||
+ | |||
+ | =====Interfaces graphiques===== | ||
+ | https:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | FIXME Gdiskdump n'est plus mis à jour depuis 2011 et ne se lance pas, surtout si la configuration comporte GPT et MBR ensemble. | ||
+ | ---- | ||
+ | source : http:// |