Utilisation de DD pour le clonage de disque

182

Un certain nombre de questions concernant les outils de clonage de disque ddont été suggérées au moins une fois. J'ai déjà envisagé de m'utiliser ddmoi-même, principalement pour sa facilité d'utilisation, et sa disponibilité sur pratiquement toutes les distributions Linux amorçables.

Quelle est la meilleure façon d'utiliser ddpour cloner un disque? J'ai fait une recherche rapide sur Google et le premier résultat était une tentative apparemment infructueuse . Dois-je faire quelque chose après l’utilisation dd, c’est-à-dire qu’il ne PEUT PAS être lu en utilisant dd?

falstro
la source
Je sais comment dd fonctionne, ma question portait plutôt sur les problèmes connus liés à dd lors du clonage de disques (comme décrit par le lien), ce n’était peut-être pas très clair. Ce que sa réponse contient et que la vôtre ne dit pas: "Je n'ai jamais eu de problèmes avec cela". J'ai également voté votre réponse, car vous avez certainement présenté des points intéressants (j'aime celui qui indique l'absence d'indication de progrès).
falstro
1
On dirait que vous avez la bosse Spolsky: joelonsoftware.com/items/2009/05/29.html
Kyle Cronin
n'a pas vu cela ici quand j'ai demandé (et répondu) une question similaire sur superuser - superuser.com/questions/11453/…
Warren
3
Il est ironique que Joel ait lié la question à un bon exemple de faute de serveur, bien qu'aucune des réponses n'ait été bonne. Il n’existait pas de réponse parmi les 25 (sans les commentaires) avec les bonnes ddoptions pour ignorer les blocs défectueux - ce qui est essentiel lors du clonage de disques à des fins de récupération. J'ai ajouté une meilleure réponse, qui peut cloner des disques ayant des blocs défectueux:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins
Je pense que dd restore pourrait "échouer" si on parlait de systèmes de fichiers dépendant de la géométrie du disque et que la restauration était effectuée sur des disques durs non identiques? J'ai eu des échecs lors de la restauration du DD, et je pense que c'était le problème dans mon cas.
Marco

Réponses:

160

dd est très 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

Sachez 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 telles que les bases de données ne peuvent pas très bien gérer cela et vous pourriez vous retrouver avec des données corrompues.

Adam Gibbins
la source
12
Bien sûr, tant que / dev / sdb est au moins aussi grand que / dev / sda ...
Eddie
22
ajoutez un "bs = 100M conv = notrunc" et c'est beaucoup plus rapide dans mon expérience.
Tim Williscroft
127
soyez juste très prudent avec les lettres 'i' et 'o' ...
bandi
17
Personne ne semble connaître cette astuce ... dd est un programme de copie asymétrique, ce qui signifie qu'il lira en premier, puis en écriture, puis en retour. Vous pouvez diriger dd pour lui - même et le forcer à effectuer la copie symétrique, comme ceci: dd if=/dev/sda | dd of=/dev/sdb. Lors de mes tests, l'exécution de la commande sans le canal m'avait donné un débit de ~ 112 Ko / s. Avec le tuyau, j'ai eu ~ 235kb / s. Je n'ai jamais rencontré de problèmes avec cette méthode. Bonne chance!
Mistiry
13
@ Mystère, ce n'est pas le sens du mot symétrique.
Psusi
113

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 / partition que vous souhaitez cloner au préalable (le cas échéant), puis mettez à zéro tout l'espace inutilisé, facilitant ainsi la compression par 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 faire en sorte qu’un processus dd fonctionnant en arrière-plan indique 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 concerne Linux, OSX et BSD Les commandes dd diffèrent par les signaux acceptés (OSX utilise SIGINFO- vous pouvez appuyer sur Ctrl+ Tpour signaler l’état).

David Hicks
la source
2
Est-ce que cela fonctionne aussi avec les fers "modernes" tels que les BTRFS, NILFS, [tout ce dont vous pouvez rêver]?
Steve Schnepp Le
DD fonctionne sur des périphériques en mode bloc, à un niveau d'abstraction inférieur au système de fichiers, il devrait donc, oui. Je n'ai pas vraiment essayé, cependant. Hmm, NILFS a l'air intéressant, je vais devoir regarder ça.
David Hicks
4
+1 pour le kill -SIGUSR1 %1, et la commande OSX dd accepte heureusement SIGUSR1 ... super utile, merci!
Stuartc
1
+1 car Kill -SIGUSR1 1234je cherchais ça.
hot2use
2
Devrait - il être: dd if=/dev/hdb | gzip -c > /image.img.gz?
Mike Causer
37

