argomento "cerca" nel comando dd


20

Qualcuno può spiegarmi cosa sta succedendo nelle seguenti righe?

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

soprattutto cercare parte non è chiaro

Le pagine man dicono:

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

Che cos'è un blocco di dimensioni obsolete?

Risposte:


22

ddè progettato per copiare blocchi di dati da un file di input a un file di output. Le ddopzioni relative alle dimensioni del blocco sono le seguenti, dalla pagina man :

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 seekopzione è simile alla lseek()chiamata di sistema 1 di UNIX . Sposta il puntatore di lettura / scrittura all'interno del file. Dalla pagina man :

seek=n
    Skip n blocks (using the specified output block size) from the beginning of the output file before copying. 

I file ordinari in UNIX hanno la proprietà conveniente che non è necessario leggerli o scriverli a partire dall'inizio; puoi cercare ovunque e leggere o scrivere a partire da lì. Quindi bs=4096 seek=7significa spostarsi in una posizione di 7 * 4096 byte dall'inizio del file di output e iniziare a scrivere da lì. Non scriverà nella parte del file compresa tra 0 e 7 * 4096 byte.

Aree di file ordinari a cui non viene mai scritto affatto non sono nemmeno allocate dal file system sottostante. Queste aree sono chiamate buchi e i file sono chiamati file sparsi . Nel tuo esempio, all'inizio file_with_holesavrà un foro di 7 * 4096 byte. (h / t @frostschutz per la segnalazione che ddtronca il file di output per impostazione predefinita.)

È OK leggere queste aree non allocate; ottieni un sacco di zero.

[1] quando è ddstato scritto, l'analoga chiamata di sistema era seek().


Interessante, la mia pagina man è fastidiosamente poco interessante su questo - `bs = BYTES legge e scrive byte BYTES alla volta`
Graeme,

Non ho visto "cercare" su UNIX, forse "cerco" credo.
Kangear,

1
Solo per notare, stavo cercando di cercare un dispositivo di azionamento (esempio:) dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd, ma quei 'file' / descrittori non sono ricercabili: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
I dispositivi @Pysis Disk sono generalmente ricercabili, ma forse ci sono alcuni problemi con dispositivi molto grandi. Quanto è grande (in byte) il tuo / dev / sdd?
Mark Plotnick,

1
Forse l'ho già fatto e non ricordo. Sto cercando di accedere al settore GPT di backup o 2 alla fine di un disco da 4 TB.
Pysis,

6

Le altre risposte lo hanno già spiegato, ma se hai dei dubbi, puoi vedere cosa ddsuccede 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 +++

Si apre /dev/urandomper leggere ( if=/dev/urandom), si apre file_with_holesper creare / scrivere ( of=file_with_holes).

Quindi si tronca file_with_holesin 4096*7= 28672bytes ( bs=4096 seek=7). Il troncamento significa che il contenuto del file dopo quella posizione viene perso. (Aggiungi conv=notruncper evitare questo passaggio). Quindi cerca i 28672byte.

Quindi legge i 4096byte ( bs=4096usati come ibs) da /dev/urandom, scrive i 4096byte ( bs=4096usati come obs) su file_with_holes, seguiti da un altro read e write ( count=2).

Quindi si chiude /dev/urandom, si chiude file_with_holese stampa che ha copiato 2*4096= 8192byte. Alla fine esce senza errori (0).


5

obsè la dimensione del blocco di output ed ibsè la dimensione del blocco di input. Se si specifica bssenza ibso obsquesto viene utilizzato per entrambi.

Quindi la tua ricerca sarà 7 blocchi di 4096 o 28672 byte all'inizio dell'output. Quindi copierete 2 blocchi di 4096 o 8192 byte dall'inizio dell'input a questo punto nell'output.


1

La ricerca "gonfia" il file di output. Seek = 7 significa che all'inizio del file di output verranno inseriti 7 blocchi "vuoti" con dimensione del blocco di output = obs = 4096bytes. Questo è un modo per creare rapidamente file di grandi dimensioni.


1
Oppure saltare i dati all'inizio che non si desidera modificare. I blocchi vuoti si ottengono solo se inizialmente il file di output non aveva molti dati. Il manuale non è anche chiaro su come si obsrelaziona bs, usa il comando bsche sostituirà obsse non c'è.
Graeme,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.