BIOS - Basic Input Output System, это базовая система Ввода-Вывода, то есть набор программ зашитых в микросхему, использовалась ОС MSDOS, более современные ОС практически не используют BIOS.
За исключением процедуры POST - Инициализация и проверка работоспособности аппаратуры.
Если POST выполнен без ошибок, код BIOS начнёт поиск кода загрузчика ОС. Поиск выполняется на доступных и разрешённых в настройках носителях, код BIOS загрузит код загрузчика ОС в память и передаст ему управление.
https://en.wikipedia.org/wiki/BIOSНедостатки 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
Как происходит загрузка в UEFI:
Примечание: в дальнейшем рассматривается только схема разметки GPT GUID Partition Table.
EFI ищет партицию с идентификатором EF00, эта партиция называется ESP (EFI System Partition) и должна быть оформлена как FS:
На партиции 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 - всего лишь пример, можете использовать какие Вам угодно.
Ничего необычно в установке 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отработает без проблем.
выходим в командную строку 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:
Как было сказано ранее, в 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'ный:
В случае хакерской активации через 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
Перед установкой 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.
Важно: 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:
Примеры разметки:
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x9ff31f11.
Command (m for help): g
Created a new GPT disklabel (GUID: 7560BF09-00E8-4DB8-B75C-2564C6326039).
Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-41943006, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943006, default 41943006): +100M
Created a new partition 1 of type 'Linux filesystem' and of size 100 MiB.
Command (m for help): t
Selected partition 1
Partition type (type L to list all types): 1
Changed type of partition 'Linux filesystem' to 'EFI System'.
Command (m for help): n
Partition number (2-128, default 2):
First sector (206848-41943006, default 206848):
Last sector, +sectors or +size{K,M,G,T,P} (206848-41943006, default 41943006): +17G
Created a new partition 2 of type 'Linux filesystem' and of size 17 GiB.
Command (m for help): n
Partition number (3-128, default 3):
First sector (35858432-41943006, default 35858432):
Last sector, +sectors or +size{K,M,G,T,P} (35858432-41943006, default 41943006):
Created a new partition 3 of type 'Linux filesystem' and of size 2.9 GiB.
Command (m for help): t
Partition number (1-3, default 3): 3
Partition type (type L to list all types): 14
Changed type of partition 'Linux filesystem' to 'Linux swap'.
Command (m for help): p
Disk /dev/sdb: 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: 7560BF09-00E8-4DB8-B75C-2564C6326039
Device Start End Sectors Size Type
/dev/sdb1 2048 206847 204800 100M EFI System
/dev/sdb2 206848 35858431 35651584 17G Linux filesystem
/dev/sdb3 35858432 41943006 6084575 2.9G Linux swap
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
# fdisk -l /dev/sdb
Disk /dev/sdb: 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: 7560BF09-00E8-4DB8-B75C-2564C6326039
Device Start End Sectors Size Type
/dev/sdb1 2048 206847 204800 100M EFI System
/dev/sdb2 206848 35858431 35651584 17G Linux filesystem
/dev/sdb3 35858432 41943006 6084575 2.9G Linux swap
# parted -a optimal -s /dev/sdb mklabel gpt mkpart ESP fat32 1MiB 101MiB mkpart primary linux-swap 101MiB 2101MiB mkpart primary ext4 2101MiB 100% root@deb:~# parted /dev/sdb -s unit MiB print Model: VMware, VMware Virtual S (scsi) Disk /dev/sdb: 20480MiB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1.00MiB 101MiB 100MiB fat32 ESP msftdata 2 101MiB 2101MiB 2000MiB primary 3 2101MiB 20479MiB 18378MiB primary #
# sgdisk --zap-all /dev/sdbили
# sgdisk -z /dev/sdb
# sgdisk -og /dev/sdb # sgdisk -n 1::+100M -t1:ef00 /dev/sdb The operation has completed successfully. # sgdisk -n 2::+2G -t2:8200 /dev/sdb The operation has completed successfully. # sgdisk -n 3:0:0 -t2:8300 /dev/sdb The operation has completed successfully. # sgdisk -p /dev/sdb Disk /dev/sdb: 41943040 sectors, 20.0 GiB Logical sector size: 512 bytes Disk identifier (GUID): EFD15CD3-1CBD-4219-9622-3F61199D392C Partition table holds up to 128 entries First usable sector is 34, last usable sector is 41943006 Partitions will be aligned on 2048-sector boundaries Total free space is 2014 sectors (1007.0 KiB) Number Start (sector) End (sector) Size Code Name 1 2048 206847 100.0 MiB EF00 2 206848 4401151 2.0 GiB 8300 3 4401152 41943006 17.9 GiB 8300 #
Примечание: Комментария и объяснения верхних команд не будет, как ими пользоваться можно прочитать в man
Установка FreeBSD из UEFI на чистый диск проходит без проблем, но если диск уже размечен как GPT и на нем есть ESP партиция, то встраиваться туда FreeBSD не умеет.
Ниже пример чистой установки FreeBSD из UEFI(пусть не смущает что это VM):
root@host:~ # uname -a FreeBSD host.dubna.ru 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0 r306420: Thu Sep 29 01:43:23 UTC 2016 root@releng2.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64 root@host:~ #
root@host:~ # camcontrol devlistat scbus1 target 0 lun 0 (cd0,pass0) at scbus3 target 0 lun 0 (ada0,pass1) root@host:~ #
root@host:~ # gpart show ada0
=> 40 20971440 ada0 GPT (10G)
40 409600 1 efi (200M)
409640 19511296 2 freebsd-ufs (9.3G)
19920936 1048576 3 freebsd-swap (512M)
20969512 1968 - free - (984K)
root@host:~ #
root@host:~ # mount /dev/ada0p2 on / (ufs, local, journaled soft-updates) devfs on /dev (devfs, local, multilabel) root@host:~ #
root@host:~ # mount_msdosfs /dev/ada0p1 /mnt root@host:~ # mount /dev/ada0p2 on / (ufs, local, journaled soft-updates) devfs on /dev (devfs, local, multilabel) /dev/ada0p1 on /mnt (msdosfs, local) root@host:~ # ls -la /mnt total 21 drwxr-xr-x 1 root wheel 16384 Jan 1 1980 . drwxr-xr-x 18 root wheel 1024 Apr 13 15:30 .. drwxr-xr-x 1 root wheel 512 Apr 12 2016 efi root@host:~ # root@host:~ # ls -la /mnt/efi/ total 17 drwxr-xr-x 1 root wheel 512 Apr 12 2016 . drwxr-xr-x 1 root wheel 16384 Jan 1 1980 .. drwxr-xr-x 1 root wheel 512 Apr 12 2016 boot root@host:~ # 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 root@host:~ # cat /mnt/efi/boot/startup.nsh BOOTx64.efi root@host:~ #
Загрузка 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
Все.
# 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
Выше была рассмотрена чистая установка трех Операционных систем, на основании которой, можно сделать несколько важных выводов:
На основании данных выводов, можно легко установить указанные ОС вместе на один компьютер:
При установке двух систем на один диск, удобней следующий порядок:
А в случае установки трех систем на один диск, удобней следующий порядок:
Следует отметить, верхние рекомендации, являются условными, потому что опираются на личное, субъективное мнение.
Кроме того, при установке OS FreeBSD, необходимо:
Как уже было сказано, при установке первой системой 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 GNU/Linux Advanced options for Ubuntu GNU/Linux Windows Boot Manager (on /dev/sda1)
Разберем что делать, если Windows была установлена позже и как создать меню загрузки в GRUB2.
Нам необходимо создать меню Windows для GRUB2, для этого необходимо загрузить Linux. Это можно сделать двумя способами:
C:\> bcdedit /set {bootmgr} path \EFI\debian\grubx64.efi
C:\> bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi
После того как загрузились в Linux, необходимо:
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:~#
# os-prober
# 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
Недостатки FreeBSD в случае MultiBoot:
Существующие решения UEFI Multiboot для FreeBSD:
Установщик 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:~ #
# export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin # pkg # pkg update # pkg info
# pkg install -y grub2-efi
# mkdir /boot/efi # mount_msdosfs /dev/da0p1 /boot/efi
# grub-install --efi-directory=/boot/efi --removable --target=x86_64-efi /dev/da0
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:~ #
# grub-mkconfig /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 ###
### 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 ###
C:\> bcdedit /set {bootmgr} path \EFI\Boot\bootx64.efi
Все
При использовании rEFInd, не требуется установка grub2-efi, но перед завершением установки FreeBSD необходимо выйти в Live CD/USB, смонтировать партицию ESP и скопировать туда загрузчик FreeBSD:
# mount_msdosfs /dev/da0p1 /mnt
# mkdir /mnt/EFI/freebsd # cp /mnt/EFI/Boot/bootx64.efi /mnt/EFI/freebsd/freebsdx64.efi
Установка и настройка rEFInd.
S:\EFI\refind>rd /S /Q drivers_aa64 drivers_ia32 tools_aa64 tools_ia32 S:\EFI\refind>del /Q refind_aa64.efi refind_ia32.efi
S:\EFI\refind>copy refind.conf-sample refind.conf
menuentry "FreeBSD 11/UEFI" {
icon /EFI/refind/icons/os_freebsd.png
loader /EFI/freebsd/freebsdx64.efi
}
#
menuentry "Windows 7" {
icon \EFI\refind\icons\os_win.png
loader \EFI\Microsoft\Boot\bootmgfw.efi
}
C:\>bcdedit /set {bootmgr} path \EFI\refind\refind_x64.efi
rEFInd имеет достаточное количество настроек и может быть использован как с текстовым меню или графическим с иконками и тд и тп. Используйте документацию и пример refind.conf-sample
Теперь не составит труда настроить загрузку UEFI OS FreeBSD,Linux,Windows: Dual, Triple или MultiBoot.