Ну, а мы и сами с усами.
Основная проблема клонирования диска при помощи команды 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 байт.