Памятка по загрузке из UEFI

Содержание

1. BIOS
2. UEFI на смену BIOS
3. Загрузка в UEFI
4. Windows on UEFI/GPT
5. Linux on UEFI/GPT
6. FreeBSD on UEFI/GPT
7. Dual/Triple/Multiboot Windows,Linux,FreeBSD on UEFI

1. BIOS

BIOS - Basic Input Output System, это базовая система Ввода-Вывода, то есть набор программ зашитых в микросхему, использовалась ОС MSDOS, более современные ОС практически не используют BIOS.

За исключением процедуры POST - Инициализация и проверка работоспособности аппаратуры.

Если POST выполнен без ошибок, код BIOS начнёт поиск кода загрузчика ОС. Поиск выполняется на доступных и разрешённых в настройках носителях, код BIOS загрузит код загрузчика ОС в память и передаст ему управление.

https://en.wikipedia.org/wiki/BIOS

Недостатки BIOS

2. UEFI на смену BIOS

Дословно Extensible Firmware Interface (EFI) - "расширяемый интерфейс прошивки"

EFI - интерфейс между операционной системой и микропрограммами, управляющими низкоуровневыми функциями оборудования, основное предназначение - корректно инициализировать оборудование при включении системы и передать управление загрузчику операционной системы.

EFI предназначен для замены BIOS, первый стандарт был разработан Intel, затем переработан и название заменено на UEFI (Universal).

Интерфейс, определённый спецификацией EFI, включает таблицы данных, содержащие информацию о платформе, загрузочные и runtime-сервисы, которые доступны для загрузчика операционной системы (ОС) и самой ОС.

Некоторые существующие расширения BIOS, типа ACPI и SMBIOS, также присутствуют в EFI, поскольку не требуют 16-разрядного runtime-интерфейса.

В дополнение к разнообразным службам и сервисам, EFI имеет оболочку - shell environment, для запуска программ, драйверов, создания исполняемых скриптов, для запуска утилит диагностики и обновления прошивок, работы с CD/DVD. Скрипты имеют расширение .nsh.

Достижения UEFI

3. Загрузка в UEFI

Как происходит загрузка в UEFI:

Примечание: в дальнейшем рассматривается только схема разметки GPT GUID Partition Table.

EFI ищет партицию с идентификатором EF00, эта партиция называется ESP (EFI System Partition) и должна быть оформлена как FS:

однако, такие устройства как floppy, usb могут иметь FAT12 на ESP.

На партиции ESP, EFI по умолчанию ищет файл загручик:
\efi\boot\boot[название архитектуры].efi
например: \efi\boot\bootx64.efi и загружает его.

Далее уже работает сам загрузчик, by default это \efi\boot\bootx64.efi, он ищет корневую FS, на ней bootmanager или ядро, загружает их и передает им дальнейшее управление.

На самом деле, EFI BIOS, находит все ESP партиции, на всех носителях компьютера и на них файлы с расширением efi и если мы захотим загрузиться с какого-то иного носителя, второго диска или флешки, используя клавишу POP-UP меню загрузки BIOS, ну например F8 (у разных производителей могут разные функциональные клавиши), увидим все доступные носители с ESP и загрузчиками.

В отличие от BIOS, для UEFI используются другие ПЗУ, они дешевле, экономичней и имеют NVRAM в которой хранятся указатели на все найденные загрузчки .efi.

Структура ESP партиции выглядит следующим образом:

\efi\
    |
    \Boot\bootx64.efi
         \name1.efi
         ...
         \nameN.efi
    \Microsoft\Boot\
    \Ubuntu\ubuntux64.efi   - на самом деле efi от grub2-efi
    \Debian\debianx64.efi   - на самом деле efi от grub2-efi
    \FreeBSD\freebsdx64.efi - на самом деле bootx64.efi == boot1.efi
    ...

Примечание: Имена директорий Ubuntu, Debian, FreeBSD - всего лишь пример, можете использовать какие Вам угодно.

https://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface

4. Windows on UEFI/GPT

Ничего необычно в установке Windows 7/8/10 на GPT из UEFI нет, ОС Windows ставится на диск с разметкой GPT только из UEFI.

Особенности и условия, ничего особенного:

Ниже показана структура ESP из Windows 7

Описание    PartitionID   Размер  Тип раздела  Форматировать   Буква диска
--------------------------------------------------------------------------
Системный   1             100MB   EFI          FAT32           нет
раздел EFI
(ESP)
Резервный   2             128MB   MSR          нет             нет
раздел
Windows     3             ост-ное Основной     NTFS            C:

