Какие варианты доступны для реализации следующего сценария загрузки?
При загрузке (перед загрузкой) свяжитесь с определенным веб-сервером и спросите, что загрузить (обычный ответ: загрузка с локального жесткого диска; альтернативный ответ: загрузочный образ XYZ)
Цель состоит в том, чтобы иметь возможность переустанавливать клиентов без необходимости взаимодействия с пользователем на клиентах. Логичным способом сделать это была бы загрузка PXE, но поскольку мы не контролируем среду, которая по умолчанию использует обычную загрузку, PXE небезопасен, так как он откроет вектор атаки.
Что я нашел и попробовал на данный момент, так это следующее: запуск Grub2 с локального жесткого диска и цепочная загрузка iPXE. Затем iPXE связывается с определенным веб-сервером по http и получает обратно скрипт iPXE. Но оттуда я пока не нашел способа загрузиться с локального диска (кроме повторного запуска Grub и завершения в бесконечном цикле). ОС, которую я хотел бы загрузить, находится на разделе 2 того же жесткого диска, с которого запущен Grub/iPXE.
- Есть ли альтернативный способ достичь того, чего мы пытаемся достичь?
- Есть ли способ указать Grub выбрать другую опцию при втором запуске (возвращаясь из iPXE) или указать iPXE загрузиться с раздела 2?
Примечание: Раздел 2 содержит Windows Boatloader и может быть загружен из меню Grub.
решение1
Я использовал следующую технику обновления удаленной системы, которая может помочь и вам. На той системе я мог только инициировать сброс, не глядя на (загрузочный) экран. Система загрузилась в grub (на Ubuntu 12.04) и имела как дополнительный раздел, так и раздел данных. Хитрость заключается в том, чтобы вставить в
/etc/default/grub
:
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=false
Всегда загружайтесь с записи 0 (Ubuntu 12.04), если только:
- кто-то за пультом выбирает что-то другое
- вы запускаете
grub-reboot X
войдя в Ubuntu, и перезагружаетесь
Из Ubuntu я бы загрузил и извлек файл tar в дополнительный раздел (или внес небольшие изменения вручную), затем запустил бы update-grub
обновление меню grub (которое просканировало бы только что заполненный дополнительный раздел и создало бы пункты меню для его ОС), затем использовал бы grub-reboot
и reboot
.
Если машина не восстанавливалась (т.е. не могла восстановиться ssh
после истечения льготного периода), я мог сбросить настройки машины, и она перезагрузилась в Ubuntu, готовая к анализу неполадок и следующему циклу.
С помощью соответствующей программы, запущенной при загрузке, вы можете проверить, какой следующий "образ" вам нужно загрузить, посмотреть, есть ли он у вас уже (если нет, загрузите) и установить. Затем перезагрузитесь, как указано выше.
При использовании дистрибутива на основе Lean systemd
процесс перезагрузки должен быть относительно быстрым, а загрузка/установка альтернативной ОС/дистрибутива займет большую часть времени.
решение2
Я нашел способ сделать то, что мы искали. Спасибо @jc__ за подсказку с grubenv, а также @Anthon.
Итак, вот мое решение: поместите двоичный файл ядра iPXE (.lkrn) с пользовательским скриптом для связи с сервером управления загрузкой в /boot
Затем установите Grub.
1- использовать переменную из grubenv
GRUB_DEFAULT=saved
2- Загрузите iPXE в /boot из Grub и включите следующую команду перед загрузкой iPXE
set saved_entry='<menuentry to boot from local drive>'
save_env saved_entry
3- Добавьте в начало меню Grub запись, которая загружает ОС с локального диска
set saved_entry='<menuentry iPXE>'
save_env saved_entry
4- Если ничего не нужно делать, сервер управления загрузкой дает команду iPXE загрузиться с локального диска с помощью
sanboot --no-describe --drive 0x80
5- Grub снова загружается и загружается на локальный диск, снова настраивая следующую загрузку на iPXE.
Время загрузки Windows 10, включая запрос сервера управления загрузкой, составляет около 25 секунд. Так что на самом деле довольно быстро. :)
решение3
Есть как минимум два способа сделать это:
Взгляни наhttp://ipxe.org/appnote/work_around_bios_halting_on_ipxe_exit#examples, вам может подойти одна из этих команд:
chain ${server}/grub4dos.exe --config-file="find --set-root /BOOTMGR;chainloader /BOOTMGR" chain ${server}/grub4dos.exe --config-file="root (hd0,1);chainloader +1"
В настоящее время я использую следующее, поскольку я построил это до того, как нашел эту страницу на GRUB4DOS на сайте iPXE. Создайте образ ISO, содержащий ISOLINUX и эту конфигурацию:
NOESCAPE 1 PROMPT 0 ALLOWOPTIONS 0 DEFAULT chain-hd0-2 LABEL chain-hd0-2 SAY Chaining hd0 2... COM32 chain.c32 APPEND hd0 2
И загрузите его, используя (здесь вам придется использовать 0x81, поскольку по умолчанию используется 0x80, который переопределит локальный диск):
sanboot --drive 0x81 ${server}/chain-hd0-2.iso