ATTENTION : le fait de créer un système de fichiers actif peut corrompre les fichiers. La raison est simple, il ne comprend pas l'activité du système de fichiers qui peut se produire et ne tente pas de 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 bousillez la typo sujette si et des paramètres, malheur à vous. Dans la plupart des cas, rsync est un outil tout aussi efficace, conçu après l’avènement du multitâche et qui fournit des vues cohérentes de fichiers individuels.

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

Jldugger
la source
7
Je suppose que ce syncn’est pas la solution aux problèmes de corruption de fichiers. Que se passe-t-il si un démon ou quelque chose écrit plus de fichiers après le sync, pendant l' ddopération?
Supprimé
5
C'est une bonne idée de démonter le disque en premier (ou de remonter en lecture seule), mais ce n'est pas toujours possible
Alex Bolotov Le
1
Dans ce cas, vous utilisez rsync et le laissez manipuler les fichiers de façon magique pour obtenir un fichier cohérent, puis laissez la sémantique de Copy On Write gérer les écritures entrantes.
Jldugger
4
J'aimerais ajouter que l'exécution de dd sur un système de fichiers monté NE CORRUPTERA PAS les fichiers du système de fichiers monté, mais ce que cela signifie ici, c'est que la copie du système de fichiers sera nécessairement dans un bon état connu.
3molo
1
L'utilisation rsyncgarantira la cohérence des données internes du système de fichiers de destination. Cela ne garantira pas la cohérence des données dans les fichiers. Pour ce faire, vous devrez verrouiller les fichiers et tous les programmes qui écrivent dans les fichiers devront respecter ces verrous.
Martin Geisler
26

Lorsque vous utilisez dd pour cloner un disque pouvant 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 fais si je tente de récupérer un disque en panne ou en panne: obtenez une copie avant toute tentative 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 vierges qui ne pourraient pas être copiés.

Vous pouvez également constater que la vitesse de dd peut être affectée par le paramètre bs (block size). J'ai l'habitude d'essayer bs = 32768, mais vous voudrez 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.)

TimB
la source
13
Si vous avez un disque avec des secteurs défectueux, vous devriez vraiment utiliser 'ddrescue' au lieu de dd. C'est beaucoup plus efficace et a beaucoup plus de chances de récupérer plus de données. (Ne le confondez pas avec dd_rescue, qui n'est pas aussi bon)
davr
3
ne doit pas utiliser une taille de bloc importante si vous essayez de sauter des blocs défectueux, sinon trop. 4096 est assez grand.
Sam Watkins
17

Pour cloner un disque, tout ce que vous avez à 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 lorsque le disque est en cours de modification - le montage en lecture seule est également acceptable). Une fois terminé, image.img sera un clone octet par octet du disque entier.

L'utilisation de dd pour cloner des disques présente quelques inconvénients. D'abord, dd copiera l'intégralité de votre disque, même de l'espace disponible, et si cela est fait sur un disque de grande taille, un fichier image extrêmement volumineux peut en résulter. Deuxièmement, dd ne fournit absolument aucune indication de progrès, ce qui peut être frustrant car la copie prend beaucoup de temps. Troisièmement, si vous copiez cette image sur d'autres lecteurs (encore une fois, à l'aide de dd), ils doivent être aussi grands ou plus grands que le disque d'origine. Cependant, vous ne pourrez utiliser aucun espace supplémentaire disponible sur le disque cible tant que vous ne l'utiliserez pas. 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 pièges, dd fait généralement un excellent travail. Cependant, il y a quelque temps, j'avais un disque dur sur le point de mourir et j'ai donc utilisé dd pour essayer de copier les informations que je pouvais obtenir 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 trouvais pas le moyen de dire à dd de continuer malgré une erreur de lecture (bien qu’il semble que ce paramètre existe), j’ai donc passé un peu de temps à spécifier manuellement skip et chercher à sauter par-dessus le sections illisibles.

J'ai passé un peu de temps à chercher des solutions à ce problème (une fois la tâche terminée) et j'ai trouvé un programme appelé ddrescue qui, selon le site, fonctionne comme dd mais continue de lire même s'il rencontre une erreur. Je n'ai jamais réellement utilisé le programme, mais cela vaut la peine d'être pris en compte, en particulier si le disque à partir duquel vous effectuez la copie est ancien, ce qui peut avoir des secteurs défectueux même si le système semble bien fonctionner.

Kyle Cronin
la source
7
... dd ne fournit absolument aucune indication de progrès ... - bon, ce n'est pas vrai - il existe un moyen un peu compliqué de montrer les progrès - vous devez connaître le pid du processus dd ("ps -a | grep dd"), puis envoie le signal USR1 à ce processus - 'kill -USR1 <dd_pid_here>' (sans <>), ce qui force dd à afficher les informations de progression.
Michal Bernhard le
4
"plusieurs secteurs sur le disque que dd ne pouvait pas lire": Je pense que conv=sync,noerrorcela aiderait.
Gauthier
2
Les conv=sync,noerroroptions sont essentielles car elles permettent à dd d’ignorer les blocs défectueux et de les supprimer dans l’image afin que les éléments soient correctement alignés. Des accessoires pour les très rares personnes qui ont commenté quelque chose à ce sujet.
Sam Watkins
1
GNU ddrescuefournit un indicateur de progression sans aucune option spéciale. Vous pouvez arrêter la copie et reprendre là où vous l'avez laissée.
endolith
2
Un moyen moins délicat de faire des progrès avec dd est d'ajouter l'optionstatus=progress
James
11

Si le disque source est endommagé, vous aurez plus de chance dd_rhelpavec dd_rescue(ma préférence personnelle) ou GNU ddrescue.

La raison derrière ceci est que, sur les erreurs de lecture, ddcontinue d'essayer et d'essayer et d'essayer encore et encore - d'attendre potentiellement longtemps avant que les délais ne se produisent. dd_rescuefait des choses intelligentes comme lire jusqu'à une erreur, puis choisir un emplacement plus loin sur le disque et lire à l'envers jusqu'à la dernière erreur. Il dd_rhelps'agit en fait d'un dd_rescuegestionnaire de session: il dd_rescuelance et reprend intelligemment des cycles pour le rendre plus rapide encore.

Le résultat final de dd_rhelpest le maximum de données récupérées en un minimum de temps. Si vous laissez en dd_rhelpcours d'exécution, il effectue exactement le même travail que dddans le même temps. Toutefois, si vous ddrencontrez des erreurs de lecture au niveau de l'octet 100 de votre disque de 100 Go, vous devrez patienter longtemps pour récupérer les 9 999 999 autres octets *, alors que dd_rhelp+ dd_rescuerécupérerait le volume de données beaucoup plus rapidement.

Ben Williams
la source
1
Un peu d'aide pour choisir entre dd_rescue et ddrescue: askubuntu.com/a/211579/50450
Johann
7

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 (la racine fonctionne), exécutez 'dd if = / dev / sda ....'

Une des choses intéressantes ici est que vous créez un flux d'octets ... et vous pouvez faire beaucoup avec ça: le compresser, l'envoyer sur le réseau, le réduire en blobs plus petits, 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"

L’image ci-dessus copie une image compressée du disque dur source sur un système distant, où elle est stockée sous forme de fragments 2G numérotés à l’aide du nom de l’hôte source tout en vous informant 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, effectuez la compression côté distant ou activez la compression SSH.

rétracile
la source
+1 La tuyauterie via gzip permet d’économiser beaucoup de temps et de bande passante!
M. Dudley le
Je devrais également noter que l'ajout de 'bs = 1M' à la commande dd améliorera généralement considérablement la vitesse.
retracile
6

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

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

