Категории

четверг, 2 августа 2012 г.

Перенос Windows 7 с одного HDD на другой HDD меньшего объема. (dd + Gparted)

На работе часто бывает необходимо перенести или скопировать 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Мбайтном разделе.




P.S. Немного об утилите 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. Как мне скопировать загрузочную запись линуха на дискету?

2 комментария:

Анонимный комментирует...

не работает данный метод, винда ругается и просит вставить инсталляционный диск, который тоже ничем помочь не может

METAJIJI комментирует...

Сам лично переносил по этому алгоритму, как только перенес, сразу записал на будущее, чтобы не забыть :)

Отправить комментарий