В статье описано как заставить загружаться компьютер с BIOS, с жесткого диска размеченного в GPT. Данная статья является не переводом оригинальной статьи, а скорее вольным пересказом статьи написанной Rod Smith, за которую лично я ему очень благодарен. Ссылка на первоисточник в конце данной статьи.

Мотивация


На рабочем видеосервере вышел из строя жесткий диск, размеченный в MBR, на котором была установлена ОС Windows 7.

Ситуация осложнялась тем, что диска для замены под рукой не оказалось, покупать долго, от слова ОЧЕНЬ (особенности организации процессов на предприятии), а сервер необходимо вводить в строй.

Из подручных материалов был только диск, который в данном сервере использовался для хранения архива. Сервер старый, а диск из новых (линейка WD Purple), соответственно встал вопрос, каким образом заставить загружаться старый компьютер (читай компьютер с BIOS) с данного жесткого диска, который размечен в GPT, чтобы не терять полезный объем.

Изучение данного вопроса привело на сайт rodsbooks.com, на котором нашлось решение.

Решение задачи


Собственно сам вольный пересказ, за теоретической частью, почему это оказалось не тривиальной задачей, добро пожаловать в великий и могучий Гугль

Итак, для решения данной задачи нам понадобиться Live CD/DVD/USB с GNU/Linux.
Лично я для этих целей пробовал использовать Ubuntu 16.04 и Debian 8. Сам автор предлагает использовать записанный на «болванку» Gparted , но каждый волен использовать то что ему ближе.

Для начала, необходимо обзавестись DUET: gitlab.com/tianocore_uefi_duet_builds/tianocore_uefi_duet_installer/repository/master/archive.tar.gz (собственно вся «магия» содержится именно в нем), а также SYSLINUX: www.kernel.org/pub/linux/utils/boot/syslinux/5.xx/syslinux-5.10.tar.gz (скачивать необходимо именно эту версию, в последующих необходимый для дальнейших манипуляций файл gptmbr.bin не скомпилирован. Чтобы не проводить его компиляцию самим, просто скачайте архив по ссылке).

Полученные файлы необходимо записать в удобное сетевое хранилище (либо на флешку) после чего, для удобства, перенести во временное хранилище на запущенной Linux системе.
Теперь загружаемся в любимый дистрибутив GNU/Linux.

Первое, что необходимо после загрузки в Live CD, разметить наш диск в таблице разделов GPT.
(Я привожу примеры для Ubuntu 16.04)
Открываем консоль (консоль должна быть английской, локализованая консоль вызывает ошибки при обработке скрипта) и размечаем диск при помощи fdisk:

ubuntu@ubuntu:~$ sudo fdisk /dev/sda

Теперь создаем новую таблицу разделов GPT на диске, а также необходимые разделы. Предполагается, что диск в системе один и определяется как /dev/sda, в противном случае, необходимо изменить название диска на то, которое подходит именно вам.

Command (m for help): g
Created a new GPT disklabel (GUID: 416CDA03-62CB-4E45-8260-DD7723111AF7).

Command (m for help): n
Partition number (1-128, default 1): 1
First sector (2048-62914526, default 2048): 
Last sector, +sectors or +size{K,M,G,T,P} (2048-62914526, default 62914526): +100M

Created a new partition 1 of type 'Linux filesystem' and of size 100 MiB.

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 1
Changed type of partition 'Linux filesystem' to 'EFI System'.

Command (m for help): n
Partition number (2-128, default 2): 
First sector (206848-62914526, default 206848): 
Last sector, +sectors or +size{K,M,G,T,P} (206848-62914526, default 62914526): 

Created a new partition 2 of type 'Linux filesystem' and of size 29.9 GiB.

Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 11

Changed type of partition 'Linux filesystem' to 'Microsoft basic data'.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Я не буду коментировать по шагам то, что описано выше, т.к. это стандартные процедуры, которые выполняются в fdisk. Единственное, на что стоит обратить внимание, так это на то, что при создании первого раздела, на котором будет храниться DUET, необходимо изменить его тип на 'EFI System' (

Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): 1
Changed type of partition 'Linux filesystem' to 'EFI System'.

), а тип второго раздела, выбрать как 'Microsoft basic data' (

Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 11

Changed type of partition 'Linux filesystem' to 'Microsoft basic data'.

) собственно на него и будет в дальнейшем производится установка Windows.


