Quand dd convient-il pour copier des données? (ou, quand sont read () et write () partial) souligne une mise en garde importante lors de l'utilisation count
: dd
peut copier des blocs partiels, donc une fois donné, count
il s'arrêtera après le nombre de blocs donné, même si certains blocs étaient incomplets. Vous pouvez donc vous retrouver avec moins de bs * count
octets copiés, sauf indication contraire iflag=fullblock
.
La taille de bloc par défaut pour dd est de 512 octets. count
est une limite; comme votre question l'indique, elle n'est pas requise lors de la copie d'un périphérique de taille finie et est vraiment destinée à copier uniquement une partie d'un périphérique.
Je pense qu'il y a deux aspects à considérer ici: les performances et la récupération de données.
En ce qui concerne les performances, vous souhaitez idéalement que la taille de bloc soit au moins égale et multiple de la taille de bloc physique sous-jacente (d'où 2048 octets lors de la lecture d'un CD-ROM). En fait, de nos jours, vous pouvez également spécifier des tailles de bloc plus grandes pour donner aux systèmes de mise en cache sous-jacents une chance de mettre les choses en mémoire tampon pour vous. Mais augmenter la taille des blocs signifie dd
utiliser beaucoup plus de mémoire et cela pourrait être contre-productif si vous copiez sur un réseau en raison de la fragmentation des paquets.
En ce qui concerne la récupération de données, vous pouvez récupérer plus de données à partir d'un disque dur défaillant si vous utilisez des tailles de bloc plus petites; c'est ce que dd-rescue
font des programmes tels que automatiquement: ils lisent initialement les gros blocs, mais si un bloc échoue, ils le relisent avec des tailles de bloc plus petites. dd
ne le fera pas, il échouera tout le bloc.
dd bs=4m iflag=fullblock
vsdd bs=1111
et notez les débits de données considérablement plus élevés que la première vous donnera. Cela est dû au fait que le premier correspond aux tailles de bloc naturelles sur la carte SD, tandis que le second nécessite que le contrôleur SD fasse beaucoup de lecture, de copie et de reflashing pour écrire des blocs physiques partiels. L'importance defullblock
ne doit pas être sous-estimée, soit dit en passant, car sans elle, cebs
n'est qu'un maximum et des lectures partielles pourraient conduire à des désalignements ultérieurs persistants.Il y a un peu de culte du fret autour
dd
. À l'origine, il y avait deux boguescp
qui causaient des problèmes: il détectait mal les fichiers comme rares lorsqu'ils étaient signalés avec une taille de bloc autre que 512 (Linux utilisait une taille de bloc de 1024), et il n'effaçait pas les blocs vides de la destination lors de la copie à partir d'un fichier épars vers un périphérique de bloc.Vous pouvez trouver quelques références à cela dans les premières archives de la liste de diffusion Linux .
Les gens se sont donc habitués à ce que dd soit la bonne façon de gérer les images disque, et cp est tombé à l'eau. Et puisque dd utilise une taille de bloc par défaut de 512, il est lent (plus lent que cp sur les systèmes modernes). Mais la taille du bloc à utiliser n'est pas évidente. Probablement dans votre cas, quelqu'un a lu que 2048 est la taille de bloc "naturelle" pour un CD-ROM (c'est-à-dire que les CD-ROM sont divisés en secteurs de 2 352 octets contenant 2 048 octets de données avec des informations de correction d'erreur) et a décidé que cela est la "bonne" taille à utiliser avec dd, alors qu'en fait vous obtiendriez probablement des résultats plus rapides si vous utilisiez une taille de bloc (modérément) plus grande. En fait, GNU cp utilise une taille de bloc par défaut de 64 Ko pour cette raison.
tl; dr:
cp /dev/dvd foobar.iso
devrait fonctionner correctement. La taille de bloc par défautdd
est 512. Le seul effet que le laisser seul est susceptible d'avoir dans la plupart des circonstances modernes est de ralentir le processus de copie.la source
Changer la taille du bloc est un bon moyen de changer la quantité de mémoire tampon ou de lecture / écriture à la fois.
Ne se rapporte pas vraiment au fait qu'il s'agisse d'un véritable périphérique de bloc ou d'un périphérique infini / virtuel. Il s'agit de la quantité que vous souhaitez stocker en mémoire avant
dd
de l'écrire.bs=
définit à la foisibs=
(la quantité de données lues à la fois) etobs=
(la quantité de données écrites à la fois). Plus il est élevé,obs=
plus ilibs=
faudra d'itérations avant d'avoir suffisamment de données pourdd
commencer à écrire dans la destination.count=
ne dépend pas d'autre chose que de ce que vous voulez faire. Il contrôle combien de "blocs" (mesurés paribs=
) seront nécessaires pourdd
considérer que son travail est terminé.la source
dd
copier des blocs partiels - ce n'est pas toujoursbs * count
.dd
sansbs=2048
ou un multiple de celui-ci donnerait une erreur lors de la lecture à partir d'un lecteur de cdrom de périphérique bloc.L'utilisation de l'option de taille de bloc sur
dd
spécifie efficacement la quantité de données à copier dans la mémoire du sous-système d'E / S d'entrée avant d'essayer de réécrire dans le sous-système d'E / S de sortie. La sortie est la même (car tout le disque est copié), les morceaux sont simplement lus à la taille différente que vous spécifiez (la plupart desdd
implémentations vont avec une taille de bloc par défaut de 512 octets).Si vous disposez de grandes quantités de mémoire disponible et augmentez la taille des blocs, des blocs de données plus volumineux peuvent être lus successivement, mis en mémoire tampon et vidés vers la destination de sortie. Une taille de bloc inférieure nécessite plus de surcharge pour chaque lseek, memset, etc.
Votre kilométrage peut varier en fonction de votre emplacement
if=
et de votreof=
configuration, ainsi que du matériel que vous utilisez, si votre mémoire est insuffisante, etc.la source
Le bs = représente la taille du bloc à lire ou à écrire. Laisser le champ intact ou ne pas le spécifier peut sembler faire le même travail de copie mais il y a un fait caché à l'utiliser. Par exemple,
Dans le premier cas, l'utilisation d'une taille de bloc inférieure s'est avérée augmenter la vitesse de copie. Alors que dans ce dernier, une taille de bloc plus élevée a été une meilleure option car elle augmente la taille du secteur en laissant moins de
sector change
commandes, ce qui se traduit généralement par des opérations d'E / S plus rapides.la source