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

в 8:59, , рубрики: boot, gpt, системное администрирование, хранение данных

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

Мотивация

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

Изучение данного вопроса привело на сайт www.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 выставить загрузку с жесткого диска.
В результате должна получится приветственная надпись как изображено ниже:
Загрузка с 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

Автор: cyber-punk

Источник

Поделиться

* - обязательные к заполнению поля