web-dev-qa-db-fra.com

Pourquoi DD prend trop de temps?

J'ai besoin de copier un disque sur un autre. J'ai essayé avec la commande ci-dessous et il faut presque un jour pour copier 1 TB de disque dans federo.

dd if=/dev/sda of=/dev/sdb 

J'ai essayé la même chose sur un système Unix (HP-UX) avec la commande ci-dessous et elle se termine en quelques heures

dd if=/dev/sda of=/dev/rdsk

Quelle est l'alternative que je pourrais utiliser pour copier d'un disque à un disque plus rapidement?

19
KKD

dd a de nombreuses options (étranges), voir dd (1) .

Vous devez indiquer explicitement la taille du tampon, alors essayez

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

IIRC, la taille de tampon par défaut n'est que de 512 octets. La commande ci-dessus la définit sur 16 mégaoctets. Vous pouvez essayer quelque chose de plus petit (par exemple bs=1M) mais vous devez utiliser plus que la valeur par défaut (en particulier sur le matériel de disque récent avec des secteurs de 4 Ko, c'est-à-dire Advanced Format ). Je recommande naïvement une puissance de deux qui est au moins un mégaoctet.

Avec la taille de tampon de 512 octets par défaut, je suppose (mais je peux me tromper) que le matériel nécessite que le noyau transfère 4K pour chaque bloc de 512 octets .

Concernant rdsk, les pages de manuel sd (4) disent:

Pour le moment, seuls les blocs de périphériques sont fournis. Les appareils bruts n'ont pas encore été implémentés.

L'augmentation de la taille du tampon de dd vous donnera plus de performances pour les opérations de lecture et d'écriture. Maintenant, tous les disques ont un tampon de lecture/écriture matériel. Mais si vous augmentez la taille du tampon de dd plus que le tampon matériel, ses performances diminueront car dd lira du premier disque au tampon lorsque le second disque aura tout écrit à partir de son propre tampon matériel. Vous devez définir l'option bs de la commande dd à chaque fois une valeur différente pour différents périphériques.

29

Il y a des années dans Unix-land dd était le moyen requis pour copier un périphérique bloc. Cela s'est poursuivi en tant que connaissance culte du fret même si (sur les systèmes Linux, au moins) cat est presque toujours plus rapide que dd.

Cependant, même dans l'histoire, une taille de bloc décente a contribué à réduire le nombre d'appels système (lents), étant donné que chaque appel système a déclenché une opération d'E/S. La taille de bloc par défaut est de 512 octets (un secteur de disque). La collecte de plusieurs blocs de disques en une seule lecture était - et est - également acceptable. Cet exemple utilise une taille de bloc de 32 Mo:

dd bs=$((512*2048*32)) if=/dev/source of=/dev/target

Sur les systèmes Linux actuels, cependant, les disques peuvent être copiés plus efficacement avec un simple cat

cat /dev/source >/dev/target

(Comme indiqué dans les commentaires sur votre question, pv peut remplacer cat et vous donnera une indication de la progression et du débit.)

17
roaima

Généralement, dd peut être évité au profit de certaines alternatives. Il y a plusieurs bonnes raisons d'utiliser à la place GNU ddrescue. Dans Ubuntu, vous pouvez l'installer avec:

Sudo apt-get install gddrescue

et simplement ddrescue à utiliser. Notez que différemment du nom du package, l'exécutable pas a le g initial.

Son utilisation est aussi simple que:

ddrescue inputFile outputFile logFile

Le fichier journal (nommé selon votre choix) vous permet de suspendre/arrêter et redémarrer, sans refaire le travail précédent, ce qui est utile lors de la création de gros clones ou de la récupération de disques. Par défaut, il affiche la progression, la vitesse de copie actuelle, la vitesse de copie moyenne et le nombre de blocs défectueux trouvés.

Il utilise des valeurs par défaut raisonnables pour la taille des blocs, donc la vitesse de copie est toujours aussi rapide que l'appareil peut gérer, du moins d'après mon expérience (j'ai cloné plusieurs centaines de disques avec lui, toutes tailles et types).

Souvent, les disques qui commencent à tomber en panne ont des problèmes de vitesse tels que des correctifs occasionnels de lenteur, de faible vitesse moyenne, de longues pauses soudaines (secteurs défectueux) ou des réinitialisations complètes (graves erreurs de surface). ddrescue peut vous aider à identifier tout ce qui précède et à redémarrer votre clone (à condition que vous ayez spécifié un fichier journal) même si votre lecteur se réinitialise lui-même.

7
technicalbloke

Très belle question. L'interface brute est implémentée sur certains systèmes Unix (tru64, hpux, solaris) mais pas sur linux. L'interface brute accélère le transfert car les E/S Unix sont ignorées. L'interface de bloc (/dev/dsk ou /dev/disk) est plus lent car il utilise le système d'E/S Unix. Pour accélérer dd (gnu dd can) utilisez bs=30M ou bs=20M selon votre matériel. La réponse courte est: NON, elle n'est pas mise en œuvre, du moins pour autant que je sache. J'utilise linux depuis les temps anciens de la version 2.2 du noyau et je n'ai jamais vu rdsk utilisé sous unix.

6
elbarna