Лучше использовать cat, dd, pv или другую процедуру для копирования CD / DVD?

22

Задний план

Я копирую некоторые CD / DVD-диски с данными в файлы ISO, чтобы использовать их позже без необходимости их в приводе.

Я смотрю в сети на процедуры, и я нашел много:

  • Использование catдля копирования носителя: http://www.yolinux.com/TUTORIALS/LinuxTutorialCDBurn.html

    cat /dev/sr0 > image.iso
    
  • Использование ddдля этого (по-видимому, наиболее широко используется): http://www.linuxjournal.com/content/archiving-cds-iso-commandline

    dd if=/dev/cdrom bs=blocksize count=count of=/path/to/isoimage.iso
    
  • Использование просто pvдля достижения этой цели: смотрите man pvдля получения дополнительной информации, хотя вот выдержка из этого:

    Taking an image of a disk, skipping errors:
          pv -EE /dev/sda > disk-image.img
    
    Writing an image back to a disk:
          pv disk-image.img > /dev/sda
    
    Zeroing a disk:
          pv < /dev/zero > /dev/sda
    

Я не знаю , если все они должны быть эквивалентны, хотя я тестировал некоторые из них ( с помощью md5sumинструмента) и, по крайней мере, ddи pvэто не эквивалентны. Вот md5sumкак диск, так и сгенерированные файлы с использованием каждой процедуры:

процедура md5 of dd: 71b676875b0194495060b38f35237c3c

процедура md5 из pv: f3524d81fdeeef962b01e1d86e6acc04

РЕДАКТИРОВАТЬ: Этот вывод был с другого компакт-диска, чем данный вывод. На самом деле, я понял, что есть некоторые интересные факты, которые я привожу в качестве ответа.

На самом деле, размер каждого файла отличается от другого.

Итак, есть ли лучшая процедура для копирования CD / DVD или я просто неправильно использую команды?


Больше информации о ситуации

Вот дополнительная информация о тестовом примере, который я использую для проверки процедур, которые я нашел до сих пор:

isoinfo -d i /dev/sr0 Выходные данные: https://gist.github.com/JBFWP286/7f50f069dc5d1593ba62#file-isoinfo-output-19-aug-2015

ddскопировать носитель с контрольными суммами вывода и информацией о файле. Вывод: https://gist.github.com/JBFWP286/75decda0a67605590d32#file-dd-output-with-md5-and-sha256-19-aug-2015

pvскопировать носитель с контрольными суммами вывода и информацией о файле. Вывод: https://gist.github.com/JBFWP286/700a13fe0a2f06ce5e7a#file-pv-output-with-md5-and-sha256-19-aug-2015

Любая помощь будет оценена!


источник
одинаковые ли размеры файлов? результат cmp file1 file2? Вы использовали ddс неправильным count=(или вообще каким-либо подсчетом, который не нужен, если вы хотите все это?). Ошибки чтения в dmesg?
frostschutz
2
Само собой разумеется, что файлы разных размеров (с вероятностью 99.9999999999 +%) будут иметь разные контрольные суммы. Пока вы выполняете тесты, было бы хорошо, если бы вы опубликовали все результаты, включив (1) точную ddкоманду, которую вы использовали (какой размер блока? Какое количество?), (2) размеры и контрольные суммы все выходы и (3) любую независимую информацию о количестве данных на исходном оптическом диске. ... ... ... ... ... ... PS Почему вы используете count=на dd? Вы хотите скопировать весь образ диска, не так ли?  count=говорит "скопируйте это много и затем остановитесь".
Скотт
@Scott На этой странице linuxjournal.com/content/archiving-cds-iso-commandline автор говорит, что нужно использовать, isoinfo -d -i /dev/cdromчтобы узнать число и использовать его - фактически, он говорит, что не следует использовать просто dd. «В любом случае, если вы хотите получить соответствующий ISO-образ этого компакт-диска, вам необходимо получить правильный размер блоков и количество блоков перед созданием образа».
@frostschutz В первом случае размеры были не идентичны, но, что удивительно, я попробовал еще раз и получил другие результаты. Смотрите ответ, который я предоставил для более подробной информации.

