Красивый дуалбут

или укрощаем EFI Boot Order

config efi

Весь мир уходит в облака. Я - далеко не исключение. Как и у большинства моих знакомых, у меня тоже стоит две системы - одна для работы, вторая бутстрап для игр. Но что если необходимо удаленное подключение к компу и при этом еще бы, желательно, уметь перегружаться между ними по желанию?

Как понятно из аннотации, нужно придумать, как можно без физического доступа к компу перегружаться между виндой и линуксом. Итак, вводные: у меня стоит две системы, в нормальной ситуации EFI грузит ReFIND, через который я уже выбираю, какой я смешарик сегодня. Но в случае, если я в другом городе, то при обычной перезагрузке я через некоторое время вернусь обратно в линукс, как только выйдет тайм-аут выбора и ReFIND сам загрузит линукс. Так как иногда хотелось и ВНки попроходить я задумался, а как можно сделать это красиво.

Немного вводных

Вообще говоря, винда на компе это сразу огромный минус к безопасности. Просто потому что она убивает всю идею SecureBoot'a - ключи Microsoft известны всем кому не лень, уже появляются буткиты, которые ими подписаны и благодаря этому проходят проверку подписей, то есть сводят на ноль всю пользу. Да, они это делают через CVE, но тем не менее сам факт. Когда у вас на компе винда нужно позаботиться о том, чтобы физический доступ к такому компу имело как можно меньше людей и чтобы вы им доверяли больше, чем себе. Но это лирика о наболевшем, вернемся к нашим баранам.

Как я уже сказал, нужно найти способ выбирать, что будет грузить EFI при следующей загрузке, причем нужно это делать еще будучи в ОСи, потому что открывать доступ к EFI по сети это очень интересный способ показать всем, какой вы оригинал :)

Мир пингвина

В случае линукса проблем вообще не возникает (скорее всего, сказывается мой болшой опыт работы с ним) - с помощью efibootmgr можно поменять порядок загрузки только на следующую загрузку (привет, тавтология). Таким образом, все что нужно сделать это выяснить, под каким номером висит загрузчик винды и поменять на него следующую загрузку:

sudo efibootmgr

Вывод будет каким-то таким:

Timeout: 1 seconds
BootOrder: 0000,0001
Boot0000* rEFInd Boot Manager
Boot0001* Windows Boot Manager

Таким образом, загрузчик винды висит под номером 0001, просто указываем его как приоритет загрузки на следующий раз и перегружаемся, попадаем в винду:

 sudo efibootmgr -n 0001 && sync && reboot

Profit!

Важное замечание

Пытливый читатель (или люди, которые взаимодействовали с EFI достаточно много) заметит сразу, что с виндой такой фокус "из коробки" не получится - просто нет загрузчика ядра. Только ReFIND. Поэтому прежде чем идти дальше нужно сгенерировать bundle/настроить systemd-boot/далее по списку, кому что нравится. После этого в списке загрузчиков уже появится ядро, на которое мы и будем перегружаться из винды:

Timeout: 1 seconds
BootOrder: 0000,0001,0002
Boot0000* rEFInd Boot Manager
Boot0001* Windows Boot Manager
Boot0002* Bare linux loader

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

Мир винды

Тут все намного сложнее. Есть bcdedit, который позволяет редактировать NVRAM. Через него мы получим тот же список загрузчиков в EFI:

 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

Firmware Application (101fffff)
-------------------------------
identifier              {ff0bc717-c088-11e7-bf74-000acd2dac7d}
device                  partition=\Device\HarddiskVolume1
path                    LINUX.EFI
description             Bare linux loader

Собственно, последний пункт в списке нас и интересует - это ядро, на которое мы будем перегружаться.

На правах самопиара позволю себе изложить мои приключения на поприще настройки винды. Открыв маны к bcdedit я увидел ключ /bootsequence и радостно попытался сразу же перегрузится. Но, внезапно, оказалось, что этот ключ меняет порядок загрузки самой винды, но не EFI. Облом-с. Читаем еще раз, на этот раз внимательно, и видим, что менять нужно {fwbootmgr}. Таким образом, установка загрузчика на один раз будет выглядеть как

bcdedit.exe /set {fwbootmgr} bootsequence {ff0bc716-c088-11e7-bf74-000acd2dac7d} /addfirst

Все, шалость удалась. Я сделал себе бат-файлик, в котором еще дописал shutdown /r /t 0 и вынес ссылку на рабочий стол с запуском от админа. Теперь при необходимости перезагрузки в линукс просто запускаем ярлык и видим перед собой пингвина :)

Previous Post Next Post