
¿Qué opciones están disponibles para lograr el siguiente escenario de arranque?
Al iniciar (antes del inicio), comuníquese con un servidor web definido y pregunte qué iniciar (respuesta normal: iniciar desde el disco duro local; respuesta alternativa: imagen de inicio XYZ)
El objetivo es poder reinstalar los clientes sin la necesidad de interacción del usuario en los clientes. La forma lógica de hacer esto sería el arranque PXE, pero como no controlamos el entorno, el arranque normal de PXE es inseguro ya que abriría un vector de ataque.
Lo que encontré y probé hasta ahora es lo siguiente: Iniciar Grub2 desde el disco duro local y cargar en cadena iPXE. Luego, iPXE se comunica con el servidor web definido a través de http y recupera un script iPXE. Pero desde allí todavía no he encontrado una manera de arrancar desde el disco local (excepto iniciar Grub nuevamente y terminar en un bucle sin fin). El sistema operativo que me gustaría iniciar está en la partición 2 del mismo disco duro desde donde se inicia Grub/iPXE.
- ¿Existe una forma alternativa de lograr lo que intentamos lograr?
- ¿Hay alguna manera de decirle a Grub que seleccione una opción diferente en el segundo inicio (volviendo de iPXE) o de decirle a iPXE que arranque desde la partición 2?
Nota al margen: la partición 2 contiene un Windows Boatloader y se puede iniciar desde el menú Grub.
Respuesta1
He utilizado la siguiente técnica para actualizar un sistema remoto, que también podría ayudarle. En ese sistema solo podía iniciar un reinicio, no mirar la pantalla (de arranque). El sistema arrancó en grub (en Ubuntu 12.04) y tenía una partición adicional y una partición de datos. El truco consiste en insertar en
/etc/default/grub
:
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=false
Que siempre inicies en la entrada 0 (Ubuntu 12.04) a menos que:
- alguien en la consola selecciona otra cosa
- ejecuta
grub-reboot X
mientras está conectado a Ubuntu y reinicia
Desde Ubuntu, descargaría y extraería un archivo tar a la partición adicional (o haría pequeños cambios a mano), luego ejecutaría update-grub
para actualizar el menú de grub (que escaneó la partición adicional recién llena y creó entradas de menú para su sistema operativo), luego usaría grub-reboot
y reboot
.
Si la máquina no regresa (es decir, no puede ssh
después de un período de gracia), puedo restablecer la máquina y se reiniciará en Ubuntu lista para analizar qué salió mal y el siguiente ciclo.
Con el programa apropiado ejecutado en el arranque, puede verificar cuál es la siguiente "imagen" que necesita descargar, ver si ya la tiene (si no descargarla) e instalarla. Luego reinicie como se indica arriba.
Con una systemd
distribución basada en lean, el proceso de reinicio debería ser relativamente rápido, y descargar/instalar un sistema operativo/distribución alternativa llevaría la mayor parte del tiempo.
Respuesta2
Encontré una manera de lograr lo que estábamos buscando. Gracias a @jc__ por la pista con grubenv y también a @Anthon.
Así que aquí está mi solución: coloque un binario del kernel iPXE (.lkrn) con el script personalizado para contactar al servidor de control de arranque en /boot.
Luego configura Grub
1- usar variable de grubenv
GRUB_DEFAULT=saved
2- Cargue en cadena iPXE en /boot desde Grub e incluya el siguiente comando antes de iniciar iPXE
set saved_entry='<menuentry to boot from local drive>'
save_env saved_entry
3- Anteponga la entrada del menú Grub que carga el sistema operativo desde la unidad local con
set saved_entry='<menuentry iPXE>'
save_env saved_entry
4- Si no es necesario hacer nada, el servidor de control de arranque le indica al iPXE que arranque desde la unidad local con
sanboot --no-describe --drive 0x80
5- Grub se carga nuevamente y arranca en la unidad local, configurando el siguiente arranque para que sea iPXE nuevamente.
El tiempo de inicio de Windows 10, incluida la solicitud del servidor de control de inicio, es de unos 25 segundos. En realidad, bastante rápido. :)
Respuesta3
Hay al menos dos maneras de lograr esto:
Echa un vistazo ahttp://ipxe.org/appnote/work_around_bios_halting_on_ipxe_exit#examples, uno de estos comandos podría funcionar para usted:
chain ${server}/grub4dos.exe --config-file="find --set-root /BOOTMGR;chainloader /BOOTMGR" chain ${server}/grub4dos.exe --config-file="root (hd0,1);chainloader +1"
Actualmente estoy usando lo siguiente mientras construía esto antes de encontrar esa página en GRUB4DOS en el sitio iPXE. Cree una imagen ISO que contenga ISOLINUX y esta configuración:
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 inícielo usando (tiene que usar 0x81 aquí porque usa 0x80 de forma predeterminada, lo que anularía el disco local):
sanboot --drive 0x81 ${server}/chain-hd0-2.iso