Ответы:

27

Все следующие команды эквивалентны. Они читают байты компакт-диска /dev/sr0и записывают их в файл с именем image.iso.

cat /dev/sr0 >image.iso
cat </dev/sr0 >image.iso
tee </dev/sr0 >image.iso
dd </dev/sr0 >image.iso
dd if=/dev/cdrom of=image.iso
pv </dev/sr0 >image.iso
cp /dev/sr0 image.iso
tail -c +1 /dev/sr0 >image.iso

Почему вы используете один поверх другого?

  • Простота. Например, если вы уже знаете catили cp, вам не нужно изучать еще одну команду.

  • Надёжность. Это один из вариантов простоты. Насколько велик риск того, что изменение команды изменит то, что она делает? Давайте посмотрим на несколько примеров:

    • Что-нибудь с перенаправлением: вы можете случайно переадресовать неправильное направление или забыть об этом. Поскольку предполагается, что местом назначения является несуществующий файл, set -o noclobberубедитесь, что вы ничего не перезаписываете; однако вы можете перезаписать устройство, если вы случайно пишете >/dev/sda(для компакт-диска, который предназначен только для чтения, риска нет, конечно). Это говорит в пользу cat /dev/sr0 >image.iso(трудно ошибиться ошибочным образом) перед такими альтернативами, как tee </dev/sr0 >image.iso(если вы перевернете перенаправления или забудете входные, teeнапишите в /dev/sr0).
    • cat: вы можете случайно объединить два файла. Это оставляет данные легко спасаемыми.
    • dd: iи oблизко к клавиатуре, и несколько необычно. Там нет эквивалента noclobber, с of=радостью перезаписать что-нибудь. Синтаксис перенаправления менее подвержен ошибкам.
    • cp: если вы случайно поменяете местами источник и цель, устройство будет перезаписано (опять же, при условии, что устройство не только для чтения). Если cpвызывается с некоторыми опциями, такими как -Rили -aкоторые некоторые люди добавляют через псевдоним, он будет копировать узел устройства, а не содержимое устройства.
  • Дополнительный функционал. Единственный инструмент, который обладает полезными дополнительными функциями, - pvэто мощные опции отчетности.
    Но здесь вы можете проверить, сколько было скопировано, смотря на размер выходного файла.

  • Спектакль. Это процесс ввода-вывода; основное влияние на производительность оказывает размер буфера: инструмент считывает порцию из источника, записывает порцию в место назначения, повторяет. Если чанк слишком маленький, компьютер тратит свое время на переключение между задачами. Если чанк слишком велик, операции чтения и записи не могут быть распараллелены. Оптимальный размер блока на ПК обычно составляет несколько мегабайт, но это, очевидно, очень зависит от ОС, оборудования и от того, что еще делает компьютер. Я сделал сравнительные тесты для копий с жесткого диска на жесткий диск некоторое время назад, в Linux, который показал, что для копий на том же диске, dd имеющих большой размер буфера , преимущество, но для кросс-дисковых копий, catвыиграл любой ddразмер буфера.

