Copie DD complète du disque dur au disque dur


34

QUESTION ORIGINALE:

Si j'ai 2 disques durs identiques avec les caractéristiques suivantes:

  • SATA 6.0 Gb / s
  • 5400 tours par minute
  • 3 To

Combien de temps faut-il pour terminer une copie complète?

Jusqu'ici, ça fait 5 heures que ça dure et ça continue ...

J'utilise Linux Ubuntu 12.04 64bit et la commande que j'utilise est la suivante:

dd if=/dev/sdb of=/dev/sdc

MISE À JOUR: 1

Je peux maintenant voir les progrès et cela fait plus de 6 heures pour la copie 430GB. Le disque dur est de 3 To ...

N'y a-t-il pas de moyen plus rapide de faire cela?


MISE À JOUR: 2

Cela semble beaucoup mieux qu'avant (merci à Groxxda pour les suggestions):

sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128K

ETA coûte environ 9 heures pour 3 To, alors qu’avant, il atteignait 430 Go après 6 heures, je suppose donc que la commande précédente aurait pris environ 36 heures.


Essayez de saisir les statistiques du processus: L'envoi d'un signal USR1 à un processus 'dd' en cours lui permet d'imprimer les statistiques d'E / S en erreur standard, puis de reprendre la copie. $ dd si = / dev / zéro de = / dev / null & pid = $! $ kill -USR1 $ pid Consultez votre page de manuel pour connaître le signal réel, car il diffère selon les implémentations de dd.
groxxda

@Groxxda, je ne sais pas comment faire ça.
oshirowanen

1
GNU dd utilise SIGUSR1, et BSD dd utiliseSIGINFO
groxxda

Aussi que voulez-vous dire par "connecté au même câble sata"? Utilisez-vous une sorte de multiplicateur de port? (Si vous atteignez un taux de transfert de 150 Mo / s, cela devrait vous prendre 5-6 heures, mais je pense que la moitié est plus réaliste.)
groxxda

1
Vous pourrez peut-être accélérer le processus en spécifiant une taille de bloc différente (plus grande) ( bs=argument à dd). Pensez également à connecter chaque disque dur à son propre port SATA.
Groxxda

Réponses:


58

ddétait utile jadis, lorsque les utilisateurs utilisaient des bandes (lorsque la taille des blocs comptait) et lorsque des outils simples tels que ceux catqui ne fonctionnaient pas pourraient ne pas être protégés du binaire.

De nos jours, l’ écriture est une méthode lente etdd if=/dev/sdb of=/dev/sdc compliquée, sujette aux erreurs . Bien que toujours utile pour certaines tâches relativement rares , il est beaucoup moins utile que le nombre de tutoriels le mentionnant vous laisserait croire. Il n'y a pas de magie , c'est la magie .cat /dev/sdb >/dev/sdcdddd/dev/sdb

Votre nouvelle commande sudo dd if=/dev/sdb bs=128K | pv -s 3000G | sudo dd of=/dev/sdc bs=128Kest à nouveau inutilement lente et compliquée. Les données sont lues 128 Ko à la fois (ce qui est meilleur que la ddvaleur par défaut de 512 Go, mais pas aussi bonne que des valeurs encore plus grandes). Il passe ensuite par deux canaux avant d’être écrit.

