Установка Windows 7 Pro x64 к Calculate Linux x64 c GPT EFI

Зачем всё это понадобилось.
Для смарфона Lenovo P770 понадобилось поставить обновление ROW_S106->ROW_S113, которое ставится только путем прошивки аппарата через FlashTool. Под Linux экспериментировать с прошивкой было страшно, т.к. нормальных средств для этого я не нашел и было решено поставить Windows 7 Pro x64 на единственный свободный раздел GPT диска.

Особенности.

  1. Установка Windows 7 в единственный раздел, в то время как установщик обязывает иметь три раздела: ESP, MSR и раздел с системой.
  2. Диск уже разбит на разделы и переразбивать его затруднительно.
  3. Установлен GRUB2 и его необходимо оставить как есть.

Т.е. нужно с минимальными изменениями установить Windows 7 в уже работающую систему.

И так приступим.

  1. Копирование установочных файлов Windows 7 Pro x64.
    Вставив установочный диск с Windows тут же обнаружилось, что существующую таблицу разделов установщик считает неправильной. Значит следующий шаг придется делать на другой машине, которой нет. Но выход есть - виртуальная машина.

1.1. Скопировать файлы установки Windows на один физический раздел.

1.1.1. Выбираем инструмент для копирования установочных файлов Windows на свободный раздел.
Я выбрал VirtualBox (потому что он у меня уже был) для загрузки виртуальной машины с установочного диска Windows и Paragon-14 для копирования подготовленного виртуального раздела на физический.

1.1.2. Копируем установочные файлы Windows на виртуальный раздел.
Загружаем чистую виртуальную машину с загрузочного диска Windows. Я решил ставить систему на один раздел, т.е. объединить раздел с установочными файлами с ESP.
О том как поставить систему в один раздел можно наглядно посмотреть на видео с 5:50 :
http://www.youtube.com/watch?v=8Ljk7WKTb8c#t=350

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

1.1.3. Запускаем виртуальную машину с Paragon boot CD и делаем копию раздела с установочными файлами.

1.1.4. Загружаем компьютер с Paragon boot CD и восстанавливаем копию раздела с установочными файлами Windows в свободный физический раздел. У меня это 5 раздел GPT диска (hd0,gpt5).

 # gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.6                                                                                                                                         
Found valid GPT with protective MBR; using GPT.
Command (? for help): p
Disk /dev/sda: 1465149168 sectors, 698.6 GiB
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          526335   256.0 MiB   EF00  EFI System
   2          526336         1574911   512.0 MiB   8300  Linux filesystem
   3         1574912        18352127   8.0 GiB     8200  Linux swap
   4        18352128        85460991   32.0 GiB    8300  Linux filesystem
   5        85463040       152567807   32.0 GiB    0700  Basic data partition
   6       152569856       286787583   64.0 GiB    8300  Linux filesystem
   7       286787584      1465147391   561.9 GiB   8300  Linux filesystem

1.2. Сконфигурировать загрузчик Windows.

1.2.1. Загружаем компьютер с загрузочного диска Windows 7.
Вызываем консоль Shift-F10. С помощью утилиты diskpart присваиваем разделу (hd0,gpt5) свободную букву, в моем случае - С:

diskpart
> list volume
> select volume
> assign
> exit

С помощью утилиты bcdedit модифицируем конфигурацию загрузчика Windows BCD в директории С:\Boot. Т.к. я ставил Windows 7 в один раздел с ESP, то все файлы у меня в едином разделе.

bcdedit -store c:\Boot\BCD -set {bootmgr} device partition=\Device\HarddiskVolume1
bcdedit -store c:\Boot\BCD -set {bootmgr} path \EFI\Microsoft\Boot\bootmgfw.efi
bcdedit -store c:\Boot\BCD -set {default} device partition=C:
bcdedit -store c:\Boot\BCD -set {default} path \Windows\system32\winload.efi
bcdedit -store c:\Boot\BCD -set {default} osdevice partition=C:

Даже если буква диска С: была занята, то в параметры device partition=C: и osdevice partition=C: надо поставить имеющуюся букву. После перезагрузки всё равно буквы поменяются.

Загрузчик надо привести к следующему виду:

Windows Boot Manager
--------------------
identifier              {bootmgr}
device                  partition=\Device\HarddiskVolume1
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  en-US
inherit                 {globalsettings}
default                 {default}
resumeobject            {3fc29e38-6a32-11e3-ad1f-ea1e11e553b3}
displayorder            {default}
toolsdisplayorder       {memdiag}
timeout                 30

Windows Boot Loader
-------------------
identifier              {default}
device                  partition=C:
path                    \Windows\system32\winload.efi
description             Windows 7
locale                  en-US
inherit                 {bootloadersettings}
recoverysequence        {2342f4cd-69b0-11e3-b888-8796a3ea9673}
recoveryenabled         Yes
osdevice                partition=C:
systemroot              \Windows
resumeobject            {3fc29e38-6a32-11e3-ad1f-ea1e11e553b3}
nx                      OptIn

1.2.2. Загружаем Linux. Копируем директорию \Boot из раздела с установочными файлами Windows в EFI раздел физического диска (hd0,gpt1)\EFI\Microsoft
Затем копируем директорию \Windows\Boot\EFI из раздела с установочными файлами Windows в EFI раздел физического диска (hd0,gpt1)\EFI\Microsoft
Таким образом в EFI разделе (hd0,gpt1) у нас оказалась следующая структура файлов:

./EFI
./EFI/calculate
./EFI/calculate/grubx64.efi
./EFI/Microsoft
./EFI/Microsoft/Boot
./EFI/Microsoft/Boot/BCD
./EFI/Microsoft/Boot/BCD.LOG
./EFI/Microsoft/Boot/BCD.LOG1
./EFI/Microsoft/Boot/BCD.LOG2
./EFI/Microsoft/Boot/BOOTSTAT.DAT
./EFI/Microsoft/Boot/bootmgfw.efi
./EFI/Microsoft/Boot/bootmgr.efi
./EFI/Microsoft/Boot/memtest.efi
+ куча MUI файлов с разными языками и шрифры.

На этом копирование установочных файлов Windows 7 завершено и теперь надо её загрузить и завершить процесс установки.

2. Сконфирурировать загрузчик GRUB2.

2.1. Узнаем UUID EFI раздела:

 # blkid /dev/sda1                                                                                                                                        
/dev/sda1: UUID="0EDA-242E" TYPE="vfat" PARTLABEL="EFI System" PARTUUID="76b2dab2-95fe-43db-b48f-f5cb6624a1a4" 

2.2. Монтируем разделы загрузки, если они еще не смонтированы:

#mount /dev/sda2 /boot
#mount /dev/sda1 /boot/efi

2.3. Обновляем конфигурацию GRUB2:

Вставляем новый раздел в конфигурацию загрузчика GRUB2 /boot/grub/grub.cfg:

menuentry 'Windows 7 (loader) (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprober-chain-0EDA-242E' {
        insmod part_gpt
        insmod fat
        set root='hd0,gpt1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1 --hint='hd0,gpt1'  0EDA-242E
        else
          search --no-floppy --fs-uuid --set=root 0EDA-242E
        fi
        chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}

Теперь можно загрузить Windows 7 и продолжить установку.
В дальнейшем, директорию в разделе Windows C:\Boot и файлы из корня С:\ можно удалить - они в EFI системе там без надобности. И еще, не спешите выбрасывать копию раздела, созданную Paragon - это готовая к развертыванию система, остается только конфигурацию загрузчика BCD подправить.