Argument 'recherche' dans la commande dd

20

Certains peuvent-ils m'expliquer ce qui se passe dans les lignes suivantes?

dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes

en particulier chercher une partie n'est pas claire

Les pages de manuel indiquent:

 seek=BLOCKS
              skip BLOCKS obs-sized blocks at start of output

Qu'est-ce qu'un bloc de taille obs?

user2799508
la source

Réponses:

22

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' dd seekoption 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().

Mark Plotnick
la source
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.

$ strace dd if=/dev/urandom bs=4096 seek=7 count=2 of=file_with_holes
# output is shortened considerably
open("/dev/urandom", O_RDONLY)          = 0
open("file_with_holes", O_RDWR|O_CREAT, 0666) = 1
ftruncate(1, 28672)                     = 0
lseek(1, 28672, SEEK_CUR)               = 28672
read(0, "\244\212\222v\25\342\346\226\237\211\23\252\303\360\201\346@\351\6c.HF$Umt\362;E\233\261"..., 4096) = 4096
write(1, "\244\212\222v\25\342\346\226\237\211\23\252\303\360\201\346@\351\6c.HF$Umt\362;E\233\261"..., 4096) = 4096
read(0, "~\212q\224\256\241\277\344V\204\204h\312\25pw9\34\270WM\267\274~\236\313|{\v\6i\22"..., 4096) = 4096
write(1, "~\212q\224\256\241\277\344V\204\204h\312\25pw9\34\270WM\267\274~\236\313|{\v\6i\22"..., 4096) = 4096
close(0)                                = 0
close(1)                                = 0
write(2, "2+0 records in\n2+0 records out\n", 312+0 records in
2+0 records out
) = 31
write(2, "8192 bytes (8.2 kB) copied", 268192 bytes (8.2 kB) copied) = 26
write(2, ", 0.00104527 s, 7.8 MB/s\n", 25, 0.00104527 s, 7.8 MB/s
) = 25
+++ exited with 0 +++

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).

frostschutz
la source
5

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.

Graeme
la source
1

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.

Thorsten Staerk
la source
1
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à.
Graeme