Как я могу спросить определенный сервер, что загрузить?

Как я могу спросить определенный сервер, что загрузить?

Какие варианты доступны для реализации следующего сценария загрузки?

При загрузке (перед загрузкой) свяжитесь с определенным веб-сервером и спросите, что загрузить (обычный ответ: загрузка с локального жесткого диска; альтернативный ответ: загрузочный образ XYZ)

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

Что я нашел и попробовал на данный момент, так это следующее: запуск Grub2 с локального жесткого диска и цепочная загрузка iPXE. Затем iPXE связывается с определенным веб-сервером по http и получает обратно скрипт iPXE. Но оттуда я пока не нашел способа загрузиться с локального диска (кроме повторного запуска Grub и завершения в бесконечном цикле). ОС, которую я хотел бы загрузить, находится на разделе 2 того же жесткого диска, с которого запущен Grub/iPXE.

  1. Есть ли альтернативный способ достичь того, чего мы пытаемся достичь?
  2. Есть ли способ указать 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

Есть как минимум два способа сделать это:

  1. Взгляни на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"
    
  2. В настоящее время я использую следующее, поскольку я построил это до того, как нашел эту страницу на 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
    

Связанный контент