Программа установки Windows создает ESP на компьютере при следующих условиях:

Программа установки Windows создает MSR при следующих условиях:

Приоритет создания ESP выше, чем у создания MSR, так как ESP необходим для загрузки компьютера:
https://technet.microsoft.com/ru-ru/library/dd744301(v=ws.10).aspx

Примечание: В Windows 8.x/10 ESP 350MB, а в Windows 10 MSR=0-16MB

Важно: чтобы из командной строки Windows (cmd.exe), можно было смонтировать Системный Раздел ESP, нужно отключить UAC, затем, перезагрузиться, после чего команда:
c:\>mountvol S: /s
отработает без проблем.

Отключение UAC и Windows Defender с командной строки.

выходим в командную строку Windows:

Пуск -> Выполнить -> cmd.exe -> Запустить от Администратора

Отключаем Windows Defender:

C:\>sc config windefend start= disabled
[SC] ChangeServiceConfig: успех

C:\>sc stop windefend
Имя_службы: windefend
        Тип                : 20  WIN32_SHARE_PROCESS
        Состояние          : 4  RUNNING
                                (STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
        Код_выхода_Win32   : 0  (0x0)
        Код_выхода_службы  : 0  (0x0)
        Контрольная_точка  : 0x0
        Ожидание           : 0x0
C:\>

Отключаем UAC:

C:\>reg add HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System
            /v EnableLUA /t REG_DWORD /d 0x0 /f
Операция успешно завершена.

C:\>

Перезагружаем Windows:

C:\> shutdown /r /f /t 0

Теперь, если у нас административный account, можно не заботиться о разрешениях "от Администратора".

Снова выходим в командную строку и выполняем следующие действия для монтирования Системного раздела ESP - EFI System Partition:

c:\>mountvol S: /s
c:\>

Ниже показано содержимое ESP записанное при установке Windows 7:

c:\>dir S:\
 Том в устройстве S не имеет метки.
 Серийный номер тома: 5204-DB74

 Содержимое папки S:\

09.04.2017  21:13    <DIR>          EFI
               0 файлов              0 байт
               1 папок      82 043 904 байт свободно

c:\>
c:\>dir S:\EFI
 Том в устройстве S не имеет метки.
 Серийный номер тома: 5204-DB74

 Содержимое папки S:\EFI

09.04.2017  21:13    <DIR>          .
09.04.2017  21:13    <DIR>          ..
09.04.2017  21:13    <DIR>          Microsoft
09.04.2017  21:20    <DIR>          Boot
               0 файлов              0 байт
               4 папок      82 043 904 байт свободно

c:\>dir S:\EFI\Boot
 Том в устройстве S не имеет метки.
 Серийный номер тома: 5204-DB74

 Содержимое папки S:\EFI\Boot

09.04.2017  21:20    <DIR>          .
09.04.2017  21:20    <DIR>          ..
21.11.2010  06:24           672 640 bootx64.efi
               1 файлов        672 640 байт
               2 папок      82 043 904 байт свободно
c:\>dir S:\EFI\Microsoft
 Том в устройстве S не имеет метки.
 Серийный номер тома: 5204-DB74

 Содержимое папки S:\EFI\Microsoft

09.04.2017  21:13    <DIR>          .
09.04.2017  21:13    <DIR>          ..
09.04.2017  21:13    <DIR>          Boot
               0 файлов              0 байт
               3 папок      82 043 904 байт свободно
c:\>dir S:\EFI\Microsoft\Boot\
 Том в устройстве S не имеет метки.
 Серийный номер тома: 5204-DB74

 Содержимое папки S:\EFI\Microsoft\Boot

09.04.2017  21:13    <DIR>          .
09.04.2017  21:13    <DIR>          ..
10.04.2017  10:19            32 768 BCD
21.11.2010  06:24           672 640 bootmgfw.efi
21.11.2010  06:24           669 568 bootmgr.efi
09.04.2017  21:20    <DIR>          cs-CZ
09.04.2017  21:20    <DIR>          da-DK
09.04.2017  21:20    <DIR>          de-DE
09.04.2017  21:20    <DIR>          el-GR
09.04.2017  21:20    <DIR>          en-US
09.04.2017  21:20    <DIR>          es-ES
09.04.2017  21:20    <DIR>          fi-FI
09.04.2017  21:20    <DIR>          fr-FR
09.04.2017  21:20    <DIR>          hu-HU
09.04.2017  21:20    <DIR>          it-IT
09.04.2017  21:20    <DIR>          ja-JP
09.04.2017  21:20    <DIR>          ko-KR
21.11.2010  06:23           611 200 memtest.efi
09.04.2017  21:20    <DIR>          nb-NO
09.04.2017  21:20    <DIR>          nl-NL
09.04.2017  21:20    <DIR>          pl-PL
09.04.2017  21:20    <DIR>          pt-BR
09.04.2017  21:20    <DIR>          pt-PT
09.04.2017  21:20    <DIR>          ru-RU
09.04.2017  21:20    <DIR>          sv-SE
09.04.2017  21:20    <DIR>          tr-TR
09.04.2017  21:20    <DIR>          zh-CN
09.04.2017  21:20    <DIR>          zh-HK
09.04.2017  21:20    <DIR>          zh-TW
09.04.2017  21:20    <DIR>          Fonts
               4 файлов      1 986 176 байт
              26 папок      82 043 904 байт свободно

c:\>dir S:\EFI\Microsoft\Boot\ /A:S
 Том в устройстве S не имеет метки.
 Серийный номер тома: 5204-DB74

 Содержимое папки S:\EFI\Microsoft\Boot

10.04.2017  10:19            29 696 BCD.LOG
09.04.2017  21:20            65 536 BOOTSTAT.DAT
09.04.2017  21:20                 0 BCD.LOG1
09.04.2017  21:20                 0 BCD.LOG2
               4 файлов         95 232 байт
               0 папок      82 043 904 байт свободно

c:\>dir S:\EFI\Microsoft\Boot\ /A:A
 Том в устройстве S не имеет метки.
 Серийный номер тома: 5204-DB74

 Содержимое папки S:\EFI\Microsoft\Boot

10.04.2017  10:19            32 768 BCD
10.04.2017  10:19            29 696 BCD.LOG
21.11.2010  06:24           672 640 bootmgfw.efi
21.11.2010  06:24           669 568 bootmgr.efi
21.11.2010  06:23           611 200 memtest.efi
09.04.2017  21:20            65 536 BOOTSTAT.DAT
09.04.2017  21:20                 0 BCD.LOG1
09.04.2017  21:20                 0 BCD.LOG2
               8 файлов      2 081 408 байт
               0 папок      82 043 904 байт свободно

c:\>

Примечание: В некоторых случаях, команда mountvol не может смонтировать ESP и выдает сообщение о неверном параметре, это возможно при наличии нескольких HDD в системе или по иной причине.

В случае возникновения описанной выше проблемы, вместо одной команды придется выполнить несколько.

Выходим в командную строку и выполняем следующие действия для монтирования Системного раздела ESP - EFI System Partition:

C:\Users\lavr>diskpart

Microsoft DiskPart версии 6.1.7601
(С) Корпорация Майкрософт, 1999-2008.
На компьютере: LAVRPC

DISKPART> list disk

  Диск ###  Состояние      Размер   Свободно Дин  GPT
  --------  -------------  -------  -------  ---  ---
  Диск 0    В сети           30 Gбайт      0 байт        *
  Диск 1    В сети           20 Gбайт    20 Gбайт

DISKPART>

чтобы понять что на каком диске находится:

DISKPART> sel disk 0

Выбран диск 0.

DISKPART> list part

  Раздел    ###  Тип               Размер   Смещение
  -------------  ----------------  -------  -------
  Раздел 1    Системный          100 Mб  1024 Kб
  Раздел 2    Зарезервирован     128 Mб   101 Mб
  Раздел 3    Основной            29 Gб   229 Mб

DISKPART>

смотрим содержимое диска 1 (он пуст)

DISKPART> sel disk 1

Выбран диск 1.

DISKPART> list part

Разделы на диске отсутствуют.

DISKPART>

Из верхнего видно, нам нужен Системный раздел: Раздел 1 Системный 100 Mб 1024 Kб

DISKPART> sel disk 0

Выбран диск 0.

DISKPART> sel part 1

Выбран раздел 1.

DISKPART> assign letter=S

DiskPart: назначение имени диска или точки подключения выполнено успешно.

DISKPART> exit

Проверяем:

C:\Users\lavr>dir /d s:\
 Том в устройстве S не имеет метки.
 Серийный номер тома: C295-49B9

 Содержимое папки s:\

[EFI]
               0 файлов              0 байт
               1 папок      82 039 808 байт свободно

C:\Users\lavr>

Все, можем работать с Системным разделом EFI, он смонтирован как диск S:

Загрузчик Windows и BootManager.

Как было сказано ранее, в UEFI NVRAM содержатся настройки, переменные EFI, прописанные и обнаруженные загрузчики с расширением .efi, порядок загрузки и тд и тп.

Для настройки BootLoader и BootManager, Microsoft использует целую ветку в реестре, а работа с ней и управление, осуществляется командой bcdedit.

Посмотреть текущие настройки можно следующим образом:

вариант с лицензионной системы:

C:\Users\lavr>bcdedit /v

Диспетчер загрузки Windows
--------------------
идентификатор           {9dea862c-5cdd-4e70-acc1-f32b344d4795}
device                  partition=\Device\HarddiskVolume1
path                    \EFI\Microsoft\Boot\bootmgfw.efi
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
description             Windows Boot Manager
locale                  ru-RU
inherit                 {7ea2e1ac-2e61-4728-aaa3-896d9d0a9f0e}
default                 {63166763-1615-11e7-8e80-85ed085cd5a2}
resumeobject            {63166762-1615-11e7-8e80-85ed085cd5a2}
displayorder            {63166763-1615-11e7-8e80-85ed085cd5a2}
toolsdisplayorder       {b2721d73-1db4-4c62-bf78-c548a880142d}
timeout                 30

Загрузка Windows
-------------------
идентификатор           {63166763-1615-11e7-8e80-85ed085cd5a2}
device                  partition=C:
path                    \Windows\system32\winload.efi
description             Windows 7
locale                  ru-RU
inherit                 {6efb52bf-1766-41db-a6b3-0ee5eff72bd7}
recoverysequence        {63166764-1615-11e7-8e80-85ed085cd5a2}
recoveryenabled         Yes
osdevice                partition=C:
systemroot              \Windows
resumeobject            {63166762-1615-11e7-8e80-85ed085cd5a2}
nx                      OptIn

C:\Users\lavr>

строка:
path \EFI\Microsoft\Boot\bootmgfw.efi
говорит об использовании оригинального EFI загрузчика от Microsoft.

Ниже показано что default'ный:


это одна и та же EFI программа, см размер.

В случае хакерской активации через Slic, возможен такой загрузчик:
path \EFI\Microsoft\Boot\windslic.efi

Если установлен загрузчик rEFInd, path должен быть: path \EFI\REFIND\REFIND_X64.EFI

Изменить загрузчик из Windows, можно командой bcdedit:

C:\> bcdedit /set {bootmgr} path \EFI\DirName\filename.efi
например:
C:\> bcdedit /set {bootmgr} path \EFI\FreeBSD\bootx64.efi
C:\> bcdedit /set {bootmgr} path \EFI\refind\refind_x64.efi
C:\> bcdedit /set {bootmgr} path \EFI\debian\grubx64.efi

5. Linux on UEFI/GPT

Перед установкой Linux из UEFI, советую настроить BIOS следующим образом;

Дистрибутивы Debian/CentOS/Ubuntu - при начальной установке не требуют
вмешательства, установщик правильно разбирается с разметкой:

Примечание: В EFI/BIOS предлагается выбрать загрузку UEFI Only потому что с ней не будет проблем.

Это связано с реализацией UEFI/BIOS различными производителями.

Загрузка: UEFY, Legacy - должна отрабатывать в последовательности:

Загрузка на некоторых материнских картах в случае выбора двух режимов; UEFI и затем Legacy может не найти реально существующий EFI-загрузчик на HDD.

Поэтому, лучше установить UEFY Only и установить ОС, а потом можно экспериментировать с настройками BIOS.

Кроме того, есть материнские карты отдельных производителей, у которых загрузчик ищется только в \EFI\Microsoft\Boot\.

Допустим мы ставили Linux на чистый диск из UEFI, посмотрим конфигурацию системы и загрузки GRUB2 + EFI:

root@host:~# uname -a
Linux host 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1+deb8u2 (2017-03-07) x86_64 GNU/Linux
root@host:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk
├─sda1   8:1    0  512M  0 part /boot/efi
├─sda2   8:2    0   19G  0 part /
└─sda3   8:3    0  510M  0 part [SWAP]
sr0     11:0    1 1024M  0 rom
root@host:~#
/dev/sda1 это /boot/efi ESP partition

Посмоотрим разметку диска (GPT):

root@host:~# fdisk -lu /dev/sda

Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 503BF83F-D522-46A2-A1A5-DC23B5CB597A

Device        Start      End  Sectors  Size Type
/dev/sda1      2048  1050623  1048576  512M EFI System
/dev/sda2   1050624 40896511 39845888   19G Linux filesystem
/dev/sda3  40896512 41940991  1044480  510M Linux swap

root@host:~#

рекомендую сохранять значение UUID для ESP (может пригодится для grub)

root@host:~# blkid /dev/sda1
/dev/sda1: UUID="6B75-C505" TYPE="vfat" PARTUUID="dfb01231-7608-4325-99e7-5cfc1379d23c"
root@host:~#

модуль efivars подгружается автоматически при установке из UEFI

root@host:~# lsmod | grep efi
efi_pstore             12805  1
efivars                17257  1 efi_pstore
root@host:~#

благодаря ему, реализован очень полезный функционал, но будьте осторожны с содержимым, которое монтируется в /sys/firmware/efi!

Очень Важно: UEFI NVRAM доступна на запись от root'а, удаление данных в NVRAM, может стать катастрофой для компьютера!
root@host:~# ls -la /sys/firmware/efi/
total 0
drwxr-xr-x  5 root root    0 Apr 13 14:41 .
drwxr-xr-x  6 root root    0 Apr 13 14:04 ..
-r--r--r--  1 root root 4096 Apr 13 14:41 config_table
dr-xr-xr-x  2 root root    0 Apr 13 14:41 efivars
-r--r--r--  1 root root 4096 Apr 13 14:41 fw_platform_size
-r--r--r--  1 root root 4096 Apr 13 14:41 fw_vendor
-r--r--r--  1 root root 4096 Apr 13 14:41 runtime
drwxr-xr-x  5 root root    0 Apr 13 14:41 runtime-map
-r--------  1 root root 4096 Apr 13 14:41 systab
drwxr-xr-x 23 root root    0 Apr 13 14:04 vars
root@host:~#

посмотрим переменные

root@host:~# ls -la /sys/firmware/efi/vars/
total 0
drwxr-xr-x 23 root root 0 Apr 13 14:41 .
drwxr-xr-x  5 root root 0 Apr 13 14:41 ..
drwxr-xr-x  2 root root 0 Apr 13 14:04 Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 BootOptionSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 ConIn-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 ConInDev-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 ConOut-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 ConOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 ConsoleOutMode-793d9786-44dc-4709-b57f-85b8e8fdbfd2
--w-------  1 root root 0 Apr 13 14:42 del_var
drwxr-xr-x  2 root root 0 Apr 13 14:04 HDDP-fab7e9e1-39dd-4f2b-8408-e20e906cb6de
drwxr-xr-x  2 root root 0 Apr 13 14:04 Lang-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 LangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 MemoryTypeInformation-4c19049f-4137-4dd3-9c10-8b97a83ffdfa
drwxr-xr-x  2 root root 0 Apr 13 14:04 MTC-eb704011-1402-11d3-8e77-00a0c969723b
--w-------  1 root root 0 Apr 13 14:42 new_var
drwxr-xr-x  2 root root 0 Apr 13 14:04 PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c
drwxr-xr-x  2 root root 0 Apr 13 14:04 RTC-378d7b65-8da9-4773-b6e4-a47826a833e1
root@host:~#

Еще один важный и полезный инструмент, утилита efibootmgr позволяет решать проблемы загрузки.

посмотрим текущее состояние:

root@host:~# efibootmgr -v
BootCurrent: 0004
BootOrder: 0004,0000,0001,0002,0003
Boot0000* EFI VMware Virtual SATA Hard Drive (0.0)      ACPI(a0341d0,0)PCI(11,0)PCI(4,0)SATA(0,0,0)
Boot0001* EFI VMware Virtual IDE CDROM Drive (IDE 1:0)  ACPI(a0341d0,0)PCI(7,1)ATAPI(1,0,0)
Boot0002* EFI Network   ACPI(a0341d0,0)PCI(11,0)PCI(1,0)MAC(MAC(000c29bb0ce1,0)
Boot0003* EFI Internal Shell (Unsupported option)       MM(b,e1a3000,e42ffff)FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)
Boot0004* debian        HD(1,800,100000,dfb01231-7608-4325-99e7-5cfc1379d23c)File(\EFI\debian\grubx64.efi)

текущий загрузчик EFI: BootCurrent: 0004
порядок загрузки EFI: BootOrder: 0004,0000,0001,0002,0003
и смотрим кто у нас 4 или 0004: Boot0004* debian HD(1,800,100000,dfb01231-7608-4325-99e7-5cfc1379d23c)File(\EFI\debian\grubx64.efi)

Все верхние примеры были на базе ОС Debian.

Работа c ESP в Linux

Важно: ESP должна быть смонтирована!

В нижнем примере это выглядит следующим образом:

root@host:~# mount -text4,vfat
/dev/sda2 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=utf8,shortname=mixed,errors=remount-ro)
root@host:~#

