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

    В статье описано как заставить загружаться компьютер с 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
    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 13

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

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

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

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

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

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

              0
              Не успел дописать в предыдущем ответе на комментарий schetilin. Продолжу мысль:
              Думаю вопрос не в том, как с GPT загрузить XP, вопрос в том, как из под UEFI установить XP на GPT разметку?!
              Хотя, думаю, и это можно попробовать обойти путем не установки в чистом виде, а разворачивании из образа, как предложил maisvendoo в своей статье.
              Спасибо schetilin за интересную мысль. Постараюсь попробовать, потом или статью напишу по этому поводу или напишу комментарий к данной статье с результатами.
                +2
                Чертовски интересно. Плюс однозначно.
                Но. В такого типа статье хочется увидеть ответ на вопрос «как это работает?», а не просто голое решение без объяснения. Собственно гуглить то мы умеем, но иногда гугление растягивается на годы, как в случае с упомянутой здесь моей статьей. Публикация решения, имхо, должна нести и просветительскую функцию. Автор же мало уделил внимания голой теории.

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

                  0
                  Всю магию осуществляет SYSLINUX и DUET, больше ничего.
                  Первоначально BIOS находит на диске SYSLINUX (прописанный в момент установки DUET на диск), который в свою очередь загружает эмулятор EFI — DUET. Дальнейшая загрузка после DUET осуществляется стандартным загрузчиком OS (файл bootx64.efi).
                  Никакого grub в данной связке нет. Вся механика описана в данном комментарии.
                  0
                  Статья устарела но не утратила актуальности.
                  Автор, обнови пожалуйста:
                  Таблицы разделов и каркас разделов можно создать с помощью мощи GParted, а вот обозначить раздел по правильному(EFI FileSystem например) поможет:
                  cfdisk /dev/sdX

                  Перед работой с DUET необходим о
                  export LC_ALL=en_US.UTF-8
                  

                  Так как автор не позаботился о алкализациях и использует «grep» для выискивания значений.
                  Для arch-е подобных систем syslinux можно указать установленный из респозиториев например:
                  /usr/lib/syslinux/bios/

                  там всё будет лежать.
                  Спасибо за статью, а то я уже отчаялся по поводу совместимостей Legcy и UEFI!

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое