Быстрое клонирование дисков

Есть ли способ, чтобы 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,

http://www.dei.unipd.it/~zagonico/fastdd/

https://github.com/zagonico86/fastdd

Может быть, вы можете использовать два процесса

dd if=indevfile | dd of=outdevfile

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

О вашем обновлении: Насколько велики кэши ваших HD? (особенно пишущий). Возможно, это слишком много, и вам может потребоваться уменьшить его, чтобы предотвратить ненужную блокировку.

Вы уверены, что он не делает это в то же время? Я ожидаю, что дисковые кеши будут уверены, что это произойдет. Если нет, то могут помочь неблокирующие или даже асинхронные операции чтения / записи,

Другие вопросы по тегам