С разметкой закончили, теперь создаем файловые системы:

ubuntu@ubuntu:~$ sudo mkfs.fat -F32 /dev/sda1
mkfs.fat 3.0.28 (2015-05-16)
ubuntu@ubuntu:~$ sudo mkfs.ntfs -f /dev/sda2
Cluster size has been automatically set to 4096 bytes.
Creating NTFS volume structures.
mkntfs completed successfully. Have a nice day.

Со стандартными процедурами закончили, теперь переходим к магии.

Установка DUET


Я скопировал SYSLINUX и TianoCore в /tmp/1 и перешел в папку с TianoCore:

ubuntu@ubuntu:~$ cd /tmp/1/tianocore_uefi_duet_installer/
ubuntu@ubuntu:/tmp/1/tianocore_uefi_duet_installer$ ll
total 96
drwxrwxr-x 10 ubuntu ubuntu   400 Nov  7  2013 ./
drwxrwxr-x  4 ubuntu ubuntu    80 Sep  1 06:37 ../
drwxrwxr-x  2 ubuntu ubuntu   260 Nov  7  2013 BootSector/
-rw-rw-r--  1 ubuntu ubuntu  2155 Nov  7  2013 copy_duet_files.sh
-rw-rw-r--  1 ubuntu ubuntu  2921 Nov  7  2013 CreateUSB.cmd
-rw-rw-r--  1 ubuntu ubuntu 16019 Nov  7  2013 duet-install
-rw-rw-r--  1 ubuntu ubuntu  9116 Nov  7  2013 duet-install.8
drwxrwxr-x  4 ubuntu ubuntu    80 Nov  7  2013 Efildr/
-rw-rw-r--  1 ubuntu ubuntu 20480 Nov  7  2013 Elevate.exe
drwxrwxr-x  3 ubuntu ubuntu    60 Nov  7  2013 Extras/
drwxrwxr-x  2 ubuntu ubuntu    80 Nov  7  2013 Licenses/
drwxrwxr-x  3 ubuntu ubuntu    60 Nov  7  2013 Linux_Source/
-rw-rw-r--  1 ubuntu ubuntu  9282 Nov  7  2013 Migle_BootDuet_INSTALL.txt
drwxrwxr-x  3 ubuntu ubuntu   160 Nov  7  2013 Modified_files_for_compiling_EDK1_DUET_in_Windows_X64/
-rw-rw-r--  1 ubuntu ubuntu  3536 Nov  7  2013 README.txt
drwxrwxr-x  2 ubuntu ubuntu    80 Nov  7  2013 Shell/
-rw-rw-r--  1 ubuntu ubuntu 13673 Nov  7  2013 UDK_EDK2_DuetPkg_Changes_to_Makefiles.patch
-rw-rw-r--  1 ubuntu ubuntu  1821 Nov  7  2013 Usage_Linux.txt
-rw-rw-r--  1 ubuntu ubuntu  2165 Nov  7  2013 Usage_Windows.txt
drwxrwxr-x  2 ubuntu ubuntu    80 Nov  7  2013 Windows_Binaries/
ubuntu@ubuntu:/tmp/1/tianocore_uefi_duet_installer$

Делаем исполняемыми copy_duet_files.sh и duet-install:

ubuntu@ubuntu:/tmp/1/tianocore_uefi_duet_installer$ chmod +x copy_duet_files.sh duet-install

Устанавливаем DUET:

ubuntu@ubuntu:/tmp/1/tianocore_uefi_duet_installer$ sudo ./duet-install -m -s ../syslinux-5.10/mbr /dev/sda1
Will install SYSLINUX to the MBR
Will install SYSLINUX to the MBR
Path to SYSLINUX is ../syslinux-5.10/mbr
Path to bootduet is /tmp/1/tianocore_uefi_duet_installer/BootSector
Path to UEFI DUET is /tmp/1/tianocore_uefi_duet_installer
Will install UEFI version UDK
Target partition is /dev/sda1

Target disk (for storing MBR boot code) is /dev/sda
Partition number is 1
Partition starts at sector 2048
FAT32 filesystem found on /dev/sda1
Partition table type is gpt

Proceeding with installation will overwrite at least some data on /dev/sda1.
This is your LAST CHANCE to abort! Do you want to continue (Y/N)? y
Preparing disk...
Writing 00 08 00 00  to boot partition's hidden sectors field

