Я потратил полчаса на чтение, чтобы подготовиться к клонированию моего жесткого диска. Он имеет несколько разделов, включая раздел Windows. Я собираюсь купить очень большой внешний жесткий диск для резервного копирования. Я хотел бы иметь возможность использовать этот клон для восстановления всего диска в случае, если что-то пойдет не так (я собираюсь сделать некоторые перестановки ОС). Я хочу научиться делать это с помощью dd, так как мне нравятся низкоуровневые инструменты, которые не требуют установки ничего.
Я нашел следующий полезный код с форумов Ubuntu (введенный из корневой оболочки с использованием live CD):
dd if=/dev/hda of=/dev/hdb & pid=$!
while kill -USR1 $pid; do sleep 1; done
(Я знаю, что мне придется редактировать места ввода и вывода.) Однако у меня есть два вопроса. Первая очень неопрятна: эта команда разбита на две строки. Конечно, когда я нажимаю Enter после восклицательного знака, он запускает процесс?
Во-вторых, на других сайтах рекомендуется вводить размер блока. Как это:
# dd if=/dev/hda conv=sync,noerror bs=64K of=/mnt/sda1/hda.img
Я ничего не знаю о размерах блоков. Правильно ли 64K? Похоже, мой размер блока составляет 512 байт из следующего, вывод sudo fdisk -ul:
Disk /dev/sda: 750.2 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders, total 1465149168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0xc3ffc3ff
Device Boot Start End Blocks Id System
/dev/sda1 * 63 143364059 71681998+ 7 HPFS/NTFS/exFAT
Partition 1 does not start on physical sector boundary.
/dev/sda2 976867328 1465147391 244140032 7 HPFS/NTFS/exFAT
/dev/sda3 143364094 976867327 416751617 5 Extended
Partition 3 does not start on physical sector boundary.
/dev/sda5 143364096 162895871 9765888 82 Linux swap / Solaris
/dev/sda6 162897920 205864959 21483520 83 Linux
/dev/sda7 205867008 976867327 385500160 83 Linux
Partition table entries are not in disk order
Disk /dev/mapper/cryptswap1: 10.0 GB, 10000269312 bytes
255 heads, 63 sectors/track, 1215 cylinders, total 19531776 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x433bb3a7
Disk /dev/mapper/cryptswap1 doesn't contain a valid partition table
Спасибо.
dd if=/dev/hda of=hdb
? Вот ответ, который показывает некоторые детали, включая время выполнения для 160 ГБ: askubuntu.com/questions/435694/…dd
включен переключатель прогресса, как упомянуто здесьОтветы:
Прогресс
Команда, которую вы перечислили
хороший двухлинейный, чтобы получать прогресс
dd
на регулярной основе. Я тоже использую очень похожий. Выглядит хорошо. Нашли здесь что- нибудь?Блокирует с
dd
: выравнивание и производительностьВы можете добавить размер блока, в котором будут выполняться операции. Неважно, какой размер блока базового блочного устройства обеспечивает одинаково хорошее выполнение операции, но по соображениям производительности вы можете выбрать тот, который соответствует вашим потребностям.
Прежде всего, есть вещь выравнивания . Если ваше блочное устройство работает как 512 КБ (как это делают флэш-накопители), было бы очень неудачно работать
dd
сbs=512
(байтами), так как это вызовет 1024 записи (!) Для каждого блока с точки зрения устройства. На практике это не будет так плохо, поскольку записи буферизуются и обрабатываются за один раз, но во время синхронизации они все же могут значительно увеличить количество записей.Затем также учитывайте обычную нагрузку на процессор при работе с очень большим количеством мелких операций. Просто более эффективно брать мегабайты сразу при копировании больших объемов данных.
Моя лучшая практика - начинать с 1 МБ, так как это неплохое множество большинства настроек, включая размеры полосы RAID, размеры экстентов LVM и т. Д. На моем ноутбуке с твердотельным накопителем я, как правило, вижу небольшое улучшение, используя размер блока 10 МБ, тогда как я больше не вижу на моем физическом жестком диске.
Последний блок
Не беспокойтесь о том, что размер диска / тома не кратен размеру блока. Последний
dd
скопированный блок будет скорректирован в соответствии с последним битом данных на нем. Вы можете увидеть, был ли последний блок другого размера, посмотрев на вывод.В
+0
означает , что это было точное совпадение, а+1
значит , что это не было. Ничего страшного.Смотрите также
источник
# dd if=/dev/hda conv=sync,noerror bs=1MB of=/mnt/sda1/hda.img & pid=$!
while kill -USR1 $pid; do sleep 1; done
bs=1M
как это степень 2, а неbs=1MB
степень 10. Но просто запустите несколько тестов в вашей системе, если вы можете увидеть, что лучше.kill -USR1 $pid
dd теперь имел отчет о проделанной работе, добавивstatus=progress
переключательКак уже говорили другие, не существует универсально правильного размера блока; то, что оптимально для одной ситуации или одного устройства, может быть ужасно неэффективно для другой. Кроме того, в зависимости от работоспособности дисков может оказаться предпочтительным использовать другой размер блока, чем тот, который является «оптимальным».
Одна вещь, которая довольно надежна на современном оборудовании, состоит в том, что размер блока по умолчанию в 512 байт имеет тенденцию быть почти на порядок медленнее, чем более оптимальная альтернатива. Когда я сомневался, я обнаружил, что 64K - довольно солидный современный стандарт. Хотя 64K обычно не является оптимальным размером блока, по моему опыту, он намного эффективнее, чем по умолчанию. 64K также имеет довольно солидную историю надежной производительности: вы можете найти сообщение из списка рассылки Eug-Lug , около 2002 года, с рекомендацией размера блока 64K.
Для определения оптимального размера выходного блока я написал следующий скрипт, который тестирует запись 128-мегагерцового файла с dd в диапазоне разных размеров блока, от 512 байт по умолчанию до 64M максимум. Имейте в виду, этот скрипт использует dd для внутреннего использования, поэтому используйте его с осторожностью.
dd_obs_test.sh
:Посмотреть на GitHub
Я тестировал этот сценарий только в системе Debian (Ubuntu) и в OSX Yosemite, поэтому, возможно, потребуется некоторая настройка для работы с другими версиями Unix.
По умолчанию команда создаст тестовый файл с именем
dd_obs_testfile
в текущем каталоге. Кроме того, вы можете указать путь к пользовательскому тестовому файлу, указав путь после имени скрипта:Выходные данные сценария представляют собой список протестированных размеров блоков и их соответствующих скоростей передачи, например:
(Примечание: единица измерения скорости передачи данных зависит от ОС)
Чтобы проверить оптимальный размер блока чтения, вы можете использовать более или менее тот же процесс, но вместо чтения
/dev/zero
и записи на диск вы будете читать с диска и записывать на него/dev/null
. Сценарий для этого может выглядеть так:dd_ibs_test.sh
:Посмотреть на GitHub
Важным отличием в этом случае является то, что тестовый файл - это файл, который записывается скриптом. Не указывайте эту команду на существующий файл, иначе существующий файл будет перезаписан случайными данными!
Для моего конкретного оборудования я обнаружил, что 128 КБ был самым оптимальным размером входного блока на жестком диске, а 32 КБ был наиболее оптимальным на SSD.
Хотя этот ответ охватывает большинство моих выводов, мне нужно было определить оптимальный размер блока dd достаточно много раз, чтобы я написал об этом в блоге . Вы можете найти более подробную информацию о тестах, которые я провел там.
Этот пост StackOverflow также может быть полезен: dd: Как рассчитать оптимальный размер блока?
источник