July 24th, 2013

Клонирование разделов

Начальство всё никак не выделит средства для покупки нормального программного обеспечения для клонирования дисков.

Ну, а мы и сами с усами.

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

Проблема решается просто. Не надо переносить с диска на диск. Надо переносить только нужный раздел или разделы. Переносимый раздел нужно сначала штатными средствами Windows ужать -- Disk Management, Parition -> Shrink. Ужимать рекомендую до минимальных размеров -- меньше электронов гонять :)

Потом загружаемся в любимый дистрибутив Фрюникса -- хучь BSD, хучь Линупс. Я использовал CentOS.

Предположим, что переносимый диск у нас определится как /dev/sda, с разделом /dev/sda1, а диск, на который нужно перенести (блин, как по-русски правильно сказать target disk?) -- /dev/sdb.

Далее делаем финт ушами -- копируем MBR (и ТОЛЬКО MBR!) с sda на sdb:

dd if=/dev/sda of=/dev/sdb bs=512 count=1

Размер MBR -- 512 байт, из которых первые 446 -- загрузчик, следующие 64 -- таблица разделов, и последние 2 байта -- подпись.

Таким образом, перенеся первые 512 байт с диска на диск мы воссоздадим на конечном диске таблицу разделов с переносимого диска.

Проверяем:

fdisk -u -l /dev/sda
fdisk -u -l /dev/sdb

Размеры разделов и начальные и конечные секторы должны совпадать!

На всякий случай запишем ещё разик таблицу разделов на конечный диск:

fdisk /dev/sdb
Жмём w и ввод.

А теперь можно переносить раздел.

dd bs=64M if=/dev/sda1 of=/dev/sdb1

bs=64M -- какими кусками читать и записывать диски. Правильный размер определяется индивидуально для каждого компьютера, так как зависит от размера кеш-памяти, её организации, и размера кеша на дисках. Иногда у меня получалась высокая производительность при выставлении этого параметра в 64 мегабайта, а иногда скорость росла при снижении до 16 мегабайт. Попробовать нужно с разными, а скорость записи можно определить командой iostat. На Линупсе -- iostat -m 1.

И уходим пить кофе.

После окончания переноса -- вытаскиваем старый диск, грузимся с нового, и расширяем перенесённый раздел до нужных размеров! И никаких тебе вылезаний за рамки разделов, и недозаписанных кластеров.

Разумеется, все описанные команды работают также для создания образов дисков в файлах, а также для клонирования дисков по сети.

Пока открытым остаётся вопрос клонирования разделов дисков с GPT вместо MBR. Ещё не приходилось сталкиваться. Предполагаю, что процесс тот же самый, вот бы только размер GPT записи узнать бы. Ведь наверняка больше 512 байт.