Como posso perguntar a um servidor definido o que inicializar

Como posso perguntar a um servidor definido o que inicializar

Quais opções estão disponíveis para realizar o seguinte cenário de inicialização?

Na inicialização (antes da inicialização) entre em contato com um servidor web definido e pergunte o que inicializar (resposta normal: inicialize a partir do disco rígido local; resposta alternativa: imagem de inicialização XYZ)

O objetivo é poder reinstalar os clientes sem a necessidade de interação do usuário nos clientes. A maneira lógica de fazer isso seria a inicialização PXE, mas como não controlamos o ambiente, o padrão de inicialização PXE é inseguro, pois abriria um vetor de ataque.

O que encontrei e tentei até agora é o seguinte: Iniciar o Grub2 a partir do disco rígido local e carregar o iPXE em cadeia. O iPXE então entra em contato com o servidor web definido por http e obtém um script iPXE de volta. Mas a partir daí ainda não encontrei uma maneira de inicializar a partir da unidade local (exceto iniciar o Grub novamente e terminar em um loop infinito). O sistema operacional que eu gostaria de inicializar está na partição 2 do mesmo disco rígido a partir do qual o Grub/iPXE foi iniciado.

  1. Existe uma maneira alternativa de realizar o que tentamos realizar?
  2. Existe uma maneira de dizer ao Grub para selecionar uma opção diferente na segunda inicialização (voltando do iPXE) ou dizer ao iPXE para inicializar a partir da partição 2?

Nota lateral: a partição 2 contém um Windows Boatloader e pode ser inicializada a partir do menu Grub.

Responder1

Usei a seguinte técnica para atualizar um sistema remoto, que também pode ajudá-lo. Nesse sistema eu só consegui iniciar uma redefinição, sem olhar para a tela (de inicialização). O sistema inicializou no grub (no Ubuntu 12.04) e tinha uma partição extra e uma partição de dados. O truque é inserir /etc/default/grub:

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=false

Que você sempre inicialize na entrada 0 (Ubuntu 12.04), a menos que:

  • alguém no console seleciona outra coisa
  • você executa grub-reboot Xenquanto está logado no Ubuntu e reinicia

No Ubuntu, eu baixaria e extrairia um arquivo tar para a partição extra (ou faria pequenas alterações manualmente), depois executaria update-grubpara atualizar o menu grub (que escaneou a partição extra recém-preenchida e criou entradas de menu para seu sistema operacional), então use grub-reboot e reboot.

Se a máquina não voltasse (ou seja, não pudesse sshapós um período de carência), eu poderia reiniciar a máquina e ela seria reiniciada no Ubuntu pronta para analisar o que deu errado e o próximo ciclo.

Com o programa apropriado executado na inicialização você pode verificar qual é a próxima "imagem" que você precisa baixar, ver se você já a tem (se não baixar) e instalar. Em seguida, reinicie como acima.

Com uma systemddistribuição baseada em lean, o processo de reinicialização deve ser relativamente rápido, e baixar/instalar um sistema operacional/distro alternativo levaria a maior parte do tempo.

Responder2

Encontrei uma maneira de realizar o que procurávamos. Obrigado a @jc__ pela dica com grubenv e também a @Anthon.

Então aqui está minha solução: coloque um binário de kernel iPXE (.lkrn) com o script personalizado para entrar em contato com o servidor de controle de inicialização em/boot

Então configure o Grub

1- usar variável do grubenv

GRUB_DEFAULT=saved

2- Carregue o iPXE em cadeia em /boot do Grub e inclua o seguinte comando antes de inicializar o iPXE

set saved_entry='<menuentry to boot from local drive>'
save_env saved_entry

3- Anexe a entrada do menu Grub que carrega o sistema operacional da unidade local com

set saved_entry='<menuentry iPXE>'
save_env saved_entry

4- Se nada precisar ser feito, o servidor de controle de inicialização instrui o iPXE a inicializar a partir da unidade local com

sanboot --no-describe --drive 0x80

5- O Grub é carregado novamente e inicializa na unidade local, configurando a próxima inicialização para ser iPXE novamente.

O tempo de inicialização no Windows 10, incluindo a solicitação do servidor de controle de inicialização, é de cerca de 25 segundos. Então, na verdade, muito rápido. :)

Responder3

Existem pelo menos duas maneiras de fazer isso:

  1. Dê uma olhadahttp://ipxe.org/appnote/work_around_bios_halting_on_ipxe_exit#examples, um destes comandos pode funcionar para você:

    chain ${server}/grub4dos.exe --config-file="find --set-root /BOOTMGR;chainloader /BOOTMGR"
    chain ${server}/grub4dos.exe --config-file="root (hd0,1);chainloader +1"
    
  2. Atualmente, estou usando o seguinte, pois criei isso antes de encontrar aquela página no GRUB4DOS no site iPXE. Crie uma imagem ISO contendo ISOLINUX e esta configuração:

    NOESCAPE 1
    PROMPT 0
    ALLOWOPTIONS 0
    
    DEFAULT chain-hd0-2
    LABEL chain-hd0-2
    SAY Chaining hd0 2...
    COM32 chain.c32
    APPEND hd0 2
    

    E inicialize-o usando (você precisa usar 0x81 aqui porque ele usa 0x80 por padrão, o que substituiria o disco local):

    sanboot --drive 0x81 ${server}/chain-hd0-2.iso
    

informação relacionada