На работе часто бывает необходимо перенести или скопировать Windows 7 с одного HDD на другой по разным причинам, умирает HDD или нужно установить HDD с меньшим или наоборот с бОльшим объемом, в общем проблема решается довольно просто, при помощи 2 утилит dd и Gparted.

Загружаемся в Ubuntu LiveCD, у меня была загрузка по сети образа Ubuntu 12.04 LTS Desktop.

И первым делом копируем главную загрузочную запись (MBR):

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

После чего запускаем Ggparted и копируем разделы (она имеется в обычном ISO).

Не забываем проверить флаг boot на 100Мбайтном разделе.


Немного об утилите dd:

  • if=/dev/sda -- input file (входной файл, в данном случае диск с Windows 7)
  • of=/dev/sdb -- output file (выходной файл, в данном случае диск куда копируем)
  • bs=512 -- block size (Внимание! Операнд count работает с блоками, а не с байтами! 512 блоков)
  • count=1 -- count (количество раз проведения операции копирования буфером)

MBR находится в 0 секторе первого раздела жесткого диска и занимает вместе с таблицей разделов ровно 512 байт. Поэтому и размер блока выбираем 512, а количество count единица - получаем 512 байт.

А если нам нужно не весь MBR, а только загрузочный код, который занимает первые 446 байт 0 сектора, то придется изменить размер блока:

dd if=/dev/sda of=boot-code.mbr bs=446 count=1

Обратите внимание, на то, что сохраняем в файл, т.к. в устройство записать такой объем не получится, как уже говорилось выше, запись на устройства производится блоками по 512 байт.

Чтобы теперь записать сохраненный загрузчик, нужно получить блок размером в 512 байт, для этого сохраняем в другой файл таблицу разделов - это оставшиеся 66 байт после загрузочного кода - 446 байт.

dd if=/dev/sdb of=part-table.mbr bs=1 count=66 skip=446

skip=n(блоков) Этот операнд пропускает n блоков от начала входного (if) файла(устройства), а затем копирует указанное количество блоков.

Внимание! Операнд skip (как и count) имеет дело с блоками, а не с байтами! Поэтому размер блока следует выбирать вдумчиво. И еще обратите внимание на то, что сейчас мы выбрали устройство /dev/sdb, т.к. нам нужна таблица разделов именно этого устройства, ведь мы туда собираемся копировать загрузчик с устройства /dev/sda :)

Теперь нужно "собрать" MBR из имеющихся кусочков:

cat boot-code.mbr > mbr
cat part-table.mbr >> mbr

Теперь наконец-то мы можем записать загрузочный код на устройство!

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

Ссылки по теме:

  1. Команда dd и её использование.
  2. Как мне скопировать загрузочную запись линуха на дискету?