Installing SYSLINUX...
Installing BootDuet...
Installing UEFI DUET....

Installation completed without errors; the disk should now be bootable!
You may need to copy an EFI boot loader, such as ELILO or GRUB 2, to the
disk.

Теперь необходимо скопировать эмулятор EFI TianoCore:

ubuntu@ubuntu:/tmp/1/tianocore_uefi_duet_installer$ sudo mount /dev/sda1 /mnt
ubuntu@ubuntu:/tmp/1/tianocore_uefi_duet_installer$ sudo ./copy_duet_files.sh /mnt EDK_UEFI64

--------
PARTITION MOUNTPOINT = /mnt

PARTITION FILESYSTEM = FAT32

UEFI-DUET FIRMWARE BUILD = EDK_UEFI64
--------

+ cp --verbose /tmp/1/tianocore_uefi_duet_installer///Efildr/EDK_UEFI64//Efildr20 /mnt/EFILDR20
'/tmp/1/tianocore_uefi_duet_installer///Efildr/EDK_UEFI64//Efildr20' -> '/mnt/EFILDR20'
+ mkdir -p /mnt/EFI/tools/
+ cp --verbose /tmp/1/tianocore_uefi_duet_installer///Shell//shellx64_v1.efi /tmp/1/tianocore_uefi_duet_installer///Shell//shellx64_v2.efi /mnt/EFI/tools/
'/tmp/1/tianocore_uefi_duet_installer///Shell//shellx64_v1.efi' -> '/mnt/EFI/tools/shellx64_v1.efi'
'/tmp/1/tianocore_uefi_duet_installer///Shell//shellx64_v2.efi' -> '/mnt/EFI/tools/shellx64_v2.efi'
+ mkdir -p /mnt/EFI/tools/extras
+ cp --verbose /tmp/1/tianocore_uefi_duet_installer///Extras/X64//diskpart.efi /tmp/1/tianocore_uefi_duet_installer///Extras/X64//efichk.efi /tmp/1/tianocore_uefi_duet_installer///Extras/X64//efifmt.efi /mnt/EFI/tools/extras/
'/tmp/1/tianocore_uefi_duet_installer///Extras/X64//diskpart.efi' -> '/mnt/EFI/tools/extras/diskpart.efi'
'/tmp/1/tianocore_uefi_duet_installer///Extras/X64//efichk.efi' -> '/mnt/EFI/tools/extras/efichk.efi'
'/tmp/1/tianocore_uefi_duet_installer///Extras/X64//efifmt.efi' -> '/mnt/EFI/tools/extras/efifmt.efi'
+ set +x +e
--------
DUET EDK_UEFI64 files have been copied to the FAT32 PARTITION successfully
--------

Монтируем первый раздел в /mnt и устанавливаем EFI. Я выбрал EDK_UEFI64, потому что в дальнейшем при настройке загрузки, UDK_X64 почему-то не сохранял настройки. Разбираться было лень.

Вот и вся магия. Достаточно перезагрузить компьютер и в BIOS выставить загрузку с жесткого диска. В результате должна получится приветственная надпись как изображено ниже:



После нее, если все прошло гладко, и скрипт copy_duet_files.sh отработал правильно, появится приглашение эмулятора EFI.

К сожалению, на виртуальной машине воспроизвести это не получается, поэтому я привел картинку от EFI VirtualBox, она практически такая же как и та, которую должны увидеть вы.



Дальнейшая настройка загрузки производится уже через это меню. Оставляю последующую настройку загрузки через меню EFI для персонального изучения, тем более, что ничего сложного там нет. К примеру для начала можно потренироваться в том же VirtualBox в режиме загрузки EFI.

Вставляем диск с дистрибутивом Windows в дисковод или используем предварительно сформированную установочную флешку. В меню эмулятора EFI выбираем откуда производить загрузку (это выбирается через меню 'Boot Maintenance Manager' > 'Boot From File', выбор устройства с которого грузится флешка или CD/DVD. Для начала установки этого достаточно. В списке надо будет выбрать файл bootx64.efi именно он является загрузочным). Дальнейшая загрузка и установка происходит при помощи стандартного установщика Windows, но с возможностью установки на диск, который размечен в GPT.

На этом все. Спасибо за внимание.

Оригинальная статья: by Rod Smith

