- PVSM.RU - https://www.pvsm.ru -

Загрузка с GPT диска из BIOS

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

Мотивация

На рабочем видеосервере вышел из строя жесткий диск, размеченный в MBR [2], на котором была установлена ОС Windows 7.
Ситуация осложнялась тем, что диска для замены под рукой не оказалось, покупать долго, от слова ОЧЕНЬ (особенности организации процессов на предприятии), а сервер необходимо вводить в строй.
Из подручных материалов был только диск, который в данном сервере использовался для хранения архива. Сервер старый, а диск из новых (линейка WD Purple [3]), соответственно встал вопрос, каким образом заставить загружаться старый компьютер (читай компьютер с BIOS [4]) с данного жесткого диска, который размечен в GPT [5], чтобы не терять полезный объем.

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

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

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

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

Для начала, необходимо обзавестись DUET [9]: gitlab.com/tianocore_uefi_duet_builds/tianocore_uefi_duet_installer/repository/master/archive.tar.gz [10] (собственно вся «магия» содержится именно в нем), а также SYSLINUX [11]: www.kernel.org/pub/linux/utils/boot/syslinux/5.xx/syslinux-5.10.tar.gz [12] (скачивать необходимо именно эту версию, в последующих необходимый для дальнейших манипуляций файл 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 выставить загрузку с жесткого диска.
В результате должна получится приветственная надпись как изображено ниже:
Загрузка с GPT диска из BIOS - 1
После нее, если все прошло гладко, и скрипт copy_duet_files.sh отработал правильно, появится приглашение эмулятора EFI.
К сожалению, на виртуальной машине воспроизвести это не получается, поэтому я привел картинку от EFI VirtualBox, она практически такая же как и та, которую должны увидеть вы.
Загрузка с GPT диска из BIOS - 2
Дальнейшая настройка загрузки настраивается уже через это меню.
Оставляю последующую настройку загрузки через меню EFI для личного изучения, тем более, что ничего сложного там нет.

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

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

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

Автор: cyber-punk

Источник [14]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/sistemnoe-administrirovanie/263119

Ссылки в тексте:

[1] Rod Smith: http://rodsmith@rodsbooks.com

[2] MBR: https://www.google.com.ua/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwi156i68fzVAhVuSZoKHckRBoIQFggsMAI&url=https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%2593%25D0%25BB%25D0%25B0%25D0%25B2%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25B7%25D0%25B0%25D0%25B3%25D1%2580%25D1%2583%25D0%25B7%25D0%25BE%25D1%2587%25D0%25BD%25D0%25B0%25D1%258F_%25D0%25B7%25D0%25B0%25D0%25BF%25D0%25B8%25D1%2581%25D1%258C&usg=AFQjCNElMorWLxaiXso99eXWL-b47vQS6g

[3] WD Purple: https://www.wdc.com/ru-ru/products/internal-storage/wd-purple.html

[4] BIOS: https://www.google.com.ua/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwjLoeHQ6PzVAhWTZpoKHWf4DeEQFggsMAI&url=https%3A%2F%2Fru.wikipedia.org%2Fwiki%2FBIOS&usg=AFQjCNE9wkCz01M0FBiN6MmtcUdHGiPySw

[5] GPT: https://www.google.com.ua/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cad=rja&uact=8&ved=0ahUKEwjf-MDw6PzVAhWjQZoKHXM4DI4QFggsMAI&url=https%3A%2F%2Fru.wikipedia.org%2Fwiki%2F%25D0%25A2%25D0%25B0%25D0%25B1%25D0%25BB%25D0%25B8%25D1%2586%25D0%25B0_%25D1%2580%25D0%25B0%25D0%25B7%25D0%25B4%25D0%25B5%25D0%25BB%25D0%25BE%25D0%25B2_GUID&usg=AFQjCNGK9mxi19reeoJGOTzWWs0ivoseCw

[6] www.rodsbooks.com: http://www.rodsbooks.com

[7] Гугль: http://Google.com

[8] Gparted : http://gparted.org/livecd.php

[9] DUET: https://gitlab.com/tianocore_uefi_duet_builds/tianocore_uefi_duet_installer

[10] gitlab.com/tianocore_uefi_duet_builds/tianocore_uefi_duet_installer/repository/master/archive.tar.gz: https://gitlab.com/tianocore_uefi_duet_builds/tianocore_uefi_duet_installer/repository/master/archive.tar.gz

[11] SYSLINUX: http://www.syslinux.org/wiki/index.php?title=The_Syslinux_Project

[12] www.kernel.org/pub/linux/utils/boot/syslinux/5.xx/syslinux-5.10.tar.gz: https://www.kernel.org/pub/linux/utils/boot/syslinux/5.xx/syslinux-5.10.tar.gz

[13] by Rod Smith: http://www.rodsbooks.com/bios2uefi/

[14] Источник: https://habrahabr.ru/post/336686/