содержимое ESP при единственной установленой ОС Debian

root@host:~# ls -la /boot/efi/
total 12
drwx------ 3 root root 4096 Jan  1  1970 .
drwxr-xr-x 4 root root 4096 Apr 13 13:56 ..
drwx------ 3 root root 4096 Apr 13 13:55 EFI
root@host:~# ls -la /boot/efi/EFI/
total 12
drwx------ 3 root root 4096 Apr 13 13:55 .
drwx------ 3 root root 4096 Jan  1  1970 ..
drwx------ 2 root root 4096 Apr 13 13:55 debian
root@host:~# ls -la /boot/efi/EFI/debian/
total 128
drwx------ 2 root root   4096 Apr 13 13:55 .
drwx------ 3 root root   4096 Apr 13 13:55 ..
-rwx------ 1 root root 119808 Apr 13 13:55 grubx64.efi
root@host:~#

В Ubuntu отличаться будет лишь названием: /boot/efi/EFI/ubuntu/

Создание GPT разметки в Linux:

Примеры разметки:

Примечание: Комментария и объяснения верхних команд не будет, как ими пользоваться можно прочитать в man

6. FreeBSD on UEFI/GPT

Установка FreeBSD из UEFI на чистый диск проходит без проблем, но если диск уже размечен как GPT и на нем есть ESP партиция, то встраиваться туда FreeBSD не умеет.

