Когда dd подходит для копирования данных? (или, когда частичные read () и write ()) указывают на важное предостережение при использовании count
: dd
может копировать частичные блоки, поэтому при count
наличии он останавливается после заданного количества блоков, даже если некоторые из блоков были неполными. Таким образом, вы можете получить меньше bs * count
копируемых байтов, если вы не укажете iflag=fullblock
.
Размер блока по умолчанию для dd составляет 512 байт. count
это предел; как подсказывает ваш вопрос, это не требуется при копировании устройства конечного размера и действительно предназначено для копирования только части устройства.
Я думаю, что здесь есть два аспекта: производительность и восстановление данных.
Что касается производительности, в идеале вы хотите, чтобы размер блока был по крайней мере равным и кратным базовому размеру физического блока (следовательно, 2048 байт при чтении CD-ROM). Фактически в настоящее время вы также можете указывать большие размеры блоков, чтобы дать базовым системам кэширования возможность буферизовать вещи для вас. Но увеличение размера блока означает, dd
что нужно использовать гораздо больше памяти, и это может привести к обратным результатам, если вы копируете по сети из-за фрагментации пакетов.
Что касается восстановления данных, вы можете извлечь больше данных с неисправного жесткого диска, если вы используете блоки меньшего размера; это то, что программы, такие как, dd-rescue
делают автоматически: они сначала читают большие блоки, но если блок терпит неудачу, они перечитывают его с меньшими размерами блоков. dd
не буду этого делать, просто провалит весь блок.
dd bs=4m iflag=fullblock
vs,dd bs=1111
и обратите внимание на значительно более высокие скорости передачи данных, которые дает вам первая. Это связано с тем, что первое выравнивается с естественными размерами блоков на SD-карте, а второе требует, чтобы SD-контроллер выполнял много операций чтения, копирования и перепрошивки для записи частичных физических блоков.fullblock
Между прочим, важность не следует недооценивать, так как без нееbs
только максимальный, а частичное чтение может привести к постоянным последующим перекосам.Вокруг немного культового груза
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
должно работать нормально. Размер блока по умолчанию дляdd
512. Единственный эффект, оставляющий его в покое, вероятно, будет иметь место в большинстве современных обстоятельств - замедление процесса копирования.источник
Изменение размера блока - это хороший способ изменить объем буферизуемого или читаемого / записываемого за раз.
Не имеет никакого отношения к тому, является ли это реальным блочным устройством или бесконечным / виртуальным. Речь идет о том, сколько вы хотите сохранить в памяти, прежде чем
dd
пойти, чтобы записать это.bs=
устанавливает обаibs=
(сколько данных считывается за один раз) иobs=
(сколько данных записывается за один раз). Чем выше, темobs=
больше итерацийibs=
потребуется, прежде чем у вас будет достаточно данных дляdd
начала записи в место назначения.count=
также не зависит ни от чего, кроме того, что вы хотите сделать. Он контролирует, сколько «блоков» (измеряемыхibs=
) потребуется для того,dd
чтобы считать свою работу выполненной.источник
dd
копирования частичных блоков - это не всегдаbs * count
.dd
безbs=2048
или несколько их кратно может привести к ошибке при чтении с дисковода блочных устройств.Опция Blocksize on
dd
эффективно определяет, сколько данных будет скопировано в память из подсистемы ввода-вывода перед попыткой обратной записи в подсистему ввода-вывода. Выходные данные одинаковые (поскольку копируется весь диск), фрагменты просто читаются с указанным вами разным размером (в большинствеdd
реализаций размер блока по умолчанию составляет 512 байт).Если у вас есть большой объем свободной памяти и увеличен размер блока, то более крупные фрагменты данных могут считываться последовательно, буферизироваться и сбрасываться в место назначения вывода. Меньший размер блока требует больше затрат с точки зрения каждого отдельного lseek, memset и т. Д.
Ваш пробег может варьироваться в зависимости от того, где вы
if=
иof=
установлены, и какое оборудование вы проходите, если у вас мало памяти и так далее.источник
В шс = представляет собой размер блока для чтения или записи. Если оставить поле нетронутым или не указывать его, то может показаться, что оно выполняет ту же работу по копированию, но при его использовании есть скрытый факт. Например,
В первом случае использование меньшего размера блока увеличило скорость копирования. В последнем случае более высокий размер блока был лучшим вариантом, поскольку он увеличивает размер сектора, оставляя меньше
sector change
команд, что обычно приводит к более быстрым операциям ввода-вывода.источник