ddjest przeznaczony do kopiowania bloków danych z pliku wejściowego do pliku wyjściowego. Te ddopcje rozmiaru bloku są następujące, od strony człowieka :
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=.
Ta ddseekopcja jest podobna do lseek()wywołania systemowego UNIX 1 . Przesuwa wskaźnik odczytu / zapisu w pliku. Od strony man :
seek=n
Skip n blocks (using the specified output block size) from the beginning of the output file before copying.
Pliki zwykłe w systemie UNIX mają wygodną właściwość, której nie trzeba odczytywać ani zapisywać od samego początku; możesz szukać w dowolnym miejscu i czytać lub pisać od tego miejsca. Tak więc bs=4096 seek=7środki, aby przejść do pozycji 7 * 4096 bajtów od początku pliku wyjściowego i zacząć pisać stamtąd. Nie zapisuje do części pliku, która ma od 0 do 7 * 4096 bajtów.
Obszary zwykłych plików, do których nigdy nie są zapisywane, nie są nawet przydzielane przez podstawowy system plików. Te obszary są nazywane dziurami, a pliki nazywane są plikami rzadkimi . W twoim przykładzie file_with_holesbędzie miał na początku 7 * 4096 bajtowy otwór. (h / t @frostschutz za wskazanie, że dddomyślnie obcina plik wyjściowy).
Czytanie tych nieprzydzielonych obszarów jest w porządku; dostajesz garść zer.
[1] w czasie, gdy ddzostało napisane, analogiczne wywołanie systemowe było seek().
Interesujące jest to, że moja strona podręcznika jest irytująco niegodna w tym temacie - `bs = BYTES odczytuj i zapisuj do bajtów BYTES jednocześnie '
Graeme
Nie widziałem „szukaj” w systemie UNIX, może „lseek”.
kangear
1
Dla przypomnienia starałem się znaleźć urządzenie napędowe (przykład:) dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd, ale tych „plików” / deskryptorów nie można zobaczyć: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
Urządzenia @Pysis Disk są zwykle widoczne, ale być może występują problemy z bardzo dużymi urządzeniami. Jak duży (w bajtach) jest twój / dev / sdd?
Mark Plotnick
1
Może mam już i nie pamiętam. Próbuję uzyskać dostęp do zapasowego sektora GPT lub 2 na końcu dysku 4 TB.
Pysis
6
Inne odpowiedzi już to wyjaśniły, ale jeśli masz jakiekolwiek wątpliwości, możesz zobaczyć, co ddz tym zrobić strace.
Otwiera się /dev/urandomdo odczytu ( if=/dev/urandom), otwiera się file_with_holesdo tworzenia / zapisu ( of=file_with_holes).
Następnie obcina się file_with_holesdo 4096*7= 28672bytes ( bs=4096 seek=7). Obcięcie oznacza, że zawartość pliku po tej pozycji zostanie utracona. (Dodaj, conv=notruncaby uniknąć tego kroku). Następnie szuka 28672bajtów.
Następnie odczytuje 4096bajty ( bs=4096używane jako ibs) z /dev/urandom, zapisuje 4096bajty ( bs=4096używane jako obs) do file_with_holes, a następnie kolejny odczyt i zapis ( count=2).
Następnie zamyka /dev/urandom, zamyka file_with_holesi drukuje, że skopiował 2*4096= 8192bajty. Wreszcie wychodzi bez błędu (0).
obsto rozmiar bloku wyjściowego i ibsrozmiar bloku wejściowego. Jeśli określisz opcję „ bsbez” ibslub „ obsto” zostanie użyte dla obu.
Więc twoje wyszukiwanie będzie miało 7 bloków po 4096 lub 28672 bajtów na początku twojego wyjścia. Następnie skopiujesz 2 bloki 4096 lub 8192 bajtów od początku wprowadzania do tego punktu na wyjściu.
Seek po prostu „napompuje” plik wyjściowy. Seek = 7 oznacza, że na początku pliku wyjściowego zostanie wstawionych 7 „pustych” bloków o rozmiarze bloku wyjściowego = obs = 4096 bajtów. Jest to sposób szybkiego tworzenia bardzo dużych plików.
Lub pomiń dane na początku, których nie chcesz zmieniać. Puste bloki powstają tylko wtedy, gdy plik wyjściowy początkowo nie zawierał tak dużej ilości danych. Podręcznik nie wyjaśnia również, w jaki sposób obsodnosi się do bspolecenia, bsktóre zastępuje, obsjeśli go nie ma.
dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd
, ale tych „plików” / deskryptorów nie można zobaczyć: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
Inne odpowiedzi już to wyjaśniły, ale jeśli masz jakiekolwiek wątpliwości, możesz zobaczyć, co
dd
z tym zrobićstrace
.Otwiera się
/dev/urandom
do odczytu (if=/dev/urandom
), otwiera sięfile_with_holes
do tworzenia / zapisu (of=file_with_holes
).Następnie obcina się
file_with_holes
do4096*7
=28672
bytes (bs=4096 seek=7
). Obcięcie oznacza, że zawartość pliku po tej pozycji zostanie utracona. (Dodaj,conv=notrunc
aby uniknąć tego kroku). Następnie szuka28672
bajtów.Następnie odczytuje
4096
bajty (bs=4096
używane jakoibs
) z/dev/urandom
, zapisuje4096
bajty (bs=4096
używane jakoobs
) dofile_with_holes
, a następnie kolejny odczyt i zapis (count=2
).Następnie zamyka
/dev/urandom
, zamykafile_with_holes
i drukuje, że skopiował2*4096
=8192
bajty. Wreszcie wychodzi bez błędu (0).źródło
obs
to rozmiar bloku wyjściowego iibs
rozmiar bloku wejściowego. Jeśli określisz opcję „bs
bez”ibs
lub „obs
to” zostanie użyte dla obu.Więc twoje wyszukiwanie będzie miało 7 bloków po 4096 lub 28672 bajtów na początku twojego wyjścia. Następnie skopiujesz 2 bloki 4096 lub 8192 bajtów od początku wprowadzania do tego punktu na wyjściu.
źródło
Seek po prostu „napompuje” plik wyjściowy. Seek = 7 oznacza, że na początku pliku wyjściowego zostanie wstawionych 7 „pustych” bloków o rozmiarze bloku wyjściowego = obs = 4096 bajtów. Jest to sposób szybkiego tworzenia bardzo dużych plików.
źródło
obs
odnosi się dobs
polecenia,bs
które zastępuje,obs
jeśli go nie ma.