Ниже пример чистой установки FreeBSD из UEFI(пусть не смущает что это VM):

Загрузка FreeBSD из UEFI коротко, четко и ясно описана в uefi(8)

# man uefi

UEFI firmware ищет загрузчик OS на EFI System Partition (ESP), если не установлен, по умолчанию грузит /efi/Boot/bootx64.efi. Это уже было описано.

По умолчанию FreeBSD устанавливает свой EFI загрузчик: boot1.efi как /efi/Boot/bootx64.efi

Все.

Создание USB/HDD UEFI Bootable в FreeBSD:

FreeBSD UEFI
# gpart create -s gpt da0
# gpart add -t efi -s 800K da0
# gpart add -t freebsd-ufs da0
# dd if=/boot/boot1.efifat of=/dev/da0p1
# newfs -U -L FreeBSD /dev/da0p2

Просто. Далее можем развернуть систему руками, как обычно из /usr/freebsd-dist при загрузке с CD/DVD или Memstick.

Что из себя представляет /boot/boot1.efifat:

# mdconfig -a -t vnode -f /boot/boot1.efifat
# mount_msdosfs /dev/md0 /mnt
# ls -la /mnt/efi/boot/
total 130
drwxr-xr-x  1 root  wheel     512 Apr 12  2016 .
drwxr-xr-x  1 root  wheel     512 Apr 12  2016 ..
-rwxr-xr-x  1 root  wheel  131072 Apr 12  2016 bootx64.efi
-rwxr-xr-x  1 root  wheel      12 Apr 12  2016 startup.nsh
# cat /mnt/efi/boot/startup.nsh
BOOTx64.efi
#

