Назначение ibs / obs / bs в дд - PullRequest
       9

Назначение ibs / obs / bs в дд

5 голосов
/ 31 августа 2009

У меня есть скрипт, который создает файловую систему в файле на компьютере с Linux. Я вижу, что для создания файловой системы она использует 'dd' с опцией bs = x, читает из / dev / zero и записывает в файл. Я думаю, что обычно указание ibs / obs / bs полезно для чтения с реальных аппаратных устройств, поскольку у каждого есть определенные ограничения размера блока. В этом случае, однако, поскольку это чтение с виртуального устройства и запись в файл, я не вижу смысла в использовании опции 'bs = x bytes'. Мое понимание здесь неправильно? (На всякий случай, если это поможет, эта файловая система позже используется для загрузки qemu vm)

Ответы [ 4 ]

10 голосов
/ 31 августа 2009

Чтобы понять размеры блоков, вы должны быть знакомы с ленточными накопителями. Если вас не интересуют ленточные накопители - например, вы не думаете, что когда-либо будете их использовать - тогда вы можете вернуться в режим сна.

Помните ленточные накопители из фильмов 60-х, 70-х, возможно, даже 80-х? Те, где катушка вращалась и так далее? Не ваш Exabyte или даже QIC - четверть-дюймовый картридж - ленты; ваши добрые старомодные полудюймовые ленточные накопители? На тех, размер блока имеет значение.

Данные на ленте были записаны в блоках. Каждый блок был отделен от следующего промежутком между записями.

----+-------+-----+-------+-----+----
... | block | IRG | block | IRG | ...
----+-------+-----+-------+-----+----

В зависимости от аппаратного и программного обеспечения ленточного накопителя, могут возникнуть различные проблемы. Например, если лента была записана с размером блока 5120 байт и вы прочитали ленту с размером блока 512 байт, то накопитель на магнитной ленте может прочитать первый блок, вернуть вам 512 байт, а затем отбросить оставшиеся данные; следующее чтение начнется со следующего блока. И наоборот, если лента была записана с размером блока 512 байт и вы запросили блоки размером 5120 байт, вы получите короткие чтения; каждое чтение вернуло бы всего 512 байт, и если бы ваше программное обеспечение не обращало внимания, вы бы читали мусор. Также была проблема, что ленточный накопитель должен был набрать скорость, чтобы прочитать блок, а затем замедлиться. Искусство ASCII предполагает, что IRG был меньше, чем блоки данных; это не обязательно так. И потребовалось время, чтобы прочитать один блок, перескочить IRG, перемотать назад, чтобы перейти к следующему блоку, и начать снова вперед. А если на ленточном накопителе не было памяти для буферизации данных, а на более дешевых - нет, то это может серьезно повлиять на производительность ленточного накопителя.

История войны: работа подготовлена ​​на более новой машине с немного более современным стримером. Я написал ленту, используя tar без разумного размера блока (поэтому по умолчанию он составлял 512 байт). Это была большая часть программного обеспечения - должно быть, всего около 100 МБ (давным-давно, другими словами). Лента хорошо написана, потому что машина была достаточно современной, и это заняло всего несколько секунд. Но мне пришлось извлечь материал с ленты на машине со старым ленточным накопителем, на котором не было встроенного буфера. Таким образом, он читал материал по 512 байт за раз, и барабан качался вперед, читая один блок, а затем качался назад почти на полдюйма, а затем читал вперед, чтобы перейти к следующему блоку, а затем качался назад, и ... хорошо, вы могли видеть, как это происходит, и, поскольку на чтение каждого 512-байтового блока уходили заметные доли секунды, общее время, затрачиваемое было ужасным. Мой рейс должен был улететь ... и мне тоже нужно было передать эти данные. (Это было достаточно давно, и в стране, находящейся достаточно далеко, последние изменения в полетах тоже не были чем-то особенным.) Короче говоря, это действительно читало - но если бы я использовал разумный размер блока (например, 5120 байт вместо 512 по умолчанию), я бы сделал это гораздо быстрее и с гораздо меньшей опасностью пропустить самолет (но на самом деле я успел на самолет, и у меня было бы 20 минут, чтобы сэкономить, несмотря на поездку на такси по Парижу в час пик).

