Аргумент 'шукати' в команді dd


20

Чи можуть хтось пояснити мені, що відбувається в наступних рядках?

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

Особливо шукати участь незрозуміло

Сторінки чоловіка:

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

Що таке блок розміру розміру?

Відповіді:


22

ddпризначений для копіювання блоків даних із вхідного файлу у вихідний файл. Параметри ddрозміру блоку на сторінці 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=.

dd seekВаріант схожий на UNIX lseek()системний виклик 1 . Він переміщує вказівник читання / запису у файлі. На чоловіковій сторінці :

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

Звичайні файли в UNIX мають зручну властивість: вам не потрібно їх читати чи записувати, починаючи з початку; ви можете шукати будь-де і читати чи писати, починаючи звідти. Отже, bs=4096 seek=7означає перейти до позиції 7 * 4096 байт з початку вихідного файлу і почати писати звідти. Він не запише до частини файлу, яка знаходиться між 0 і 7 * 4096 байтами.

Області звичайних файлів, які взагалі ніколи не записуються, навіть не виділяються базовою файловою системою. Ці області називаються дірками, а файли називаються розрідженими файлами . У вашому прикладі file_with_holesна початку буде отвір 7 * 4096 байт. (h / t @frostschutz за вказівку на те, що ddза замовчуванням усікає вихідний файл.)

Добре читати ці нерозподілені області; ви отримуєте купу нулів.

[1] назад, коли ddбуло записано, аналогічний системний виклик був seek().


Цікаво, що на моєму чоловікові сторінка прикро неприємна з цього приводу - `bs = BYTES читає та записує до байтів BYTES за один раз`
Graeme,

Я не бачив "шукати" в UNIX, можливо, "lseek", я думаю.
kangear

1
Зауважу лише, що я намагався шукати привід пристрою (наприклад,:) dd if=/dev/zero bs=512 count=2 seek=8388607998 of=/dev/sdd, але ці "файли" / дескриптори не шукаються: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
Пристрої @ Disys Disk зазвичай шукаються, але, можливо, є проблеми з дуже великими пристроями. Наскільки великий (у байтах) ваш / dev / sdd?
Марк Плотнік

1
Можливо, я мав раніше і не можу згадати. Я намагаюся отримати доступ до резервного GPT сектора або 2 в кінці диска 4 Тб.
Pysis

6

Інші відповіді це вже пояснювали, але якщо у вас є сумніви, ви можете побачити, що ddз цим 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 +++

Він відкривається /dev/urandomдля читання ( if=/dev/urandom), відкривається file_with_holesдля створення / запису ( of=file_with_holes).

Тоді він скорочується file_with_holesдо 4096*7= 28672bytes ( bs=4096 seek=7). Урізання означає, що вміст файлу після цієї позиції втрачається. (Додати, conv=notruncщоб уникнути цього кроку). Потім він прагне до 28672байтів.

Потім він зчитує 4096байти ( bs=4096використовується як ibs) з /dev/urandom, записує 4096байти ( bs=4096використовується як obs) до file_with_holes, а потім інше читає і записує ( count=2).

Потім він закривається /dev/urandom, закривається file_with_holesі друкується, що він скопіював 2*4096= 8192байти. Нарешті він виходить без помилки (0).


5

obs- розмір вихідного блоку та розмір ibsвхідного блоку. Якщо ви задаєте bsбез ibsабо obsце використовується для обох.

Таким чином, ваша ставка буде 7 блоків з 4096 або 28672 байт на початку вашого виводу. Тоді ви скопіюєте 2 блоки з 4096 або 8192 байт від початку введення до цієї точки у висновку.


1

Seek просто "надує" вихідний файл. Seek = 7 означає, що на початку вихідного файлу буде вставлено 7 "порожніх" блоків з розміром вихідного блоку = obs = 4096 байт. Це спосіб швидко створювати дуже великі файли.


1
Або пропустити дані на початку, які ви не хочете змінювати. Порожні блоки виходять лише в тому випадку, якщо вихідний файл спочатку не мав стільки даних. У посібнику також не зрозуміло, як це obsстосується bs, команда використовує bsяку замінить, obsякщо її немає.
Graeme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.