Немного смущает что разный размер:

# ls -la /boot/boot1.efi
-r-xr-xr-x  1 root  wheel  77824 Mar 12 19:30 /boot/boot1.efi
# ls -la /mnt/efi/boot/bootx64.efi
-rwxr-xr-x  1 root  wheel  131072 Apr 12  2016 /mnt/efi/boot/bootx64.efi
#

Но ничего страшного, при ручной разметке я использовал /boot/boot1.efi и без автоскрипта для efi-shell startup.nsh

Как во FreeBSD создать свой /boot/boot1.efifat, например, размером 512K:

# cd /tmp
# dd if=/dev/zero of=efiboot.img bs=1k count=512
# ls -la efiboot.img
# mdconfig -a -t vnode -f efiboot.img
# newfs_msdos -F 12 -m 0xf8 /dev/md0
# mkdir efi
# ls -la efi
# mkdir efi
# mount -t msdosfs /dev/md0 /tmp/efi
# mkdir -p efi/efi/boot
# cp /boot/loader.efi efi/efi/boot/bootx64.efi
# umount /tmp/efi
#  ls -la efiboot.img
-rw-r--r--  1 root  wheel  524288 Feb 27 14:58 efiboot.img
#

Верхнее, только в случае отсутствия других ОС на диске, для DUAL/TRIPLE Boot, ESP должна быть достаточного размера, в случае Windows не менее 100MB

