Время на прочтение5 мин
Количество просмотров87K
Добрый вечер, Habrahabr!
Сегодня мы научимся перезагружаться из Linux прямиком в Windows и обратно всего за один (двойной) клик.
Дано:
- Два диска с GPT с разными ОС
- Материнская плата с UEFI и отключеным Legacy Mode
- Windows, которую бережно поставили с полной поддержкой UEFI
- Linux (у меня Manjaro), который бережно поставили, выпилив любое упоминание GRUB и прочих старомодных вещей
- rEFInd — красивый менеджер загрузки (нет, не загрузчик)
Надо:
- Написать два скрипта на *sh и cmd (bat), которые позволят перезагрузиться в нужную ОС
Примечания:
- Рабочие варианты обозначены, как Решение, остальное — мои рассуждения и описание пути к цели.
- Я сознательно опускаю описание тех деталей, которые не относятся к сути настройки, либо легко варьируются. Упоминаются же эти детали потому, что для меня они не были очевидны на момент настройки, поэтому статья становится более понятной для неискушенных читателей, которые не будут видеть в ней инструкцию по рисованию совы.
- Почему стоит быть осторожным при модификации NVRAM
Linux:
Linux — прекрасная база для работы с компьютером, поэтому всё, что нам нужно, уже есть в репозиториях, а коллективный разум сообщества знает всё и всегда готов помочь. Поэтому, после недолгого изучения интернета, ставим efibootmgr:
У меня это было так
sudo pacman -S efibootmgr
Отлично, теперь запускаем:
sudo efibootmgr
Видим что-то вроде этого
Timeout: 1 seconds
BootOrder: 0001,0000
Boot0000* Windows Boot Manager
Boot0001* rEFInd Boot Manager
Внимательные читатели уже наверняка заметили, что в выводе что-то не так, но тогда я был окрылён мыслью о том, что через 15 минут буду летать между операционками без проблем, и не обратил на это должного внимания.
Ок, 3 минуты на документацию, и мы находим нужный параметр «-n«, который выставляет кастомый порядок загрузки ровно на один раз. Пробуем выполнить эту команду:
Решение
sudo efibootmgr -n 0000 && sync && reboot
И оказываемся в Windows, как того и желали. Теперь эту команду записываем в скрипт/alias/*.desktop-файл и радуемся тому, как всё здорово получилось.
Windows:
Началось всё с поиска аналога efibootmgr для Windows, которого в чистом виде, конечно же, нет. Для успокоения совести я даже попытался использовать Linux Subsystem, но это, конечно же, не сработало.
Беглый поиск по интернетам показал, что схожим функционалом по модификации NVRAM обладает утилита bcdedit. Отлично, думаю я, запускаю PowerShell из-под Администратора и пишу
bcdedit /enum firmware
Вот что я увидел
Firmware Boot Manager
---------------------
identifier {fwbootmgr}
displayorder {6893bb38-946b-11e7-b175-9301bd8a88f4}
{bootmgr}
timeout 1
Windows Boot Manager
--------------------
identifier {bootmgr}
device partition=\Device\HarddiskVolume2
path \EFI\Microsoft\Boot\bootmgfw.efi
description Windows Boot Manager
locale ru-RU
inherit {globalsettings}
default {current}
resumeobject {6893bb40-946b-11e7-b175-9301bd8a88f4}
toolsdisplayorder {memdiag}
timeout 30
Firmware Application (101fffff)
-------------------------------
identifier {6893bb38-946b-11e7-b175-9301bd8a88f4}
device partition=\Device\HarddiskVolume2
path \EFI\REFIND\REFIND_X64.EFI
description rEFInd Boot Manager
Где Linux? Куда грузиться? Ненавижу винду
На самом деле оказалось, что виновата не Windows, а я (да-да, тот самый момент для внимательных пользователей), и вот почему: rEFInd — прекрасная утилита, которая обычно, для корректной работы, требует только установить себя. Она умеет подхватывать все .efi файлы, разные дистрибутивы с разными ядрами, сама подставляет иконки. Прелесть, а не инструмент. Но это сыграло со мной злую шутку, так как оказалось, что UEFI ничего не знает про Linux, так как отсутствует соответствующий ему .efi-файл.
Поэтому презагружаемся обратно в Linux, конфигурируем systemd-boot (bootctl). Теперь всё выглядит вот так:
Timeout: 1 seconds
BootOrder: 0001,0003,0000,0002
Boot0000* Windows Boot Manager
Boot0001* rEFInd Boot Manager
Boot0002* Linux Boot Manager
Boot0003* Manjaro
Возвращаемся обратно и снова запускаем.
bcdedit /enum firmware
Вот что я увидел теперь
Firmware Boot Manager
---------------------
identifier {fwbootmgr}
displayorder {6893bb38-946b-11e7-b175-9301bd8a88f4}
{bootmgr}
{ff0bc716-c088-11e7-bf74-000acd2dac7d}
{ff0bc716-c088-11e7-bf74-000acd2dac7d}
timeout 1
Windows Boot Manager
--------------------
identifier {bootmgr}
device partition=\Device\HarddiskVolume2
path \EFI\Microsoft\Boot\bootmgfw.efi
description Windows Boot Manager
locale ru-RU
inherit {globalsettings}
default {current}
resumeobject {6893bb40-946b-11e7-b175-9301bd8a88f4}
toolsdisplayorder {memdiag}
timeout 30
Firmware Application (101fffff)
-------------------------------
identifier {6893bb38-946b-11e7-b175-9301bd8a88f4}
device partition=\Device\HarddiskVolume2
path \EFI\REFIND\REFIND_X64.EFI
description rEFInd Boot Manager
Firmware Application (101fffff)
-------------------------------
identifier {ff0bc716-c088-11e7-bf74-000acd2dac7d}
device partition=\Device\HarddiskVolume2
path \EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI
description Linux Boot Manager
Firmware Application (101fffff)
-------------------------------
identifier {ff0bc717-c088-11e7-bf74-000acd2dac7d}
device partition=\Device\HarddiskVolume1
path \EFI\manjaro\vmlinuz-4.13-x86_64
description Manjaro
Тут стоит упомянуть, что проблему мне помогали решать пользователи reddit. Именно благодаря им мы имеем следующий шаг:
bcdedit /bootsequence {ff0bc716-c088-11e7-bf74-000acd2dac7d}
Где аргументом является identifier необходимого варианта — Linux Boot Manager.
Troubleshooting
Powershell не даёт нормально выполнить эту команду, ругаясь на
The entry list data is not valid as specified.
Всё из-за того, что Microsoft периодически любит что-нибудь сломать. Решение просто и элегантно — вызываем классический CMD и работаем в нём. Это можно сделать командой
cmd
Перезагружаемся и видим, что порядок загрузки не изменился, а мы оказались в первом элементе в BootOrder (у меня это был rEFInd), выбираем Windows и видим страшный привет из времен DOS, который говорит нам, что \EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI не найден. Да, мы изменили параметры загрузчика Windows, но не UEFI.
Борьба с этой ошибкой заняла у меня все праздники, но ничего путного не получалось. Я уже подумывал написать на C++ небольшую программку для этого (то, что это возможно, следует из существования такого софта, как EasyUEFI).
Но тут на очередном сайте я обнаружил вот такую конструкцию
bcdedit /set {bootmgr} path ....
И тут меня осенило, что можно прямо сказать bcdedit что и куда писать. Дальше стоило только проверить догадку:
Решение
bcdedit.exe /set {fwbootmgr} bootsequence {ff0bc716-c088-11e7-bf74-000acd2dac7d} /addfirst
Тут важно, что мы явно сказали писать не в {bootmgr} (как он, видимо, делает по-умолчанию), а в {fwbootmgr}, что и является нашими настройками UEFI.
Перезагружаемся, и всё работает так, как мы этого хотели. Сохраняем это дело в bat/lnk, дописываем
shutdown /r /t 0
Выставляем запуск из-под администратора и готово!
Спасибо за внимание! Буду крайне рад замечаниям по технической части в комментариях, замечаниям по оформлению — в ЛС.
Many people prefer to install Linux in dual boot mode with Windows. Some of them use Linux as their primary OS while some prefer Windows as their primary OS.
When you install Ubuntu or Linux Mint or elementary OS along with Windows in dual boot mode, Linux becomes the default OS. At the boot time, on the grub screen, if you do not choose Windows for login within 10 seconds (default Grub timeout), it boots up into the Linux.
This grub behavior creates problem if you prefer to have Windows as your primary OS. You have to wait till the computer boots up and stay close to your computer to choose Windows for login.
This is inconvenient, I can understand. The good news is that you can customize grub to your liking.
In this tutorial, I’ll show you the graphical method to change the Grub boot order and make Windows default.
🚧
While Grub Customizer is an easy to use tool, it’s just a front end for changing the Grub config files. The changes you make are permanent.
GUI Method: Change Grub Boot Order with Grub Customizer
Grub Customizer is a graphical tool that allows you to customize server aspects of the Grub bootloader. You can reduce the grub boot time, change the background and change the boot order among several other things.
Let me show you how to use this tool.
Install Grub Customizer in Ubuntu-based distributions
Starting with Ubuntu 20.04, it is available in the Universe repository. This means that you can easily install Grub Customizer on Ubuntu from the software center:
Or, use the apt command to install the package in terminal:
sudo apt install grub-customizer
Installation instructions for Ubuntu 18.04
For Ubuntu 18.04 and Linux Mint 19 series, you’ll have to use PPA. Open a terminal and use the following commands one by one:
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt update
sudo apt install grub-customizer
Using Grub Customizer
Once installed, search for Grub Customizer in the menu and open it.
It requires the admin password because you are dealing with an important configuration that requires root privileges. Enter your password.
After that, you’ll see a screen where you can access the configuration. You can see that Windows lies at the bottom after so many Ubuntu options.
All you have to do is to move Windows over the first Ubuntu. You can use the arrow option from the top menu for this task.
Once done, you should have Windows on the top of this list. At this point, you should save this configuration.
This will edit the Grub menu and you can see the changed boot order at the next restart.
Bonus tip: Reduce the grub boot time
If you do not interact with the grub menu at the boot time, it takes 10 seconds to boot into the default operating system. You can use Grub Customizer and reduce this boot time to something of your choice like 3 seconds or 5 seconds.
You can do this from General Settings tab in Grub Customizer.
It’s an optional tip and will help you in reduce boot time (if you don’t manually press the enter key).
You can do some other grub customization as well with this wonderful tool.
I hope the tutorial helped you to change the grub boot order in Ubuntu and other Linux distribution and make Windows the default OS in your dual boot system. Grub Customizer is an amazingly simple tool for this task.
Questions, suggestions, a word of thanks are always welcome.
About the author
Abhishek Prakash
Created It’s FOSS 11 years ago to share my Linux adventures. Have a Master’s degree in Engineering and years of IT industry experience. Huge fan of Agatha Christie detective mysteries 🕵️♂️
Для выбора и запуска операционной системы во время загрузки компьютера используется специализированная программа — загрузчик. Самый популярный загрузчик — Grub. При установке нескольких операционных систем, например, Linux поверх Windows, в меню загрузчика первой будет последняя установленная ОС.
Это не вызовет проблем у пользователей, которые пользуются Linux как основной системой, для них это даже более предпочтительный вариант. Но если вы еще новичок, и хотите использовать Linux второй системой, а Windows пока еще основной, до тех пор, пока не освоитесь, то наверное захотите чтобы первой была Windows. В этой статье мы рассмотрим как сделать загрузку Windows первой в Grub. Рассмотрим два способа: с помощью программы Grub Customizer и вручную, через файлы конфигурации загрузчика Grub.
Grub Customizer
Grub Customizer — это программа, позволяющая настраивать различные параметры загрузчика Grub. В том числе и положение и очередность пунктов загрузки. Установить программу можно из официальных репозиториев. Например, в Ubuntu нужно использовать ppa:
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer
Для запуска программы откройте терминал (Ctrl + Alt + T) и наберите grub-customizer:
grub-customizer
Для работы программы необходимы права root, в некоторых системах возможно придется использовать такую команду:
gksu grub-customizer
Также программу можно запустить из главного меню. Главное окно выглядит вот так:
Несколько секунд после запуска программа будет сканировать установленные операционные системы, затем в этом же окне мы сможем перенести загрузку Windows на первое место. Для этого кликните на нужном пункте правой кнопкой чтобы открылось контекстное меню:
В меню выберите пункт Переместить вверх. Это действие нужно будет повторить несколько раз, пока Windows не будет первой в списке. Теперь будет выполняться загрузка windows по умолчанию grub.
Если потом вы захотите опустить Windows обратно вниз, есть обратное действие — Переместить вниз.
Для сохранения настроек просто нажмите кнопку Сохранить. Готово. Можете перезагружать компьютер и смотреть что получилось.
Но я хочу затронуть еще пару настроек, которые могут быть полезны. Вместо того чтобы делать загрузку Windows первой в Grub, можно изменить пункт запускаемый по умолчанию. Перейдите на вкладку Основные настройки:
Здесь для выбора пункта по умолчанию используемого по умолчанию есть список Задействовать:
Кроме того, можно загружать по умолчанию последнюю загруженную ОС, для этого есть галочка:
Не забудьте снова нажать кнопку сохранить.
Как я и обещал, теперь рассмотрим как сделать загрузку WIndows первой в Grub с помощью конфигурационных файлов. Конфигурация Grub находится в файле /boot/grub/grub.cfg.
sudo gedit /boot/grub/grub.cfg
Как правило, строки меню выглядят вот так:
menuentry имя_пункта --опции {
...
}
Например пункт Windows:
menuentry 'Windows 8 (loader) (on /dev/sda1)' --class windows --class os $menuentry_id_option 'osprob
er-chain-FC324E26324DE66C' {
....
}
Теперь чтобы изменить порядок пунктов меню достаточно вырезать все до обратной закрывающей скобочки, вместе с этой строкой, и вставить перед всеми другими пунктами. Затем можно сохранить файл и готово. Перезагружайте и смотрите. Загрузка Windows выполняется по умолчанию. Только минусом данного способа является то, что при обновлении конфигурации Grub все настройки собьются.
Аналогично тому как мы настраивали пункт, загружаемый по умолчанию в Grub Customizer, это можно сделать и в терминале. Откройте файл /etc/default/grub.
gksu gedit /etc/default/grub
Здесь нас интересует строчка:
GRUB_DEFAULT=0
Замените 0, на нужный пункт для загрузки, также вместо цифры можно указать имя пункта, например:
GRUB_DEFAULT="Windows 8 (loader) (on /dev/sda1)"
Посмотреть доступные пункты загрузки не открывая файл конфигурации можно командой:
sudo grep menuentry /boot/grub/grub.cfg
Еще можно настроить загрузку последней загруженной системы, для этого добавьте строчку
GRUB_SAVEDEFAULT=true
А в GRUB_DEFAULT укажите saved:
GRUB_DEFAULT=saved
Очевидным плюсом этого способа есть то, что настройки во время обновления конфигурации Grub не собьются, так как во время обновления информация берется из этого файла. Теперь давайте обновим конфигурацию и сохраним настройки командой:
grub-update
Не во всех системах работает такой вариант, поэтому можно использовать другую команду:
grub2-mkconfig -o /boot/grub/grub.cfg
Вот и все. Теперь вы знаете как сделать загрузку Windows первой в Grub. Но представленную в этой статье информацию можно использовать в более широких целях. Она будет полезна не только для Windows, но и для любых других нескольких систем, очередностью загрузки которых нужно управлять.
На дня потребовалось сделать так, чтобы на ноутбуке с двумя ОС (Ubuntu и Windows) по умолчанию загружалась именно Windows.
Что для это нужно: во время показа GRUB-экрана сосчитать количество отображаемых строчек (в моем случае их было пять) и вычистить от этого числа единицу (т.е. получаем четверку). Далее загрузиться в Ubuntu и в терминале ввести:
sudo nano /etc/default/grub
Изменить значение GRUB_DEFAULT=0
на 4.
После чего нужно обновить GRUB:
sudo update-grub
Похожие заметки:
– Включаем Ubuntu в состав домена Windows
– Как я обновлял Ubuntu 10.04 до 11.04
– Восстановление GRUB 2
– Обновление/удаление ядра в Linux
– Про Ubuntu Skin Pack
1. BIOS
BIOS — Basic Input Output System, это базовая система Ввода-Вывода,
то есть набор программ зашитых в микросхему, использовалась ОС MSDOS, более
современные ОС практически не используют BIOS.
За исключением процедуры POST — Инициализация и проверка работоспособности
аппаратуры.
Если POST выполнен без ошибок, код BIOS начнёт поиск кода загрузчика ОС.
Поиск выполняется на доступных и разрешённых в настройках носителях,
код BIOS загрузит код загрузчика ОС в память и передаст ему управление.
https://en.wikipedia.org/wiki/BIOS
Недостатки BIOS
- 16-битный код, реальный режим(real-mode)
- Отсутствие прямого доступа к 64-битному железу
- Отсутствие единого стандарта
- Сложность разработки.
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
- Отсутствие ограничений объема разделов и их количества
- Увеличение скорости загрузки
- Безопасность: возможность использования Secure Boot
- Обратная совместимость с BIOS — CSM (Compatibility Support Mode)
- Поддердка сетевой загрузки PXE
- Менеджер загрузки
3. Загрузка в UEFI
Как происходит загрузка в UEFI:
Примечание:
в дальнейшем рассматривается только схема разметки GPT GUID Partition Table.
EFI ищет партицию с идентификатором EF00, эта партиция называется
ESP (EFI System Partition) и должна быть оформлена как FS:
- FAT16
или - FAT32
однако, такие устройства как 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.
Особенности и условия, ничего особенного:
- настройка в UEFI BIOS -> загрузка UEFY Only
- отключить Secure Boot
- как уже было отмечено ранее, использовать официальный носитель с ОС
- или выбрать правильный дистрибутив, если используете самодельные
Ниже показана структура ESP из Windows 7
Описание PartitionID Размер Тип раздела Форматировать Буква диска -------------------------------------------------------------------------- Системный 1 100MB EFI FAT32 нет раздел EFI (ESP) Резервный 2 128MB MSR нет нет раздел Windows 3 ост-ное Основной NTFS C:
Программа установки Windows создает ESP на компьютере при следующих условиях:
- ESP еще не создан.
- На диске достаточно места для создания раздела емкостью 100 МБ.
Программа установки Windows создает MSR при следующих условиях:
- MSR еще не создан.
- На диске достаточно места для создания раздела емкостью 128 МБ.
Приоритет создания 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>
чтобы понять что на каком диске находится:
- выбираем диск командой sel
- смотрим содержимое партиций
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б
- выбираем диск 0
- партицию 1
- назначаем букву для монтирования
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\Boot\bootx64.efi
и - \EFI\Microsoft\Boot\bootmgfw.efi
это одна и та же 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 следующим образом;
- загрузка UEFY Only
- отключить Secure Boot
Дистрибутивы Debian/CentOS/Ubuntu — при начальной установке не требуют
вмешательства, установщик правильно разбирается с разметкой:
- если разметка отсутствует создает ESP и прописывает туда загрузчик efi
- если разметка уже есть и ESP партиция в наличии, добавляет туда
свой загрузчик и делает его default’ным
Примечание:
В EFI/BIOS предлагается выбрать загрузку UEFI Only
потому что с ней не будет проблем.
Это связано с реализацией UEFI/BIOS различными производителями.
Загрузка: UEFY, Legacy — должна отрабатывать
в последовательности:
- — сначала найти ESP и попытаться загрузиться
- — если ESP на устройствах отсутствуют, перейти к загрузке Legacy(BIOS)
Загрузка на некоторых материнских картах в случае выбора двух режимов;
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:
- Ubuntu и Debian имеют адаптированную утилиту fdisk для работы с GPT
- или воспользоваться альтернативой: gdisk или parted
Примеры разметки:
- fdisk
# 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
# 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
# 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
6. FreeBSD on UEFI/GPT
Установка FreeBSD из UEFI на чистый диск проходит без проблем,
но если диск уже размечен как GPT и на нем есть ESP партиция,
то встраиваться туда FreeBSD не умеет.
Ниже пример чистой установки FreeBSD из UEFI(пусть не смущает что это VM):
- uname
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:~ #
- camcontrol
root@host:~ # camcontrol devlist at scbus1 target 0 lun 0 (cd0,pass0) at scbus3 target 0 lun 0 (ada0,pass1) root@host:~ #
- gpart
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:~ #
- mount
root@host:~ # mount /dev/ada0p2 on / (ufs, local, journaled soft-updates) devfs on /dev (devfs, local, multilabel) root@host:~ #
- монтирование ESP и просмотр содержимого
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
- boot1.efi читает /boot.config или /boot/config
- затем ищет на ufs или zfs загрузчик loader.efi и загружает его
- loader.efi загружает ядро — kernel
Все.
Создание 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
Выше была рассмотрена чистая установка трех Операционных систем, на
основании которой, можно сделать несколько важных выводов:
- Windows 7/8/10
- использует существующую ESP при установке
- делает собственый загрузчик default’ным, не интегрирует существующие ОС в меню загрузки
- имеет утилиту управления загрузчиком: bcdedit
- Linux
- использует существующую ESP при установке
- делает собственый загрузчик GRUB2-EFI default’ным, добавляет существующие ОС в загрузочное меню
- имеет утилиту управления загрузчиком: efibootmgr
- FreeBSD
- процедура установки не умеет использовать существующую ESP
- не имеет утилит управления загрузчиком
- имеет пакет(порт) grub2-efi для установки и настройки стороннего загрузочного менеджера
На основании данных выводов, можно легко установить указанные ОС вместе на один компьютер:
- на один диск
- на разные диски
- в любом порядке
однако определенный порядок, может упростить настройку загрузки.
При установке двух систем на один диск, удобней следующий порядок:
- 1.Windows затем 2.FreeBSD
- 1.Windows затем 2.Linux
- 1.Linux затем 2.FreeBSD
А в случае установки трех систем на один диск, удобней следующий порядок:
- Windows
- FreeBSD
- Linux
Следует отметить, верхние рекомендации, являются условными, потому что
опираются на личное, субъективное мнение.
Кроме того, при установке OS FreeBSD, необходимо:
- использовать ручную разметку диска: Manual
- не создавать ESP партицию
необходимые дополнительные настройки после установки 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.
Это можно сделать двумя способами:
- из Windows с помощью bcdedit
C:\> bcdedit /set {bootmgr} path \EFI\debian\grubx64.efi
или
C:\> bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi
- используя POP-UP меню BIOS выбрать загрузку Linux
После того как загрузились в Linux, необходимо:
- изменить порядок загрузки через efibootmgr
имеем by default: BootOrder: 0005, где
Boot0005* Windows Boot Managerroot@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:~#
- создать меню загрузки Windows для GRUB2
два варианта:- достаточно выполнить утилиту os-prober (ее используют grub-probe и grub-mkconfig)
# os-prober
- или создать руками /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
- достаточно выполнить утилиту os-prober (ее используют grub-probe и grub-mkconfig)
Все.
UEFI DualBoot Windows и FreeBSD
Недостатки FreeBSD в случае MultiBoot:
- Установщик FreeBSD не умеет интегрировать efi загрузчик в уже существующую ESP
- В FreeBSD отсутствует утилита аналогичная efibootmgr
Существующие решения UEFI Multiboot для FreeBSD:
- порт sysutils/grub2-efi
- сторонний загрузчик rEFInd
Установщик FreeBSD не умеет интегрировать свой загрузчик в уже
существующую ESP и система не имеет утилиты манипуляции переменными EFI.
Наименее затратный вариант, если FreeBSD будет
установлена первой. При установке нужно
проследить чтобы партиция ESP была размером
не менее 100MB. В ином случае, разметить вручную Manual
Если OS FreeBSD будет устанавливаться не первой системой:
- разметку диска необходимо выполнить вручную Manual
- ESP создавать НЕ НУЖНО! Должна быть только одна.
- по завершению установки выйти в режим Live CD/USB
и установить пакет sysutils/grub2-efi - или вместо grub2-efi установить из Windows загрузочный менеджер rEFInd
Рассмотрим вариант установки 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
- выполняем grub-mkconfig для создания конфигурации /boot/grub/grub.cfg
# grub-mkconfig /boot/grub/grub.cfg
- удаляем секцию 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 ###
- создаем свою секцию 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:
- монтируем ESP
# mount_msdosfs /dev/da0p1 /mnt
- создаем директорию FreeBSD и копируем в нее загрузчик
# mkdir /mnt/EFI/freebsd # cp /mnt/EFI/Boot/bootx64.efi /mnt/EFI/freebsd/freebsdx64.efi
- установку и настройку rEFInd удобней выполнить из Windows, но можно из FreeBSD.
Установка и настройка rEFInd.
- монтируем ESP используя команду mountvol
- Скачиваем rEFInd
- Разворачиваем архив в S:\EFI\refind
- Удаляем все лишние из \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
- создаем конфиг refind.conf
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 }
- используя bcdedit устанавливаем refind как загрузчик by default
C:\>bcdedit /set {bootmgr} path \EFI\refind\refind_x64.efi
- перезагружаемся и наслаждаемся меню rEFInd
rEFInd имеет достаточное количество настроек и
может быть использован как с текстовым меню или графическим с иконками
и тд и тп. Используйте документацию и пример refind.conf-sample
Теперь не составит труда настроить загрузку UEFI OS FreeBSD,Linux,Windows: Dual, Triple или MultiBoot.
Copyleft lavr@unix1.jinr.ru Андрей Лаврентьев