web-dev-qa-db-fra.com

Utilisation de DD pour le clonage de disque

Il y a eu un certain nombre de questions concernant les outils de clonage de disque et dd a été suggéré au moins une fois. J'ai déjà envisagé d'utiliser dd moi-même, principalement en raison de sa facilité d'utilisation, et qu'il est facilement disponible sur presque toutes les distributions Linux amorçables.

Quelle est la meilleure façon d'utiliser dd pour cloner un disque? J'ai fait une recherche rapide sur Google, et le premier résultat est apparu tentative échouée . Y a-t-il quelque chose que je dois faire après avoir utilisé dd, c'est-à-dire qu'il y a quelque chose qui NE PEUT PAS être lu en utilisant dd?

187
falstro

dd est certainement le meilleur outil de clonage, il créera une réplique à 100% simplement en utilisant la commande suivante. Je n'ai jamais eu de problèmes avec ça.

dd if=/dev/sda of=/dev/sdb bs=32M

N'oubliez pas que lors du clonage de chaque octet, vous ne devez pas l'utiliser sur un lecteur ou une partition en cours d'utilisation. En particulier, les applications comme les bases de données ne peuvent pas très bien faire face à cela et vous pourriez vous retrouver avec des données corrompues.

165
Adam Gibbins

Pour économiser de l'espace, vous pouvez compresser les données produites par dd avec gzip, par exemple:

dd if=/dev/hdb | gzip -c  > /image.img

Vous pouvez restaurer votre disque avec:

gunzip -c /image.img.gz | dd of=/dev/hdb

Pour économiser encore plus d'espace, défragmentez le lecteur/la partition que vous souhaitez cloner au préalable (le cas échéant), puis mettez à zéro tout l'espace inutilisé restant, ce qui facilite la compression de gzip:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Attendez un peu, dd finira par échouer avec un message "disque plein", puis:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

