Зачем указывать размер блока при копировании устройств конечного размера?


14

В онлайн-уроках часто предлагается использовать следующую команду для копирования CDROM в ISO-образ:

$ dd if=/dev/dvd of=foobar.iso bs=2048

Почему размер байта должен быть указан? Я заметил, что на самом деле 2048 - это стандартный размер байта для образов CDROM, но кажется, что ddбез указания bs=или count=работает также.

При каких обстоятельствах было бы проблематично не указывать bs=или count=при копировании с устройства конечного размера?

Ответы:


12

Когда dd подходит для копирования данных? (или, когда частичные read () и write ()) указывают на важное предостережение при использовании count: ddможет копировать частичные блоки, поэтому при countналичии он останавливается после заданного количества блоков, даже если некоторые из блоков были неполными. Таким образом, вы можете получить меньше bs * countкопируемых байтов, если вы не укажете iflag=fullblock.

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

Я думаю, что здесь есть два аспекта: производительность и восстановление данных.

Что касается производительности, в идеале вы хотите, чтобы размер блока был по крайней мере равным и кратным базовому размеру физического блока (следовательно, 2048 байт при чтении CD-ROM). Фактически в настоящее время вы также можете указывать большие размеры блоков, чтобы дать базовым системам кэширования возможность буферизовать вещи для вас. Но увеличение размера блока означает, ddчто нужно использовать гораздо больше памяти, и это может привести к обратным результатам, если вы копируете по сети из-за фрагментации пакетов.

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


2
Производительность особенно; запишите образ раздела на SD-карту, например, используя dd bs=4m iflag=fullblockvs, dd bs=1111и обратите внимание на значительно более высокие скорости передачи данных, которые дает вам первая. Это связано с тем, что первое выравнивается с естественными размерами блоков на SD-карте, а второе требует, чтобы SD-контроллер выполнял много операций чтения, копирования и перепрошивки для записи частичных физических блоков. fullblockМежду прочим, важность не следует недооценивать, так как без нее bsтолько максимальный, а частичное чтение может привести к постоянным последующим перекосам.
Джейсон С

6

Вокруг немного культового груза dd. Первоначально было две ошибки, cpкоторые вызывали проблемы: он ошибочно определял файлы как разреженные при сообщении с размером блока, отличным от 512 (Linux использовал размер блока 1024), и он не очищал пустые блоки от места назначения при копировании из разреженный файл на блочное устройство.

Вы можете найти некоторые ссылки на это в ранних архивах списков рассылки Linux .

Таким образом, люди привыкли, что dd - правильный способ работы с образами дисков, и cp отошел на второй план. А поскольку dd использует размер блока по умолчанию 512, он медленный (медленнее, чем cp в современных системах). Но не очевидно, какой размер блока вы должны использовать. Возможно, в вашем случае кто-то прочитал, что 2048 - это «естественный» размер блока для CD-ROM (то есть, CD-ROM разделены на 2352 байтовых сектора, содержащих 2048 байт данных вместе с информацией для исправления ошибок), и решил, что это это «правильный» размер для использования с dd, когда на самом деле вы, вероятно, получите более быстрые результаты, если будете использовать (умеренно) больший размер блока. Фактически, GNU cp использует размер блока по умолчанию 64 КБ по этой причине.

tl; dr: cp /dev/dvd foobar.iso должно работать нормально. Размер блока по умолчанию для dd512. Единственный эффект, оставляющий его в покое, вероятно, будет иметь место в большинстве современных обстоятельств - замедление процесса копирования.


это могло бы измениться, в любом случае GNU cp использует размер блока 128
КБ

5

Изменение размера блока - это хороший способ изменить объем буферизуемого или читаемого / записываемого за раз.

Не имеет никакого отношения к тому, является ли это реальным блочным устройством или бесконечным / виртуальным. Речь идет о том, сколько вы хотите сохранить в памяти, прежде чем ddпойти, чтобы записать это. bs=устанавливает оба ibs=(сколько данных считывается за один раз) и obs=(сколько данных записывается за один раз). Чем выше, тем obs=больше итераций ibs=потребуется, прежде чем у вас будет достаточно данных для ddначала записи в место назначения.

count=также не зависит ни от чего, кроме того, что вы хотите сделать. Он контролирует, сколько «блоков» (измеряемых ibs=) потребуется для того, ddчтобы считать свою работу выполненной.


Заметьте Стивенсом точку ddкопирования частичных блоков - это не всегда bs * count.
Драв Слоан

Обратите внимание, что в некоторых системах Unix вы должны прочитать кратное собственному размеру блока; ddбез bs=2048или несколько их кратно может привести к ошибке при чтении с дисковода блочных устройств.
wurtel

2

Опция Blocksize on ddэффективно определяет, сколько данных будет скопировано в память из подсистемы ввода-вывода перед попыткой обратной записи в подсистему ввода-вывода. Выходные данные одинаковые (поскольку копируется весь диск), фрагменты просто читаются с указанным вами разным размером (в большинстве ddреализаций размер блока по умолчанию составляет 512 байт).

Если у вас есть большой объем свободной памяти и увеличен размер блока, то более крупные фрагменты данных могут считываться последовательно, буферизироваться и сбрасываться в место назначения вывода. Меньший размер блока требует больше затрат с точки зрения каждого отдельного lseek, memset и т. Д.

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


1

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

  • Наличие 1000000000000000 файлов с каждым из всего 1 ~ 10 КБ.
  • Наличие одного файла для 10 ГБ

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.