Bien sûr, assurez-vous que vous disposez des autorisations appropriées pour lire directement /dev/hdb(je vous recommande de l'exécuter en tant que root), et qui /dev/hdbn'est pas monté (vous ne souhaitez pas copier pendant la modification du disque). Une fois terminé, hdb.imgsera un clone octet par octet de tout le disque.

Il existe quelques inconvénients à utiliser ddpour cloner des disques. Tout d’abord, ddcopiez votre disque entier, même l’espace vide, et si vous le faites sur un disque de grande taille, un fichier image extrêmement volumineux peut en résulter. Deuxièmement, ne dddonne absolument aucune indication de progrès, ce qui peut être frustrant, car la copie prend beaucoup de temps. Troisièmement, si vous copiez cette image sur d'autres lecteurs (encore une fois, à l'aide de dd), ils doivent être aussi grands ou plus grands que le disque d'origine. Cependant, vous ne pourrez utiliser aucun espace supplémentaire disponible sur le disque cible tant que vous ne l'utiliserez pas. 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 au fur et à mesure que vous effectuez 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’ pvoutil pipeview ( ). 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 demandant ddde travailler avec de gros morceaux de données. Par exemple:

dd if=/dev/hdb of=hdb.img bs=1024
James Sumners
la source
1
Vous avez déjà expliqué comment surmonter le troisième inconvénient: redimensionner les partitions. L'élargissement d'une partition est généralement une opération sûre et rapide (par opposition à la réduction ou au déplacement, ce qui est plus lent et plus dangereux car il déplace des données).
davr
gzipping ne fonctionnera pas avec un disque utilisé depuis un certain temps, car il sera rempli avec les données actuelles ou supprimées. gzip ne fonctionnera que si l’espace vide est à zéro, ce qui n’est le cas que pour un tout nouveau disque.
Tozz
3
@Tozz: Vous pouvez améliorer la compressibilité d'une image de système de fichiers en remplissant le système de fichiers avec un fichier contenant des 0, en le synchronisant sur le disque, puis en le supprimant. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Intelligence supplémentaire Modulo dans la couche système de fichiers.)
retracile
5

Une autre bonne chose que vous pouvez faire avec les disques de secours et de secours est la copie de 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 netcat de local_machine soit arrêté une fois la copie terminée, vous pouvez ajouter -w 5quelque chose.

utilisateur5692
la source
9
Ce n'est pas tout à fait correct. Il manque quelque chose à la commande 'remote_machine', telle que > disk_backup.imgou |dd of=/dev/sdbou quelque chose d'autre, en fonction de ce que vous voulez faire. Je suppose que vous ne voulez pas vider une image disque sur stdout.
davr
1
Et jetez gzip aux deux extrémités pour réduire davantage les données envoyées.
3molo
4

N'oubliez pas que dd en fait une copie exacte , y compris tout l'espace vide.

Cela signifie:

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

J'espère que c'est utile

Brent
la source
8
Si vous clonez l'intégralité du disque dur, vous clonez également le chargeur de démarrage.
Cristian Ciupitu
welll, juste un peu, mais vous ne pourriez pas simplement utiliser gparted pour revivre la partition / le disque en cours de copie vers ce que vous utilisez, puis déposez dd? En supposant que ce soit une image unique, cela devrait atténuer ce problème.
bbqchickenrobot
3

Pour référence future, consultez ddrescue . Cela a sauvé ma journée plusieurs fois.

Anders Hansson
la source
3

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 l’autre direction lorsque vous l’écrivez. Polonais avec fdiskaprès.

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

En outre, la migration vers un autre disque dur (tout en modifiant la structure de la partition) devient un véritable plaisir.

Alamar
la source
3

C'est un peu un bidouillage pas cher, mais c'est un moyen rapide et sale de surveiller votre processus de 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, surveillez -n 10 kill -USR1 {pid de votre processus DD}

Cela ne fera rien dans la fenêtre de sortie de la montre, mais dans le shell DD d'origine, DD commencera à générer des rapports d'état toutes les 10 secondes. Vous pouvez modifier le -n 10 dans la commande de surveillance à n’importe quel autre moment bien sûr.

Tachyon


la source
OS X n'est pas watchdisponible et -USR1tue dd. La commande suivante fonctionne cependant: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco
Je ne pense pas que ce soit très pratique pour un novice, ils pourraient être mieux servis avec la pvcommande.
Robbie Mckennie le
J'ai trouvé que vous pouvez également envoyer un fichier SIGINFO utilisant CTRL-T dans jj. C'est plus facile que la boucle while et le cd OSX 10.6 que j'ai n'a pas killall. J'ai appris cela en fr.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler
3
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Cela va copier le disque et ignorer les blocs avec des erreurs, ce qui est très important.

Ce sont les options de base essentielles pour utiliser dd pour cloner ou récupérer un disque.

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

Sam Watkins
la source
1
En fait, cela a déjà été mentionné, dans une réponse et au moins deux commentaires.
Michael Hampton
1
@Michael, la réponse que vous avez liée ne contient pas d'exemple de commande complète et présente d'autres défauts. Ce n'est pas une bonne idée d'utiliser une grande taille de bloc conv=sync,noerrorcar cela évite de surcharger trop de données pour chaque bloc défectueux. Ces options sont essentielles pour le "clonage de récupération", et il est inutile de rechercher les commentaires. La réponse la plus courante est adéquate si les disques ne contiennent pas de blocs défectueux, par exemple pour cloner un disque vierge, mais pas pour la récupération.
Sam Watkins
@ Michael, l'exemple que j'ai donné est une commande que j'ai utilisée à plusieurs reprises pour la récupération de disque professionnelle. Bien qu'il existe d'autres outils qui pourraient faire un travail légèrement meilleur, l'exemple que j'ai donné est meilleur en clonage de récupération de disque que tous les autres ddexemples ici, tout en étant également approprié pour le clonage d'un disque exempt d'erreur. Par conséquent, j'estime que ma réponse est la meilleure ici sur la manière d'utiliser "DD pour le clonage de disque". Je n'ai pas ajouté d'informations sur le suivi des progrès, la compression, etc., parce que je voulais rester simple et me concentrer sur une réponse courte permettant de bien comprendre les bases.
Sam Watkins
3

Vous pouvez réellement essayer quelque chose comme ça

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

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

Sam Watkins
la source
Conv = sync, noerror L'option de synchronisation est nécessaire, sinon les blocs avec des erreurs seront supprimés plutôt que copiés sous forme de zéros.
Sam Watkins
2

dd fournit des informations sur la progression - ainsi, la plupart des versions sous Linux. J'en ai vu qui ne le font pas mais ne se souviennent pas de la version Unix.

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

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

Steven
la source
Bien qu'utile, je doute de son côté pratique pour un débutant.
Robbie Mckennie le
2

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

Qu'est ce que tu obtiens? Pour copier uniquement des 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 de qualité peut être trouvée sur: http: // clonezilla.org/clonezilla-live/doc/


la source
J'ai trouvé la documentation un peu approximative et cloner un disque Linux PATA sur un disque SATA ne m'a pas laissé quelque chose que je pourrais démarrer (pour le moment). Mais beaucoup plus rapidement au même résultat que dd, et cela a très bien fonctionné pour les mises à niveau de mon ordinateur portable.
Jbdavid
2

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

Cela fonctionne en stockant le pid via le descripteur de fichier 3 dans / tmp / pid, qui est ensuite utilisé pour les destructions suivantes avec le signal USR1. Une ride devait filtrer la sortie de la progression sur stderr en 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
Edward Groenendaal
la source
Pas vraiment pertinent pour la question, mais c'est une astuce géniale utilisant un sous-shell et des descripteurs de fichier élevés (plus élevés que stderr) pour transmettre des données, +1
mercredi
Je faisais référence à cette page moi - même pour différentes options dd lors du clonage des disques, il semblait un endroit approprié au moment de mettre le résultat final de ce que j'utilisé pour le clonage, d' autant plus que je pensais moi - même était plutôt propre :)
Edward Groenendaal
2

La plupart des informations ont été décrites dans les recettes insérées précédemment, mais tout n'a pas été décrit.

Sous Linux, vous pouvez cloner le disque dur ou la partition à l'aide de la commande dd. Attention, quand vous faites une erreur, vous perdez 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 lecture seule. Sinon, la copie sera endommagée. Si le remontage est impossible, veuillez créer un disque amorçable (hdd / ssd / pendrive) pour toute distribution live linux. Je prever knoppix, mais c'est votre choix. Si cela est possible, vous pouvez démarrer ou modifier le niveau du système en 1, pour le mode mono-utilisateur, ou vous pouvez directement redémarrer le système en mode mono-utilisateur, selon la distribution. Si vous ne clonez qu'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 voulez 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 le périphérique de destination. s'il vous plaît regardez le dmesg, ici sont stockées toutes les informations nécessaires sur le périphérique, avec le vendeur, etc. sinon l'identification peut être basée sur la taille du périphérique, si celle-ci 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 un GPT), vous obtiendrez: 1. la taille totale du disque wigh Go et les octets 2. la géométrie historique et le nombre total de secteurs, informations très importantes 3. la taille du 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

