Весь мир уходит в облака. Я - далеко не исключение. Как и у большинства моих знакомых, у меня тоже стоит две системы - одна для работы, вторая бутстрап для игр. Но что если необходимо удаленное подключение к компу и при этом еще бы, желательно, уметь перегружаться между ними по желанию?
Как понятно из аннотации, нужно придумать, как можно без физического доступа к компу перегружаться между виндой и линуксом. Итак, вводные: у меня стоит две системы, в нормальной ситуации 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
и вынес ссылку на рабочий стол с запуском от админа. Теперь при необходимости перезагрузки в линукс просто запускаем ярлык и видим перед собой пингвина :)