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.
- Existe uma maneira alternativa de realizar o que tentamos realizar?
- 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 X
enquanto 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-grub
para 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 ssh
apó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 systemd
distribuiçã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:
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"
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