Мотивация
На рабочем видеосервере вышел из строя жесткий диск, размеченный в 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)
schetilin
01.09.2017 17:01А обратная задача имеет решение? WindowsXP на GPT диск под UEFI (режим эмуляции BIOS не предлагать). Год назад гуглил — ничего не нашел. Может кто подскажет решение (если есть)?
boris768
01.09.2017 18:42Если кто-то напишет ntloader для uefi. В reastos это делают, но оно не готово для использования. Тем не менее freeloader все же может запустить w2k3 в биос режиме
cyber-punk Автор
01.09.2017 21:15К стати, пришла тут мысль. Почему бы не грузить XP не из родного загрузчика ntloader, который в стандартном режиме при разметке MBR должен находится на активном разделе, а из, к примеру, GRUB2?
Как мне видится, для этого нужно установить grub-efi и в через него уже настраивать загрузку XP. Или использовать efibootmgr, но с ним я пока еще не знаком.Kobalt_x
02.09.2017 14:24а grub2 winXP типо не через ntldr грузит, ни разу не видел способов загрузки винды без передачи управления другому загрузчику
cyber-punk Автор
02.09.2017 16:48Да grub2 WinXP грузит через ntldr, но при этом, совсем не обязательно чтобы раздел, на котором располагается ntldr был активным, соответственно, его можно разместить на GPT разделе, но это все в теории. Чтобы однозначно ответить, надо проверять на практике.
cyber-punk Автор
01.09.2017 21:26Не успел дописать в предыдущем ответе на комментарий schetilin. Продолжу мысль:
Думаю вопрос не в том, как с GPT загрузить XP, вопрос в том, как из под UEFI установить XP на GPT разметку?!
Хотя, думаю, и это можно попробовать обойти путем не установки в чистом виде, а разворачивании из образа, как предложил maisvendoo в своей статье.
Спасибо schetilin за интересную мысль. Постараюсь попробовать, потом или статью напишу по этому поводу или напишу комментарий к данной статье с результатами.
maisvendoo
02.09.2017 19:10+2Чертовски интересно. Плюс однозначно.
Но. В такого типа статье хочется увидеть ответ на вопрос «как это работает?», а не просто голое решение без объяснения. Собственно гуглить то мы умеем, но иногда гугление растягивается на годы, как в случае с упомянутой здесь моей статьей. Публикация решения, имхо, должна нести и просветительскую функцию. Автор же мало уделил внимания голой теории.
Как я понял, биос запускает grub, а тот в свою очередь путем хитрой манипуляции запускает EFI, которая уже делает свою работу (ищет efi-раздел, ищет там загрузчик и т.п.). Интересна, без сомнения, механика всего этого процесса
cyber-punk Автор
05.09.2017 12:54Всю магию осуществляет SYSLINUX и DUET, больше ничего.
Первоначально BIOS находит на диске SYSLINUX (прописанный в момент установки DUET на диск), который в свою очередь загружает эмулятор EFI — DUET. Дальнейшая загрузка после DUET осуществляется стандартным загрузчиком OS (файл bootx64.efi).
Никакого grub в данной связке нет. Вся механика описана в данном комментарии.
Chugumoto
а вот интересно… во время установки Windows не перепишет ли загрузчик на себя?
cyber-punk Автор
Нет, не перепишется. Проверено!!!
cyber-punk Автор
Точнее сказать, загрузчик Windows не перепишет нулевой сектор, в котором в случае с MBR, прописан начальный загрузчик. Он пропишет свой загрузчик в раздел с эмулятором EFI точно так же, как бы он это сделал при установке в обычном режиме с использованием UEFI (не BIOS), а не в режиме эмуляции EFI.
Хотел написать более развернутый комментарий, но понял, что он будет уж слишком расширеным, поэтому, как и писал в статье, рекомендую с данной проблематикой ознакомится в интернете.
К стати, статья которая натолкнула на мысль и заставила идти дальше: Ручная установка Windows 7/8/8.1/10 в систему с загрузчиком GRUB2. Спасибо ее автору maisvendoo