Комментарии (12)


  1. Chugumoto
    01.09.2017 13:23

    а вот интересно… во время установки Windows не перепишет ли загрузчик на себя?


    1. cyber-punk Автор
      01.09.2017 13:35

      Нет, не перепишется. Проверено!!!


      1. cyber-punk Автор
        01.09.2017 14:13

        Точнее сказать, загрузчик Windows не перепишет нулевой сектор, в котором в случае с MBR, прописан начальный загрузчик. Он пропишет свой загрузчик в раздел с эмулятором EFI точно так же, как бы он это сделал при установке в обычном режиме с использованием UEFI (не BIOS), а не в режиме эмуляции EFI.
        Хотел написать более развернутый комментарий, но понял, что он будет уж слишком расширеным, поэтому, как и писал в статье, рекомендую с данной проблематикой ознакомится в интернете.
        К стати, статья которая натолкнула на мысль и заставила идти дальше: Ручная установка Windows 7/8/8.1/10 в систему с загрузчиком GRUB2. Спасибо ее автору maisvendoo


  1. schetilin
    01.09.2017 17:01

    А обратная задача имеет решение? WindowsXP на GPT диск под UEFI (режим эмуляции BIOS не предлагать). Год назад гуглил — ничего не нашел. Может кто подскажет решение (если есть)?


    1. boris768
      01.09.2017 18:42

      Если кто-то напишет ntloader для uefi. В reastos это делают, но оно не готово для использования. Тем не менее freeloader все же может запустить w2k3 в биос режиме


    1. cyber-punk Автор
      01.09.2017 21:15

      К стати, пришла тут мысль. Почему бы не грузить XP не из родного загрузчика ntloader, который в стандартном режиме при разметке MBR должен находится на активном разделе, а из, к примеру, GRUB2?
      Как мне видится, для этого нужно установить grub-efi и в через него уже настраивать загрузку XP. Или использовать efibootmgr, но с ним я пока еще не знаком.


      1. Kobalt_x
        02.09.2017 14:24

        а grub2 winXP типо не через ntldr грузит, ни разу не видел способов загрузки винды без передачи управления другому загрузчику


        1. cyber-punk Автор
          02.09.2017 16:48

          Да grub2 WinXP грузит через ntldr, но при этом, совсем не обязательно чтобы раздел, на котором располагается ntldr был активным, соответственно, его можно разместить на GPT разделе, но это все в теории. Чтобы однозначно ответить, надо проверять на практике.


  1. cyber-punk Автор
    01.09.2017 17:19

    Боюсь, что только виртуализация.


  1. cyber-punk Автор
    01.09.2017 21:26

    Не успел дописать в предыдущем ответе на комментарий schetilin. Продолжу мысль:
    Думаю вопрос не в том, как с GPT загрузить XP, вопрос в том, как из под UEFI установить XP на GPT разметку?!
    Хотя, думаю, и это можно попробовать обойти путем не установки в чистом виде, а разворачивании из образа, как предложил maisvendoo в своей статье.
    Спасибо schetilin за интересную мысль. Постараюсь попробовать, потом или статью напишу по этому поводу или напишу комментарий к данной статье с результатами.


  1. maisvendoo
    02.09.2017 19:10
    +2

    Чертовски интересно. Плюс однозначно.
    Но. В такого типа статье хочется увидеть ответ на вопрос «как это работает?», а не просто голое решение без объяснения. Собственно гуглить то мы умеем, но иногда гугление растягивается на годы, как в случае с упомянутой здесь моей статьей. Публикация решения, имхо, должна нести и просветительскую функцию. Автор же мало уделил внимания голой теории.

    Как я понял, биос запускает grub, а тот в свою очередь путем хитрой манипуляции запускает EFI, которая уже делает свою работу (ищет efi-раздел, ищет там загрузчик и т.п.). Интересна, без сомнения, механика всего этого процесса


    1. cyber-punk Автор
      05.09.2017 12:54

      Всю магию осуществляет SYSLINUX и DUET, больше ничего.
      Первоначально BIOS находит на диске SYSLINUX (прописанный в момент установки DUET на диск), который в свою очередь загружает эмулятор EFI — DUET. Дальнейшая загрузка после DUET осуществляется стандартным загрузчиком OS (файл bootx64.efi).
      Никакого grub в данной связке нет. Вся механика описана в данном комментарии.