Это легко посчитать установив один раз Windows+Linux+FreeBSD.

Как во FreeBSD создать EFI раздел:

# gpart create -s GPT ada0
# gpart add -t efi -s 100M ada0
создать FAT32:
# newfs_msdos -F 32 /dev/ada0p1
# mount_msdosfs /dev/ada0p1 /mnt
# mkdir -p /mnt/EFI/Boot
# cp /boot/boot1.efi /mnt/EFI/Boot/bootx64.efi

7. Dual/Triple/Multiboot Windows,Linux,FreeBSD on UEFI

Выше была рассмотрена чистая установка трех Операционных систем, на основании которой, можно сделать несколько важных выводов:

На основании данных выводов, можно легко установить указанные ОС вместе на один компьютер:


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

При установке двух систем на один диск, удобней следующий порядок:

А в случае установки трех систем на один диск, удобней следующий порядок:

  1. Windows
  2. FreeBSD
  3. Linux

Следует отметить, верхние рекомендации, являются условными, потому что опираются на личное, субъективное мнение.

Кроме того, при установке OS FreeBSD, необходимо:


необходимые дополнительные настройки после установки FreeBSD разберем позже.

DualBoot Linux и Windows

Как уже было сказано, при установке первой системой Windows, а затем Linux, проблем не будет.