Ensuite, essayons plus grand que 512 diviseur, 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 secteur: 512 (taille de secteur) * 1024 = 524288 octets eq 512K. Ensuite, nous pouvons utiliser le paramètre bs = 512K ou moins, mais diviser par 2 ^ x. Ceci est suffisamment pratique pour les disques durs modernes avec un cache interne important. pour les lecteurs plus anciens avec un cache beaucoup plus petit, une valeur de 32 Ko ou moins est suffisante.

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

Si vous essayez de récupérer des données sur un disque source endommagé, utilisez plutôt la taille du secteur natif (généralement 512 octets) et ajoutez l’option conv = notrunc. sinon, les trous dans les sources supprimés par les secteurs défectueux seront rejoints par les changements de secteur de destination. Cela endommagerait 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 attendre longtemps quand le lecteur et le système abandonneront et marcheront secteur par secteur jusqu’au bout.

dd est un outil utile pour déplacer une partition dans un nouvel emplacement. Créez simplement une partition, créez une dd sur une nouvelle partition (cela peut être plus grand, beaucoup plus grand) et, si possible, développez le système de fichiers copié pour remplir toute nouvelle partition. Ext3 / ext4 / xfs / zfs / btrfs dispose de cette fonctionnalité. Enfin, vous devez modifier / etc / fstab, puis umount / mount si cela est possible, ou redémarrer le système.

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

Il n'y a aucune 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 ceci en:

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

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

Znik
la source
1

Vous pouvez créer un fichier image compressé de la partition (ou du disque) à la volée en utilisant bzip2ou à la gzipplace de dd. C'est pratique pour stocker des images sur un support amovible:

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

Si le disque a déjà été très utilisé, vous pouvez améliorer la compression en remplissant tout l'espace non utilisé par des zéros avant la création d'image:

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
JCCyC
la source
On a voté pour le truc pour remplir l'espace restant avec des zéros. Intelligent!
Confusion
Ça, j'en avais besoin! La carte SD était autrefois utilisée pour la capture vidéo et était pleine de merde, la compression n’a pas aidé du tout.
Cody Smith
0

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

Mat
la source
0

Une note sur la vitesse: dans mon expérience, dd est deux fois plus rapide si vous spécifiez bs = 1024 au lieu de la valeur par défaut bs = 512. L'utilisation d'une taille de bloc encore plus grande ne donne aucune accélération notable sur bs = 1024.


la source
4
les clusters de disques sont généralement autour de 4k maintenant, donc utiliser 4096 est probablement une bonne option, et même 8192 si vous voulez lire 2 clusters à la fois. Ne soyez pas trop gros, car vous rencontrez des problèmes de mémoire fragmentés
user4767
0

Lorsque vous créez un disque complet, vous devez savoir que cela écrasera l'enregistrement de démarrage principal du disque récepteur. Ceci contient la table de partition et d'autres informations vitales. Si le nouveau disque n'est pas identique à l'ancien, cela peut créer toutes sortes de tables. La copie de partitions est généralement plus sûre (et les partitions swap ne doivent pas être copiées)

Paul de Vrieze
la source
0

Je n'ai plus le rôle d'administrateur depuis de nombreuses années, 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 passé une commande client sur 30 systèmes 386i exécutant un logiciel de CAO distribué sur plusieurs bandes QIC.

Nous avons installé le premier ordinateur, configuré l'application, lancé la commande sys-unconfig de SunOS, placé le lecteur dans une boîte à chaussures avec une adresse SCSI différente, puis passé à la définition "dd" des 30 autres lecteurs.

pbrooks100
la source
0

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'appliquera évidemment pas aux clones de lecteur complet, mais si vous utilisez LVM, vous pouvez capturer le LogicalVolume et le DD de l'instantané pour obtenir une image cohérente.

Ophidien
la source
0

Juste un avertissement pour les 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 doté de 1 Go de RAM et d’un échange insuffisant, cela provoquera des problèmes.

rackandboneman
la source