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.