Есть несколько причин, по которым вы ddтак часто упоминаете. Помимо производительности, они не особенно веские причины.

  • В очень старых системах Unix некоторые инструменты обработки текста не могли справиться с двоичными данными (они использовали строки с нулевым символом в конце , поэтому они обычно имели проблемы с нулевыми байтами; некоторые инструменты также предполагали, что символы используют только 7 битов и не обрабатывать 8-битные наборы символов правильно). Я не уверен, что это когда-либо было проблемой cat(это было с более линейно-ориентированными инструментами, такими как head, sedи т. Д.), Но люди склонны избегать этого на двоичных данных из-за его связи с обработкой текста. Это не проблема в современных системах, таких как Linux, OSX, * BSD или любых других, которые POSIX-совместимы.
  • Существует своего рода миф, который ddявляется несколько «более низким уровнем», чем другие инструменты, такие как catи непосредственно обращающиеся к устройствам. Это совершенно неверно: ddи catи teeи другие все для чтения байтов из их ввода и записывает байты в их продукции. Настоящая магия в /dev/sr0.
  • ddимеет необычный синтаксис командной строки, поэтому объяснение того, как он работает, дает больше возможностей сиять, объясняя то, что просто пишет cat /dev/sr0.
  • Использование dd с большим размером буфера может иметь лучшую производительность, но это не всегда так (см. Некоторые тесты в Linux ).

Основной риск ddзаключается в том, что он может молча пропускать некоторые данные . Я думаю, ddэто безопасно, пока skipили countне пройден, но я не уверен, так ли это на всех платформах. Но это не имеет никакого преимущества, кроме производительности.

Так что просто используйте, pvесли вы хотите, чтобы вы представили свой отчет о проделанной работе, или catесли нет.

Жиль "ТАК - перестать быть злым
источник
Большое спасибо за ваше время написания этого ответа! =) Теперь я понимаю разницу между ними. Просто вопрос: естьpv < /dev/sr0 > image.iso же, как pv /dev/sr0 > image.iso(последний находится в справочных страницах pv)?
1
@ JBFWP286 Они копируют одно и то же, но pv /dev/sr0 …могут включать имя файла в отчеты о ходе выполнения, а pv </dev/sr0не могут.
Жиль "ТАК - перестань быть злым"
Еще одно примечание: cpможет быть псевдоним cp -R, который (по крайней мере, в GNU cp как root) вызывает cpкопирование узла устройства, а не его содержимого.
Марсель
2
@ JBFWP286 Узел устройства - это файл, через который вы получаете доступ к оборудованию или другим специальным функциям, предоставляемым драйверами ядра. Почти все файлы в нем /devявляются узлами устройства. Например, cp -R /dev/sr0 image.isoможно создать image.isoфайл, к которому осуществляется доступ к дисководу компакт-дисков /dev/sr0, вместо обычного файла, содержащего копию содержимого компакт-диска, который вы получаете cp /dev/sr0 image.iso.
Жиль "ТАК - перестань быть злым"
1
@ Хашим, я не делаю вывод, что у него лучшая производительность. Я упоминаю, что иногда он имеет лучшую производительность . Я связан с эталоном я сделал - в лучшем случае ddбить , catно только с небольшим отрывом.
Жиль "ТАК - перестань быть злым"
4

В этом случае есть интересные факты, особенно такие:

  • Я только что проверил вывод, который получил и предоставил (на этот раз я использовал другой диск, точно, установочный диск Xubuntu 15.04 x64), и обе процедуры ( ddи pv) контрольные суммы идентичны .
  • У меня была идея, после выполнения ddпроцедуры, открыть диск и закрыть его с тем же диском, а затем завершить тест с pvпроцедурой. Делая это, я получил идентичные копии с обеими процедурами.
  • Я думаю, что я получил разные контрольные суммы в первый раз, потому что по какой-то причине данные, собранные с привода CD / DVD, кажется, «записаны» для других целей в течение некоторого времени (например, кеш) - таким образом, другие операции, такие как контрольные суммы были сделано намного быстрее чем передача. Пожалуйста, прокомментируйте, если вы знаете точную причину этого.
  • Другой факт заключается в том, что dd без count=Xконца параметр корректно останавливается в конце диска и дает тот же образ диска, что и с pv(контрольные суммы идентичны), поэтому для меня лучше использовать ddпараметры без или просто pv.

Итак, на данный момент, кажется, pvи ddможно сделать копию CD / DVD с теми же результатами.

Руи Ф Рибейро
источник