При использовании более современных ленточных накопителей на диске было достаточно памяти для буферизации, и было возможно осуществить потоковую передачу ленточного накопителя - непрерывную запись без реверсирования. Раньше я использовал размер блока, например, 256 КБ, чтобы транслировать ленты QIC. Я не так много сделал с ленточными накопителями в последнее время - давайте посмотрим, не в этом тысячелетии и не так много за несколько лет до этого; конечно, не так много, поскольку CD и DVD стали выбранными механизмами распространения программного обеспечения (когда электронная загрузка не использовалась).

Но размер блока действительно имел значение в старые времена. И dd оказал ему хорошую поддержку. Вы даже можете перенести данные с ленточного накопителя, который был записан, скажем, с блоком 4 КБ, в другой, который вы хотите записать, скажем, с помощью блока 16 КБ, указав ibs (размер входного блока) отдельно от obs (размер выходного блока). Чертовски полезно!

Кроме того, параметр count соответствует размеру (входного) блока. Было полезно сказать 'dd bs=1024 count=1024 if=/dev/zero of=/my/file/of/zeroes', чтобы скопировать 1 МБ нулей вокруг. Или скопировать 1 МБ файла.

Значение dd значительно уменьшено; это была неотъемлемая часть арсенала для любого, кто работал с ленточными накопителями десять или более лет назад.

3 голосов
/ 31 августа 2009

Размер блока - это количество байтов, которые считываются и записываются за один раз. Предположительно есть опция count=, которая указывается в единицах размера блока. Если есть опция skip= или seek=, они также будут в единицах размера блока. Однако, если вы читаете и пишете обычный файл и на диске нет ошибок, тогда размер блока не имеет большого значения, если вы можете соответствующим образом масштабировать эти параметры, и они все еще являются целыми числами. Однако некоторые размеры могут быть более эффективными, чем другие.

2 голосов
/ 31 августа 2009

Для чтения из / dev / zero это не имеет значения. ibs / obs / bs указывает, сколько байтов будет считываться за раз. Полезно выбирать число в зависимости от способа чтения / записи байтов в операционной системе. Например, Linux обычно читает с жесткого диска по 4096 байт. Если у вас есть хоть какое-то представление о том, как базовое оборудование читает / записывает, было бы неплохо указать ibs / obs / bs. Кстати, если вы укажете bs, он переопределит все, что вы указали для ibs и obs.

0 голосов
/ 29 мая 2018

В дополнение к замечательному ответу Джонатана Леффлера, имейте в виду, что опция bs= не всегда заменяет использование ibs= и obs=, особенно для старых [уродливых] дней ленты диски.

Опция bs= оставляет за dd право записывать данные, как только они прочитаны. Это может привести к тому, что на выходе больше не будет блоков одинакового размера. Вот что делает GNU, но поведение, насколько я помню, (80-е годы):

(bs =) Установить размеры входного и выходного блоков в байтах. Это позволяет dd читать и записывать байты на блок, переопределяя любые настройки «ibs» и «obs». Кроме того, если не указана опция преобразования для преобразования данных, вход копируется на выход сразу же после его чтения, даже если он меньше размера блока.

Например, в дни QIC на старой системе Sun, если вы сделали это:

tar cvf /dev/rst0c /bla

Это сработало бы, но вызывало колоссальные колебания вперед-назад, когда накопитель записывал небольшой блок и пытался выполнить резервное копирование и чтение, чтобы правильно переместить себя для следующей записи.

Если вы поменялись местами с:

tar cvf - /bla | dd ibs=16K obs=16K of=/dev/rst0c

Вы бы получили диск QIC, записывающий гораздо большие куски и не слишком сильно его трогающий.

Однако, если вы допустили ошибку:

tar cvf - /bla | dd bs=16K of=/dev/rst0c

Вы рискуете получить точно такой же обмолот, что и раньше, в зависимости от того, сколько данных было доступно на момент каждого чтения.

Указание ibs= и obs= предотвращает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...