Быстрое клонирование дисков
Есть ли способ, чтобы Linux читал вперед при клонировании диска? Я использую программу с именем "dd" для клонирования дисков. В последний раз, когда я делал это, казалось, что ОС читает, а затем пишет, но никогда в одно и то же время. В идеале, целевой диск будет постоянно записывать без ожидания, что, конечно, если исходный диск может не отставать.
ОБНОВЛЕНИЕ: я обычно выбираю большой размер блока при клонировании (например, 16M или 32MB).
7 ответов
Коммодор Йегер прав:
dd if=/dev/sda of=/dev/sdb bs=1M
Кроме того, настройка "readahead" на дисках обычно повышает производительность. По умолчанию это может быть что-то вроде 256, а оптимальное - 1024. Каждая настройка отличается, поэтому вам придется запускать тесты, чтобы найти наилучшее значение.
# blockdev --getra /dev/sda
256
# blockdev --setra 1024 /dev/sda
# blockdev --getra /dev/sda
1024
# blockdev --help
Usage:
blockdev -V
blockdev --report [devices]
blockdev [-v|-q] commands devices
Available commands:
--getsz (get size in 512-byte sectors)
--setro (set read-only)
--setrw (set read-write)
--getro (get read-only)
--getss (get sectorsize)
--getbsz (get blocksize)
--setbsz BLOCKSIZE (set blocksize)
--getsize (get 32-bit sector count)
--getsize64 (get size in bytes)
--setra READAHEAD (set readahead)
--getra (get readahead)
--flushbufs (flush buffers)
--rereadpt (reread partition table)
--rmpart PARTNO (disable partition)
--rmparts (disable all partitions)
#
Вы можете попробовать увеличить размер блока, используя аргумент bs; по умолчанию, я считаю, что dd использует размер блока, равный предпочтительному размеру блока диска, что будет означать гораздо больше операций чтения и записи для копирования всего диска. Linux dd поддерживает удобочитаемые суффиксы:
dd if=/dev/sda of=/dev/sdb bs=1M
Самый быстрый для меня:
dd if=/dev/sda bs=1M iflag=direct | dd of=/dev/sdb bs=1M oflag=direct
достигает ~100 МБ / с, тогда как другие параметры (один процесс, без прямого, размер блока по умолчанию 512b, ...) даже не достигают 30 МБ / с...
Чтобы посмотреть прогресс, запустите в другой консоли:
watch -n 60 killall -USR1 dd
Если два диска используют разные каналы (например, SATA), вы можете использовать высокопроизводительный инструмент, такой как fastDD. Авторы утверждают:
"В этой работе мы рассмотрели проблему надежного и эффективного копирования данных, напомнив обо всех аппаратных и программных механизмах, которые вмешиваются и вмешиваются в процесс копирования. Мы рассмотрели код в Fastdd, программе на C++, способной очень эффективно копировать данные, как мы покажем в нашем тесте."
Более того, инструмент сохраняет синтаксис, очень похожий на старый dd
,
Может быть, вы можете использовать два процесса
dd if=indevfile | dd of=outdevfile
Я предполагаю, что вы можете установить другие параметры dd так, как вам удобно. Это имеет некоторые накладные расходы, но должно позволить асинхронность между чтением одного диска и записью другого.
О вашем обновлении: Насколько велики кэши ваших HD? (особенно пишущий). Возможно, это слишком много, и вам может потребоваться уменьшить его, чтобы предотвратить ненужную блокировку.
Вы уверены, что он не делает это в то же время? Я ожидаю, что дисковые кеши будут уверены, что это произойдет. Если нет, то могут помочь неблокирующие или даже асинхронные операции чтения / записи,