ddest conçu pour copier des blocs de données d'un fichier d'entrée vers un fichier de sortie. Les ddoptions de taille de bloc sont les suivantes, à partir de la page de manuel :
ibs=expr
Specify the input block size, in bytes, by expr (default is 512).
obs=expr
Specify the output block size, in bytes, by expr (default is 512).
bs=expr
Set both input and output block sizes to expr bytes, superseding ibs= and obs=.
L' ddseekoption est similaire à l' lseek()appel système UNIX 1 . Il déplace le pointeur de lecture / écriture dans le fichier. Depuis la page de manuel :
seek=n
Skip n blocks (using the specified output block size) from the beginning of the output file before copying.
Les fichiers ordinaires sous UNIX ont la propriété pratique de ne pas avoir à les lire ou à les écrire au début; vous pouvez chercher n'importe où et lire ou écrire à partir de là. Signifie donc bs=4096 seek=7de se déplacer vers une position 7 * 4096 octets à partir du début du fichier de sortie et commencer à écrire à partir de là. Il n'écrira pas dans la partie du fichier comprise entre 0 et 7 * 4096 octets.
Les zones de fichiers ordinaires qui ne sont jamais écrites du tout ne sont même pas allouées par le système de fichiers sous-jacent. Ces zones sont appelées trous et les fichiers sont appelés fichiers clairsemés . Dans votre exemple, file_with_holesaura un trou de 7 * 4096 octets au début. (h / t @frostschutz pour avoir souligné que ddtronque le fichier de sortie par défaut.)
Il est correct de lire ces zones non attribuées; vous obtenez un tas de zéros.
[1] à l'époque où ddétait écrit, l'appel système analogue l'était seek().
Intéressant, ma page de manuel est fâcheusement peu accessible à ce sujet - «bs = BYTES lire et écrire en octets à la fois»
Graeme
Je n'ai pas vu "chercher" sous UNIX, peut-être "lseek" je suppose.
kangear
1
Juste pour noter, j'essayais de chercher un périphérique de lecteur (exmaple:) dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd, mais ces 'fichiers' / descripteurs ne sont pas recherchés:dd: /dev/sdd: cannot seek: Invalid argument 0+0 records in 0+0 records out 0 bytes copied, 0.00765396 s, 0.0 kB/s
Pysis
1
Les périphériques @Pysis Disk sont généralement recherchés, mais il peut y avoir des problèmes avec les très gros périphériques. Quelle est la taille (en octets) de votre / dev / sdd?
Mark Plotnick
1
Peut-être que je l'ai avant et que je ne m'en souviens pas. J'essaie d'accéder au secteur GPT de sauvegarde ou 2 à la fin d'un disque de 4 To.
Pysis
6
Les autres réponses l'ont déjà expliqué, mais si vous avez des doutes, vous pouvez voir ce ddqu'il en est strace.
Il s'ouvre /dev/urandompour la lecture ( if=/dev/urandom), s'ouvre file_with_holespour la création / écriture ( of=file_with_holes).
Ensuite, il tronque file_with_holesà 4096*7= 28672octets ( bs=4096 seek=7). La troncature signifie que le contenu du fichier après cette position est perdu. (Ajouter conv=notruncpour éviter cette étape). Ensuite, il cherche à 28672octets.
Ensuite, il lit les 4096octets ( bs=4096utilisés comme ibs) de /dev/urandom, écrit les 4096octets ( bs=4096utilisés comme obs) dans file_with_holes, suivi par un autre read et write ( count=2).
Ensuite, il ferme /dev/urandom, ferme file_with_holeset imprime qu'il a copié 2*4096= 8192octets. Enfin, il sort sans erreur (0).
obsest la taille du bloc de sortie et ibsla taille du bloc d'entrée. Si vous spécifiez bssans ibsou obsceci est utilisé pour les deux.
Votre recherche sera donc de 7 blocs de 4096 ou 28672 octets au début de votre sortie. Ensuite, vous copiez 2 blocs de 4096 ou 8192 octets du début de l'entrée à ce point de la sortie.
Seek "gonfle" simplement le fichier de sortie. Seek = 7 signifie qu'au début du fichier de sortie, 7 blocs "vides" avec une taille de bloc de sortie = obs = 4096 octets seront insérés. C'est un moyen de créer rapidement de très gros fichiers.
Ou pour ignorer au début les données que vous ne souhaitez pas modifier. Les blocs vides ne résultent que si le fichier de sortie ne contenait initialement pas autant de données. Le manuel n'est pas non plus clair sur la obsrelation avec bs, la commande utilise bsqui se substituera obssi elle n'est pas là.
dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd
, mais ces 'fichiers' / descripteurs ne sont pas recherchés:dd: /dev/sdd: cannot seek: Invalid argument 0+0 records in 0+0 records out 0 bytes copied, 0.00765396 s, 0.0 kB/s
Les autres réponses l'ont déjà expliqué, mais si vous avez des doutes, vous pouvez voir ce
dd
qu'il en eststrace
.Il s'ouvre
/dev/urandom
pour la lecture (if=/dev/urandom
), s'ouvrefile_with_holes
pour la création / écriture (of=file_with_holes
).Ensuite, il tronque
file_with_holes
à4096*7
=28672
octets (bs=4096 seek=7
). La troncature signifie que le contenu du fichier après cette position est perdu. (Ajouterconv=notrunc
pour éviter cette étape). Ensuite, il cherche à28672
octets.Ensuite, il lit les
4096
octets (bs=4096
utilisés commeibs
) de/dev/urandom
, écrit les4096
octets (bs=4096
utilisés commeobs
) dansfile_with_holes
, suivi par un autre read et write (count=2
).Ensuite, il ferme
/dev/urandom
, fermefile_with_holes
et imprime qu'il a copié2*4096
=8192
octets. Enfin, il sort sans erreur (0).la source
obs
est la taille du bloc de sortie etibs
la taille du bloc d'entrée. Si vous spécifiezbs
sansibs
ouobs
ceci est utilisé pour les deux.Votre recherche sera donc de 7 blocs de 4096 ou 28672 octets au début de votre sortie. Ensuite, vous copiez 2 blocs de 4096 ou 8192 octets du début de l'entrée à ce point de la sortie.
la source
Seek "gonfle" simplement le fichier de sortie. Seek = 7 signifie qu'au début du fichier de sortie, 7 blocs "vides" avec une taille de bloc de sortie = obs = 4096 octets seront insérés. C'est un moyen de créer rapidement de très gros fichiers.
la source
obs
relation avecbs
, la commande utilisebs
qui se substitueraobs
si elle n'est pas là.