Перенос Windows XP на другой диск средствами Linux

Для начала хочу предупредить, что это не точная инструкция как и что делать. Это описание ключевых моментов, для правильного применения которых нужно ещё приложить собственную голову. Если вы не уверены в своих силах, то лучше воспользуйтесь специализированными программами (Acronis True Image или Norton Ghost), а не этим способом, который описывает только средства из Linux.

Перенос средствами Linux оказался не настолько простым делом, как это могло показаться первоначально. Не буду рассказывать обо всём, что мне довелось попробовать и на какие грабли наступить, я просто резюмирую весь полученный опыт.

У меня стоит загрузчик GRUB2, но почему-то не стояло очень важного компонента - os-prober. Он умеет при подсовывании ему дискового раздела определять, что за операционная система там стоит. Его наличие позволит упростить настройку GRUB2. Также, поскольку мы будем переносить систему Windows XP с раздела NTFS на раздел NTFS, нам потребуется пакет ntfsprogs. Ну и если у вас ещё нет раздела на диске, в который вы хотите перенести Windows, вам могут потребоваться fdisk и/или parted. Полезным может оказаться и модуль ntfs-3g для монтирования NTFS-раздела в режиме записи.

# apt-get install os-prober ntfsprogs hexedit

Останавливаться на создании раздела для Windows я не стану, т.к. это дело тривиальное и, на мой взгляд, не требующее объяснений.

Первым делом скопируем NTFS-раздел. Делается это командой ntfsclone:

# ntfsclone --overwrite /dev/sdb3 /dev/sda1

/dev/sda1 - это исходный раздел с Windows,

/dev/sdb3 - это целевой раздел, на который мы переносим систему.

БУДЬТЕ ВНИМАТЕЛЬНЫ, ничего не перепутайте! Посмотреть, какие разделы есть на дисках, можно с помощью команды:

# fdisk -l

Если возникают сомнения, смонтируйте разделы и убедитесь в том, что вы точно знаете, с какого на какой раздел нужно перенести систему. У меня таких проблем не было, т.к. диска было всего два, на одном из дисков было аж 6 разделов, а на другом - только 1, поэтому перепутать их было трудно.

После клонирования мы получим раздел в точности повторяющий исходный. Ловушка заключается в том, что загрузчик Windows, располагающийся в начале раздела (NTFS Boot Record), содержит в себе информацию о геометрии диска, положении раздела и о серийном номере этого раздела.

На данном этапе мне помогла статья Relocating Windows to a new Hard Drive, в которой есть ссылка на исходный текст простенькой программы, которая исправляет загрузчик NTFS так, чтобы он узнал о новой геометрии диска. Эту программу я на всякий случай скопировал себе и разместил тут: ntfsreloc.c

Соберём её (для этого может потребоваться установить компилятор языка Си, который у меня уже стоял, т.к. я иногда на нём пишу сам):

$ gcc -o ntfsreloc ntfsreloc.c

Теперь её нужно запустить:

# ntfsreloc -w -p /dev/sdb3

Затем нужно смонтировать диск и исправить в файле boot.ini в корневом каталоге номер раздела, с которого будет грузиться Windows. Раньше у меня это был раздел №1, а теперь - №3.

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(3)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(3)\WINDOWS="Microsoft Windows XP Professional RU" /noexecute=optin /fastdetect

Теперь нужно исправить карту дисков GRUB, которая находится в файле /boot/grub/device.map:

(fd0)   /dev/fd0
(hd0)   /dev/disk/by-id/ata-WDC_WD10EADS-65L5B1_WD-WCAU4A888959
(hd1)   /dev/disk/by-id/ata-ST34313A_6CR0J30R

Диском (hd0) должен быть тот, на который мы переносим систему. Или можно исправить номер диска в файле boot.ini Windows, так чтобы номер загрузочного диска совпадал с номером диска в device.map. Полезно также перед этим настроить привязку дисков в /etc/fstab к UUID раздела или к метке раздела, чтобы в случае путаницы с номерами дисков Linux всё-таки загрузился. Практически во всех современных системах Linux это уже так, т.к. с заменой драйвера IDE на унифицированный драйвер дисков, номер, под которым определится диск, стал непредсказуем.

Дальше нужно обновить конфигурацию GRUB2:

# update-grub

И можно перезагружаться. При первой загрузке нам потребуются оба диска, т.к. в реестре Windows сохранилась привязка к идентификатору прежнего диска. После загрузки системы запускаем regedit и редактируем раздел HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices. В нём нужно поменять буквы дисков C и того, который по содержимому идентичен диску C. У меня это были диски C и D. Сделал я это в три приёма:

После этого завершаем работу, отключаем старый диск и пробуем загрузиться снова. Если всё было сделано правильно, система загрузится с нового диска.

Я таким образом смог отключить противно свистящий старый диск, на котором у меня стоял Windows XP. Сама эта заметка является, по сути, продолжением предыдущей: Настройка fancontrol - демона управления вентиляторами компьютера.

Желаю вам удачного переноса Windows!

P.S. 21 декабря 2013 года. Вместо программы ntfsreloc можно воспользоваться программой partclone.ntfsfixboot из пакета partclone. В этом случае вместо команды

# ntfsreloc -w -p /dev/sdb3

можно воспользоваться командой

# partclone.ntfsfixboot -w /dev/sdb3

Написать автору