En outre, vous pouvez obtenir un processus dd exécuté en arrière-plan pour signaler l'état en lui envoyant un signal avec la commande kill, par exemple:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Vérifiez votre système - la commande ci-dessus est pour Linux, OSX et BSD les commandes dd diffèrent par les signaux qu'elles acceptent (OSX utilise SIGINFO - vous pouvez appuyer sur Ctrl+T pour signaler l'état).

119
David Hicks

[~ # ~] attention [~ # ~] : la suppression d'un système de fichiers en direct peut corrompre des fichiers. La raison est simple, il n'a aucune compréhension de l'activité du système de fichiers qui peut se produire et ne fait aucune tentative pour l'atténuer. Si une écriture est partiellement en cours, vous obtiendrez une écriture partielle. Ce n'est généralement pas bon pour les choses et généralement fatal pour les bases de données. De plus, si vous bousiller les paramètres typo-enclins si et des paramètres malheur à toi. Dans la plupart des cas, rsync est un outil tout aussi efficace écrit après l'avènement de multitâche , et fournira des vues cohérentes des fichiers individuels .

Cependant, DD doit capturer avec précision l'état des bits d'un lecteur non monté. Chargeurs de démarrage, volumes llvm, UUID et étiquettes de partition, etc. Assurez-vous simplement que vous disposez d'un lecteur capable de mettre en miroir le lecteur cible bit par bit.

39
jldugger

Lorsque vous utilisez dd pour cloner un disque qui peut contenir des secteurs défectueux, utilisez "conv = noerror, sync" pour vous assurer qu'il ne s'arrête pas lorsqu'il rencontre une erreur et remplit le ou les secteurs manquants avec des octets nuls. C'est généralement la première étape que je prends si j'essaie de récupérer à partir d'un disque défaillant ou défaillant - obtenez une copie avant de faire des tentatives de récupération, puis effectuez la récupération sur le bon disque (cloné). Je laisse à l'outil de récupération le soin de gérer tous les secteurs vides qui ne peuvent pas être copiés.

En outre, vous pouvez constater que la vitesse de dd peut être affectée par le paramètre bs (taille de bloc). J'essaie généralement bs = 32768, mais vous aimerez peut-être le tester sur vos propres systèmes pour voir ce qui fonctionne le plus rapidement pour vous. (Cela suppose que vous n'avez pas besoin d'utiliser une taille de bloc spécifique pour une autre raison, par exemple si vous écrivez sur une bande.)

26
TimB

Pour cloner un disque, tout ce que vous devez vraiment faire est de spécifier l'entrée et la sortie vers dd:

dd if=/dev/hdb of=/image.img

Bien sûr, assurez-vous que vous disposez des autorisations appropriées pour lire directement à partir de/dev/hdb (je vous recommande de l'exécuter en tant que root) et que/dev/hdb n'est pas monté (vous ne voulez pas copier pendant le changement de disque - le montage en lecture seule est également acceptable). Une fois terminé, image.img sera un clone octet par octet de tout le disque.

Il y a quelques inconvénients à utiliser dd pour cloner des disques. Tout d'abord, dd copiera l'intégralité de votre disque, même l'espace vide, et s'il est fait sur un grand disque, il peut en résulter un fichier image extrêmement volumineux. Deuxièmement, dd ne fournit absolument aucune indication de progression, ce qui peut être frustrant car la copie prend beaucoup de temps. Troisièmement, si vous copiez cette image sur d'autres lecteurs (à nouveau, en utilisant dd), ils doivent être aussi grands ou plus grands que le disque d'origine, mais vous ne pourrez pas utiliser l'espace supplémentaire que vous pourriez avoir sur le disque cible jusqu'à ce que vous redimensionnez vos partitions.

Vous pouvez également effectuer une copie directe de disque à disque:

dd if=/dev/hdb of=/dev/hdc

mais vous êtes toujours soumis aux limitations ci-dessus concernant l'espace libre.

En ce qui concerne les problèmes ou les problèmes, dd, pour la plupart, fait un excellent travail. Cependant, il y a quelque temps, j'avais un disque dur qui était sur le point de mourir, alors j'ai utilisé dd pour essayer de copier les informations que je pouvais retirer avant de mourir complètement. On a alors appris que dd ne gérait pas très bien les erreurs de lecture - il y avait plusieurs secteurs sur le disque que dd ne pouvait pas lire, ce qui obligeait dd à abandonner et à arrêter la copie. À l'époque, je ne pouvais pas trouver un moyen de dire à dd de continuer malgré une erreur de lecture (bien que il apparaît comme s'il avait ce paramètre), j'ai donc passé beaucoup de temps à spécifier manuellement sauter et chercher à sauter par-dessus les sections illisibles.

J'ai passé un peu de temps à rechercher des solutions à ce problème (après avoir terminé la tâche) et j'ai trouvé un programme appelé ddrescue , qui, selon le site, fonctionne comme dd mais continue à lire même s'il rencontre un Erreur. Je n'ai jamais réellement utilisé le programme, mais cela vaut la peine d'être considéré, surtout si le disque à partir duquel vous copiez est ancien, ce qui peut avoir de mauvais secteurs même si le système semble correct.

17
Kyle Cronin

Si le lecteur source est endommagé, vous aurez plus de chance d'utiliser dd_rhelp avec dd_rescue (ma préférence personnelle) ou GNU ddrescue .

La raison derrière cela est que, en cas d'erreurs de lecture, dd continue d'essayer et d'essayer et d'essayer - en attendant potentiellement longtemps que des délais d'attente se produisent. dd_rescue fait des choses intelligentes comme lire jusqu'à une erreur, puis choisir un endroit plus loin sur le disque et lire en arrière jusqu'à la dernière erreur, et dd_rhelp est essentiellement un dd_rescue gestionnaire de session - démarrage et reprise intelligents dd_rescue s'exécute pour accélérer à nouveau.

Le résultat final de dd_rhelp est le maximum de données récupérées en un minimum de temps. Si tu pars dd_rhelp en cours d'exécution, au final, il fait exactement le même travail que dd en même temps. Cependant, si dd a rencontré des erreurs de lecture à l'octet 100 de votre disque de 100 Go, vous devrez attendre longtemps pour récupérer les 9 999 900 autres octets *, tandis que dd_rhelp + dd_rescue permettrait de récupérer la plus grande partie des données beaucoup plus rapidement.

11
Ben Williams

Le disque source ne doit pas avoir de système de fichiers monté. En tant qu'utilisateur capable de lire le périphérique de bloc (root fonctionne), exécutez 'dd if =/dev/sda ....'

Maintenant, l'une des choses intéressantes ici est que vous créez un flux d'octets ... et vous pouvez faire beaucoup avec cela: le compresser, l'envoyer sur le réseau, le fragmenter en plus petits blobs, etc.

Par exemple:

dd if=/dev/sda | ssh user@backupserver "cat > backup.img"

Mais plus puissamment:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

Ce qui précède copie une image compressée du disque dur source sur un système distant, où il la stocke dans des morceaux numérotés 2G en utilisant le nom de l'hôte source tout en vous tenant informé de la progression.

Notez que selon la taille du disque, la vitesse du processeur sur la source, la vitesse du processeur sur la destination, la vitesse du réseau, etc. Vous pouvez ignorer la compression, ou effectuer la compression sur le côté distant, ou activer la compression de ssh.

7
retracile

Pour cloner un disque, il vous suffit de spécifier l'entrée et la sortie dans dd:

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

Bien sûr, assurez-vous que vous disposez des autorisations appropriées pour lire directement à partir de /dev/hdb (Je recommanderais de courir en tant que root), et que /dev/hdb n'est pas monté (vous ne voulez pas copier pendant le changement de disque). Une fois terminé, hdb.img sera un clone octet par octet de tout le disque.

Il y a quelques inconvénients à utiliser dd pour cloner des disques. Tout d'abord, dd copiera l'intégralité de votre disque, même l'espace vide, et si cela est fait sur un grand disque, il peut en résulter un fichier image extrêmement volumineux. Deuxièmement, dd ne fournit absolument aucune indication de progression, ce qui peut être frustrant car la copie prend beaucoup de temps. Troisièmement, si vous copiez cette image sur d'autres lecteurs (à nouveau, en utilisant dd), ils doivent être aussi grands ou plus grands que le disque d'origine, mais vous ne pourrez pas utiliser l'espace supplémentaire que vous pourriez avoir sur le disque cible jusqu'à ce que vous redimensionnez vos partitions.

Vous pouvez également effectuer une copie directe de disque à disque:

dd if=/dev/hdb of=/dev/hdc

mais vous êtes toujours soumis aux limitations ci-dessus concernant l'espace libre.

Le premier inconvénient peut être résolu en compressant les données lors de la copie. Par exemple:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

Le deuxième inconvénient peut être résolu en utilisant l'outil pipeview (pv). Par exemple:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Je ne connais aucun moyen de surmonter le troisième inconvénient.

De plus, vous pouvez accélérer le temps de copie en indiquant à dd de travailler avec des blocs de données plus volumineux. Par exemple:

dd if=/dev/hdb of=hdb.img bs=1024
6
James Sumners

Une autre bonne chose que vous pouvez faire avec les disques DD et de secours est de copier les données sur le réseau:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Vous pouvez coller gzip dans ces deux pipelines si le réseau n'est pas local. Pour progresser, utilisez pv. Pour que le netcat de local_machine se ferme une fois la copie terminée, vous pouvez ajouter -w 5 ou quelque chose.

5
user5692

Gardez à l'esprit que dd crée un copie exacte, y compris tout l'espace vide.

Cela signifie:

  1. Le deuxième disque doit être au moins aussi grand que le premier
  2. Si le 2ème disque est plus grand, de l'espace supplémentaire sera gaspillé (le système de fichiers peut être étendu pour vous)
  3. Si le lecteur source n'est pas plein, dd perdra beaucoup de temps à copier l'espace vide.
  4. Vous pouvez copier le disque entier ou une seule partition de cette façon.
  5. S'il s'agit d'un lecteur de démarrage, je suis sûr que vous devez installer le chargeur de démarrage après avoir utilisé dd

J'espère que cela vous sera utile

4
Brent
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Cela copiera le disque et ignorera les blocs avec des erreurs, ce qui est très important.

Ce sont les options de base et essentielles pour utiliser dd pour cloner ou sauver un disque.

Je ne voulais pas poster une autre réponse, mais il n'y avait pas de bonnes réponses avec les options essentielles "conv = sync, noerror" parmi les 25 déjà publiées.

4
Sam Watkins

Vous pourriez en fait essayer quelque chose comme ça

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

pour ignorer toutes les erreurs et avoir le clone exact d'une partition ou d'un disque dur

3
hirol

Une autre grande fonctionnalité est la copie des MBR, des tables de partition et des enregistrements de démarrage.

Juste

dd if=/dev/sda of=parttable bs=512 count=1

et dans l'autre sens quand vous l'écrivez. Polonais avec fdisk après.

Vous vous sentez beaucoup plus en sécurité lorsque vous avez sauvegardé votre table de partition.

En outre, cela rend la migration vers un autre disque dur (tout en changeant la structure des partitions) une joie.

3
alamar

Pour référence future, il peut être intéressant de consulter ddrescue . Cela m'a sauvé la journée plusieurs fois.

3
Anders Hansson

C'est une sorte de hack bon marché, mais c'est un moyen rapide et sale de surveiller votre processus DD.

Exécutez votre commande dd. Ouvrez un nouveau shell et faites un ps awx pour trouver le PID de votre processus dd. Maintenant, dans le nouveau type de Shell, regardez -n 10 kill -USR1 {pid de votre processus DD}

Cela ne fera rien dans la fenêtre de sortie de la montre, mais de retour dans le DD Shell d'origine, DD commencera à produire des rapports d'état toutes les 10 secondes. Vous pouvez bien sûr changer le -n 10 dans la commande watch en tout autre intervalle de temps.

Tachyon

3
Tachyon

La plupart des informations ont été décrites dans les recettes insérées précédentes, mais toutes n'ont pas été décrites.

Sous Linux, vous pouvez cloner le disque dur ou partitionner par la commande dd. Attention, lorsque vous vous tromperez, vous perdrez toutes vos données.

Dans un premier temps, la destination ne doit pas être utilisée, d'autre part la source ne doit pas être utilisée ou remontée en mode lecture seule. Sinon, la copie sera endommagée. Si le remontage est impossible, veuillez créer un lecteur amorçable (hdd/ssd/pendrive) dans n'importe quelle distribution Linux live. Je prever knoppix, mais c'est votre choix. Si cela est possible, vous pouvez démarrer ou changer le niveau du système en 1, pour le mode mono-utilisateur, ou vous pouvez redémarrer directement le système en mode mono-utilisateur, cela dépend de la distribution. Si vous clonez une seule partition, cette partition doit être démontée ou remontée dans RO:

umount /mountpoint_or_device

ou

remount -o,ro /mountpoint_or_device

Si vous souhaitez cloner l'intégralité du disque dur, vous devez démonter ou remonter toutes les partitions.

Vous devez identifier le périphérique source et de destination. s'il vous plaît regardez le dmesg, ici sont stockées toutes les informations nécessaires sur l'appareil, avec le vendeur, etc. l'identification peut également être basée sur la taille de l'appareil, si elle est différente. Ensuite, la destination doit être identique ou supérieure à la source. vous devez calculer la source, par exemple: fdisk -l/dev/sda sauf la géométrie de la partition (il peut y avoir GPT), vous récupérerez: 1. la taille totale du disque en Go et octets 2. la géométrie historique et le nombre total de secteurs, informations très importantes 3. taille de bloc en octets, généralement 512.

par exemple:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

essayons ensuite plus de 512 diviseurs, nous avons 41943040 secteurs physiques:

41943040/256 = 163840, très bien, nous pouvons faire une copie en bloc de 256 secteurs. pouvons-nous plus? essayons: 41943040/1024 = 40960, je pense que cela suffit, nous allons sélectionner celui-ci. Comptons la taille du groupe de secteurs: 512 (taille de secteur) * 1024 = 524288 octets eq 512K. Ensuite, nous pouvons utiliser le paramètre bs = 512K ou moins, mais divisez-le par 2 ^ x. Pour les disques durs modernes avec un grand cache interne, c'est assez pratique. pour les disques plus anciens avec un cache beaucoup plus petit, une valeur de 32 Ko ou moins est suffisante.

Ensuite, après préparation, nous pouvons faire une copie: dd if =/dev/source_devide of =/dev/destination_device bs = 32K et la copie sera effectuée. Faites attention, toute erreur écrasera vos données d'importation et. À destination, tout sera écrasé.

Si vous essayez de récupérer des données sur le disque source endommagé, utilisez mieux la taille du secteur natif, généralement 512 octets, et ajoutez l'option conv = notrunc. sinon les trous dans la source abandonnés par les secteurs défectueux seront rejoints par un changement de secteur sur la destination. Cela endommagera la copie avec peu de chance de réparation. alors la commande sera:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

et attendez longtemps que le lecteur et le système abandonnent et marchent secteur par secteur jusqu'à la fin.

dd est un outil utile pour déplacer la partition vers un nouvel emplacement. Créez simplement une partition, créez dd vers une nouvelle partition (cela peut être plus grand, beaucoup plus grand), et si c'est possible, développez le système de fichiers copié pour remplir toute nouvelle partition, ext3/ext4/xfs/zfs/btrfs ont cette possibilité. Enfin, vous devez changer/etc/fstab, puis démonter/mount si c'est possible, ou redémarrer le système.

Bien sûr, vous pouvez cloner n'importe quel type de partition. La commande dd ne regarde pas le type de système de fichiers, elle ne fait rien avec sa structure. alors cette commande peut être utilisable pour cloner NTFS ou d'autres types de partition.

Il y a une astuce. Lorsque vous n'avez pas défini de paramètre, dd mettra la sortie dans sa sortie standard. alors vous pouvez faire une copie brute compressée du disque ou de la partition, par exemple:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Bien sûr, cela devrait être fait hors ligne. vous pouvez restaurer cela en:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, tous les disques durs sda seront remplacés par cette sauvegarde et toutes les données actuelles seront perdues. Vous pouvez le faire également avec la partition Windows NTFS et le disque dur utilisés par cela. Bien sûr, vous pouvez utiliser une autre commande de compression, selon votre choix.

2
Znik

Comment copier en utilisant dd (dans ce cas sur une machine distante, mais le même principe s'applique à une copie locale) qui montre la progression.

Il fonctionne en stockant le pid via le descripteur de fichier 3 dans/tmp/pid, qui est ensuite utilisé pour les éliminations suivantes avec le signal USR1. Une ride était de filtrer la sortie de la progression sur stderr sur une seule ligne via le filtrage de stderr à travers un sous-shell.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done
2
Edward Groenendaal

dd fournit des informations de progression - enfin la plupart des versions sous Linux. J'en ai vu qui ne se souviennent pas de la saveur unix.

La page de manuel indique: L'envoi d'un signal USR1 à un processus "dd" en cours d'exécution permet d'imprimer les statistiques d'E/S sur l'erreur standard, puis de reprendre la copie.

J'utilise cette fonctionnalité régulièrement.

2
Steven

Quelqu'un a dû dire ceci: essayez Clonezilla (http: // clonezilla.org/)

Qu'est ce que tu obtiens? Pour copier uniquement les parties utilisées du système de fichiers. Clonezilla utilise dd, grub, sfdisk, parted, partimage, ntfsclone et/ou partclone. Selon les options que vous choisissez.

Une documentation décente peut être trouvée sur: http: // clonezilla.org/clonezilla-live/doc/

2
Roflo

Vous pouvez créer un fichier image compressé de la partition (ou du disque) à la volée en utilisant bzip2 ou gzip au lieu de dd. C'est bien pour stocker des images sur des supports amovibles:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Si le disque a été largement utilisé auparavant, vous pouvez améliorer la compression en remplissant tout l'espace inutilisé avec des zéros avant l'imagerie:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Pour restaurer l'image sur un autre disque, il vous suffit de:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY
1
JCCyC

Une chose que vous devez savoir lors de la création d'un disque complet est que cela écrasera l'enregistrement de démarrage principal du disque récepteur. Il contient la table de partition et d'autres informations vitales. Si le nouveau disque n'est pas le même que l'ancien disque, cela peut créer toutes sortes de tables. La copie sur des partitions est généralement plus sûre (et les partitions de swap n'ont pas à être copiées)

0
Paul de Vrieze

Je ne suis plus administrateur depuis de nombreuses années maintenant, mais je sais que 'dd' est à la hauteur. J'ai utilisé cette technique régulièrement à la fin des années 80 sur les ordinateurs Sun Sparc et 386i. J'ai commandé un client à plus de 30 systèmes 386i exécutant CAD logiciel distribué sur plusieurs bandes QIC.

Nous avons installé sur le premier ordinateur, configuré l'application, exécuté sys-unconfig de SunOS, placé le lecteur dans une boîte à chaussures avec une adresse SCSI différente, puis procédé au 'jj' sur les 30 autres lecteurs.

0
pbrooks100

Juste un avertissement aux débutants qui doit être dit: au moins avec certaines versions, bs = X signifie que la mémoire à la taille de X sera littéralement allouée. bs = 2 Go sur un système avec 1 Go de RAM et un swap insuffisant FERA de mauvaises choses.

0
rackandboneman

Pour une raison quelconque, dd échoue lors de l'imagerie de CD avec des pistes audio. Vous devez utiliser cdrdao ou quelque chose de similaire pour obtenir un fichier image + TOC.

0
Matt

Pour les volumes NTFS, je préfère utiliser ntfsclone . Cela fait partie du package ntfsprogs .

0
Ed Brannin

Comme d'autres l'ont mentionné ci-dessus, l'un des pièges du clonage d'un système de fichiers monté est la corruption potentielle des données. Cela ne s'applique évidemment pas aux clones de lecteurs complets, mais si vous utilisez LVM, vous pouvez créer un instantané du volume logique et dd à partir de l'instantané pour obtenir une image cohérente.

0
Ophidian