Utilisez la catcommande plus simple et plus rapide . (Dans certains tests que j'ai réalisés il y a quelques années sous Linux, cela catétait plus rapide que cppour une copie entre différents disques et cpplus rapide ddqu'avec n'importe quelle taille de bloc; ddavec une taille de bloc importante, il était légèrement plus rapide de copier sur le même disque.)

cat /dev/sdb >/dev/sdc

Si vous voulez exécuter cette commande sudo, vous devez effectuer la redirection en tant que root:

sudo sh -c 'cat /dev/sdb >/dev/sdc'

Si vous voulez un rapport de progression, puisque vous utilisez Linux, vous pouvez facilement en obtenir un en notant le PID du catprocessus (par exemple, 1234) et en regardant la position de son descripteur de fichier en entrée (ou en sortie).

# cat /proc/1234/fdinfo/0
pos:    64155648 
flags:  0100000

Si vous voulez un rapport d'avancement et que votre variante Unix ne fournit pas un moyen facile d'obtenir un descripteur de fichier, vous pouvez installer et utiliser à la pvplace de cat.


Ce qui est étrange avec les gros blocs, c'est que le disque est le goulot d'étranglement, alors qu'est-ce qui le rend catplus rapide que dd? Serait-ce qui catutilise le cache?
Emmanuel

1
@ Gilles, merci pour la réponse. J'ai cinq autres disques de 3 To à cloner et j'essaierai l'option de chat ensuite. Autant que je sache, cette nouvelle commande dd prendra encore 3 heures, soit environ 11 heures au total. Si l'approche du chat est plus rapide que 11 heures pour le deuxième disque dur de 3 To, j'utiliserai cette méthode pour les lecteurs restants.
oshirowanen

2
@ Gilles, alors pour avoir un rapport d'avancement, est-ce que je l'utilise sudo sh -c 'pv /dev/sdb >/dev/sdc'au lieu de sudo sh -c 'cat /dev/sdb >/dev/sdc'?
oshirowanen

1
@oshirowanen Oui, utilisez pvoù vous voulez cat.
Gilles 'SO- arrête d'être méchant'

1
@unhammer Non! Vous copiez chaque appareil un par un, par exemple cat /dev/sdc1 >/dev/sdb1 && cat /dev/sdd1 >/dev/sde1. Concaténer les deux parties n'a pas de sens. Si vous souhaitez modifier la structure du volume btrfs, pour passer de deux sous-volumes à un seul, vous devez utiliser les outils btrfs pour modifier la structure ou créer un nouveau système de fichiers avec la structure souhaitée, puis copier les fichiers. .
Gilles, arrête de faire le mal

7

ddutilise une très petite taille de bloc par défaut (512 octets). Cela entraîne beaucoup de temps système (un read()et un write()appel système pour chaque 512 octets).

Cela va beaucoup plus vite lorsque vous utilisez une taille de bloc plus grande. Les vitesses optimales commencent à peu près bs=64k. La plupart des gens utilisent un format encore plus grand bs=1Mpour qu'il devienne lisible par l'homme (quand on dddit qu'il est copié 1234 blocks, vous savez que c'est 1234 MiBsans faire de calcul). L'utilisation de tailles de blocs encore plus grandes ne devrait pas entraîner une amélioration de la vitesse, mais simplement une consommation de mémoire supérieure.

Donc, la commande devrait être:

dd bs=1M if=/dev/sdb of=/dev/sdc

Si vous avez déjà une ddexécution lente , vous pouvez l’interrompre et la reprendre avec une ddinstance plus rapide . Pour cela, il est important de savoir dans quelle mesure la copie a déjà progressé. ddimprime généralement la progression lorsque vous l’annulez, ou vous pouvez lui envoyer le USR1signal en cours d’exécution pour lui permettre d’imprimer sa progression.

kill -USR1 $(pidof dd)

Par exemple, s'il a copié plus de 1234MiB, vous pouvez reprendre la position en 1234MiButilisant:

dd bs=1M seek=1234 skip=1234 if=/dev/sdb of=/dev/sdc

S'il en a copié moins de 1234MiB, votre copie sera incomplète. S'il en a copié plus de 1234MiB, cela recopiera certaines parties déjà copiées, ce qui ne fait normalement pas de mal. Donc, en cas de doute, vous devriez choisir une valeur légèrement inférieure à celle qui a déjà été copiée.


5

Obtenir des statistiques sur le processus de jj en cours

Vous pouvez utiliser la killcommande avec le signal approprié pour transformer ddles statistiques en sortie en erreur standard.
Depuis la page de manuel GNU dd:

Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.
      $ dd if=/dev/zero of=/dev/null& pid=$!
      $ kill -USR1 $pid
      18335302+0 records in 18335302+0 records out 9387674624 bytes (9.4 GB)  copied,  34.6279 seconds, 271 MB/s

Assurez-vous d’abord vérifier le bon signal sur votre page de manuel, car il peut différer selon les implémentations de dd: (dd BSD utilise SIGINFO).

Accélérer le processus

  1. Connectez chaque disque dur à son propre port SATA afin que les données puissent être lues d'un périphérique et écrites sur un autre en même temps.
  2. Utilisez une taille de bloc appropriée en utilisant l' bs=argument. Jetez un coup d'œil à ce fil sur le superutilisateur et essayez quelques valeurs pour vous-même.
  3. Utilisez des ddinvocations distinctes pour lire et écrire et utilisez un tuyau pour les connecter ( dd if=/dev/sda bs=1M | dd of=/dev/sdb bs=1M).
    Si vous faites cela et spécifiez une taille de bloc, assurez-vous d'utiliser la même taille de bloc à chaque appel.
  4. Vous pouvez essayer d'autres optimisations comme l' directargument.
  5. Assurez-vous que vos disques durs ne sont pas montés, sinon la copie pourrait être corrompue.

0

Avez-vous essayé 'gparted'? Vous pouvez littéralement copier-coller une partition d'un lecteur à un autre et la redimensionner en conséquence, si nécessaire. Vous obtenez le taux de transfert et le temps restant. Il utilise "e2image" en dessous pour les partitions Linux.


0

Il existe un logiciel commercial appelé HDClone . Il est sous licence libre et commercial. Les deux versions peuvent créer une clé USB ou un DVD de démarrage, ainsi que la copie de disques. Connectez les disques durs source et de destination et suivez les instructions basées sur une interface graphique.

La version gratuite transférera environ 80 Mo / s, tandis que les versions payantes peuvent aller beaucoup plus vite. Pour les systèmes de fichiers NTFS et FAT, les versions payantes peuvent être configurées pour cloner uniquement les bits occupés du disque dur, ce qui augmente considérablement la vitesse de chaque clone.


(1) Êtes-vous affilié à ce produit? (2) Où pouvons-nous l'obtenir?
Scott

1
Ou vous pouvez simplement utiliser "cat / dev / sdx> / dev / sdy" gratuitement ...
HörmannHH
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.