Не потребуется никаких дополнительных настроек, при установке Linux, будет установлен BootManager Grub2-EFI, grub2 найдет вторую систему и добавит в меню

Меню GRUB2 в Debian будет выглядеть примерно:

*Debian GNU/Linux
 Advanced options for Debian GNU/Linux
 Windows Boot Manager (on /dev/sda1) 

в Ubuntu
*Ubuntu GNU/Linux
 Advanced options for Ubuntu GNU/Linux
 Windows Boot Manager (on /dev/sda1)

Разберем что делать, если Windows была установлена позже и как создать меню загрузки в GRUB2.

Нам необходимо создать меню Windows для GRUB2, для этого необходимо загрузить Linux. Это можно сделать двумя способами:

  1. из Windows с помощью bcdedit
    C:\> bcdedit /set {bootmgr} path \EFI\debian\grubx64.efi
    

    или
    C:\> bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi
    
  2. используя POP-UP меню BIOS выбрать загрузку Linux

После того как загрузились в Linux, необходимо:

  1. изменить порядок загрузки через efibootmgr
    имеем by default: BootOrder: 0005, где Boot0005* Windows Boot Manager
    root@host:~# efibootmgr -v
    BootCurrent: 0005
    Timeout: 2 seconds
    BootOrder: 0005,0004,0000,0001,0002,0003
    Boot0000* EFI VMware Virtual SCSI Hard Drive (0.0)
    Boot0001* EFI VMware Virtual SATA CDROM Drive (1.0)
    Boot0002* EFI Network
    Boot0003* EFI Internal Shell (Unsupported option)
    Boot0004* debian
    Boot0005* Windows Boot Manager
    
    меняем на debian
    root@host:~# efibootmgr -o 4,5,0,1,2,3
    BootCurrent: 0005
    Timeout: 2 seconds
    BootOrder: 0004,0005,0000,0001,0002,0003
    Boot0000* EFI VMware Virtual SCSI Hard Drive (0.0)
    Boot0001* EFI VMware Virtual SATA CDROM Drive (1.0)
    Boot0002* EFI Network
    Boot0003* EFI Internal Shell (Unsupported option)
    Boot0004* debian
    Boot0005* Windows Boot Manager
    root@host:~#
    
  2. создать меню загрузки Windows для GRUB2
    два варианта:
    1. достаточно выполнить утилиту os-prober (ее используют grub-probe и grub-mkconfig)
      # os-prober
      
    2. или создать руками /etc/grub.d/40_custom
      # cat /etc/grub.d/40_custom
      #!/bin/sh
      exec tail -n +3 $0
      # This file provides an easy way to add custom menu entries.  Simply type the
      # menu entries you want to add after this comment.  Be careful not to change
      # the 'exec tail' line above.
      menuentry "Windows 7/UEFI" {
          insmod part_gpt
          insmod fat
          set root='hd0,gpt1'
          chainloader /EFI/Microsoft/Boot/bootmgfw.efi
      }
      # grub-update
      
Все.

UEFI DualBoot Windows и FreeBSD

Недостатки FreeBSD в случае MultiBoot:

Существующие решения UEFI Multiboot для FreeBSD:

  1. порт sysutils/grub2-efi
  2. сторонний загрузчик rEFInd

Установщик FreeBSD не умеет интегрировать свой загрузчик в уже существующую ESP и система не имеет утилиты манипуляции переменными EFI.

Наименее затратный вариант, если FreeBSD будет установлена первой. При установке нужно проследить чтобы партиция ESP была размером не менее 100MB. В ином случае, разметить вручную Manual

Если OS FreeBSD будет устанавливаться не первой системой:

Рассмотрим вариант установки FreeBSD позже остальных ОС с установкой и настройкой sysutils/grub2-efi.

При установке выбираем Manual разметку диска, создаем как минимум freebsd-ufs для корня и freebsd-swap для swap, или устанавливаем zfs на пустую партицию.

Рассмотрим на примере, была установлена OS Windows 7, затем мы установили OS FreeBSD 11.0-Release и после установки вышли в режим Live CD/USB:
- смотрим разметку диска

root@host:~ # gpart show

=>      34  83886013  da0  GPT  (40G)
        34      2014       - free -  (1.0M)
      2048    204800    1  efi  (100M)
    206848    262144    2  ms-reserved  (128M)
    468992  60971008    3  ms-basic-data  (29G)
  61440000  18464768    5  freebsd-ufs  (9.0G)
  80314368   3571678    4  freebsd-swap  (1.7G)
  83886046         1       - free -  (512B)

root@host:~ #

- задаем под себя переменную PATH и устанавливаем пакетный менеджер pkg:
# export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
# pkg
# pkg update
# pkg info

- устанваливаем пакет grub2-efi
# pkg install -y grub2-efi

- необходимо смонтировать ESP партицию
# mkdir /boot/efi
# mount_msdosfs /dev/da0p1 /boot/efi

- выполняем grub-install - обязательно с ключами или by default будет искать парцтию boot_bios для Non-UEFI загрузки:
# grub-install --efi-directory=/boot/efi --removable --target=x86_64-efi /dev/da0

- GRUB2 прописал свой загрузчик в:
root@host:~ # ls -la /boot/efi/EFI/Boot/
total 128
drwxr-xr-x  1 root  wheel    1024 Apr 14 17:53 .
drwxr-xr-x  1 root  wheel    1024 Apr 14 17:44 ..
-rwxr-xr-x  1 root  wheel  128512 Apr 14 16:18 bootx64.efi
root@host:~ #

- создание меню загрузки Windows для grub2-efi
  1. выполняем grub-mkconfig для создания конфигурации /boot/grub/grub.cfg
    # grub-mkconfig /boot/grub/grub.cfg
    
  2. удаляем секцию 10_kfreebsd из /boot/grub/grub.cfg - она создается НЕВЕРНО может мешать:
    ### BEGIN /usr/local/etc/grub.d/10_kfreebsd ###
    menuentry 'XXXXXXXXXXXXXXX' {
            insmod part_gpt
            insmod ufs2
            set root=(hd0,gpt5)
            chainloader /boot/boot1.efi
    }
    ### END /usr/local/etc/grub.d/10_kfreebsd ###
    
  3. создаем свою секцию 40_custom.dist меню загрузки Windows
    ### BEGIN /usr/local/etc/grub.d/40_custom.dist ###
    menuentry 'Windows 7/UEFI' {
            insmod part_gpt
            insmod fat
            set root=(hd0,gpt1)
            chainloader /EFI/Microsoft/Boot/bootmgfw.efi
    }
    ### END /usr/local/etc/grub.d/40_custom.dist ###
    

    где root=(hd0,gpt1) это ESP партиция с efi-загрузчиком Windows

- выполняем reboot и завершаем установку FreeBSD
- загружаемся в Windows и используя bcdedit. меняем загрузчик на grub2-efi от FreeBSD:
C:\> bcdedit /set {bootmgr} path \EFI\Boot\bootx64.efi

Все

При использовании rEFInd, не требуется установка grub2-efi, но перед завершением установки FreeBSD необходимо выйти в Live CD/USB, смонтировать партицию ESP и скопировать туда загрузчик FreeBSD:

Установка и настройка rEFInd.

rEFInd имеет достаточное количество настроек и может быть использован как с текстовым меню или графическим с иконками и тд и тп. Используйте документацию и пример refind.conf-sample

Теперь не составит труда настроить загрузку UEFI OS FreeBSD,Linux,Windows: Dual, Triple или MultiBoot.



Copyleft lavr@unix1.jinr.ru Андрей Лаврентьев