GNU/Linux >> Tutoriales Linux >  >> Linux

Configuración del arranque UEFI HTTP con libvirt

He sido un gran defensor del aprovisionamiento basado en red durante casi toda mi carrera. Mi segundo trabajo fuera de la universidad consistía en generar imágenes de ~800 computadoras varias veces a la semana. Cuando me contrataron, mis predecesores usaban disquetes para cargar un sistema operativo (SO) pequeño, un controlador de tarjeta de interfaz de red (NIC) correspondiente y un cliente de imágenes (¿recuerdan Ghost?). La conclusión fue que requería mucho tiempo/trabajo y era un proceso horrible. La obtención de imágenes de un grupo de sistemas tomó entre 30 y 60 minutos. Para resumir, redujimos ese tiempo a unos cinco minutos después de aprovechar una combinación de controladores PXE, Wake-on-LAN, Universal Network Device Interface (UNDI), LAN virtuales (VLAN) y IGMP snooping. Mi segunda iteración de la solución redujo el tiempo total de atención a menos de 30 segundos. Es una tecnología increíble para el aprovisionamiento e incluso me contrataron en Red Hat para dar una presentación sobre el entorno de ejecución previo al arranque (PXE). No hace falta decir que soy un gran admirador.

[ También puede disfrutar: Crear un sistema de escritorio Linux de arranque múltiple ]

De todos modos, el problema aquí es que PXE se remonta a los años 90 y está bastante limitado por su dependencia de tecnologías como el protocolo de transferencia de archivos trivial (TFTP). Intel ha estado amenazando con desaprobar PXE durante años y finalmente lo están haciendo. Aunque PXE es omnipresente en la actualidad, es probable que durante los próximos 2 a 10 años, el arranque HTTP UEFI se convierta en el predeterminado para la mayoría de los entornos. Aquí se describen otros beneficios y detalles técnicos. El TL;DR es PXE que se basa en DHCP y TFTP, y el arranque HTTP de la interfaz de firmware extensible unificada (UEFI) necesita DHCP y HTTP. ¿Suena fácil? Eso es porque lo es. Incluso podría decir que es tan trivial como los protocolos de transferencia de archivos. Lo sentimos, el humor de arranque de red es bastante difícil de conseguir.

Cambiar de arranque PXE a HTTP

La mejor documentación que puedo encontrar sobre este tema actualmente se proporciona a continuación en la sección de Referencias. Esencialmente, se elimina la necesidad de TFTP. A continuación, edite las opciones de DHCP para obtener el NBP desde un extremo HTTP/HTTPS. Uso GRUB como NBP en este artículo. Entornos que usan dhcpd puede simplemente colocar la configuración que proporcionan, y todo debería funcionar suponiendo que modifique el filename para señalar el NBP correcto para su entorno:

  class "pxeclients" {
     match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
     next-server 192.168.111.1;
     filename "/bootx64.efi";
   }
   class "httpclients" {
     match if substring (option vendor-class-identifier, 0, 10) = "HTTPClient";
     option vendor-class-identifier "HTTPClient";
     filename "http://www.httpboot.local/sle/EFI/BOOT/bootx64.efi";
   }

Este ejemplo es bueno ya que permite que los sistemas UEFI con una ROM PXE heredada también se inicien.

Aplicar esto a libvirt

Originalmente había planeado configurar esto en mi red doméstica, pero pfSense aún no es compatible con esto, ni permite el dhcpd configuración a modificar directamente. He abierto un problema y, con suerte, se agregará en el futuro. La siguiente opción más simple que tengo para probar es usar libvirt y máquinas virtuales (VM) con el firmware UEFI Open Virtual Machine Firmware (OVMF) (Tianocore). Además, libvirt funciona muy bien para crear un entorno autónomo para experimentar con tecnología como esta y es muy fácil de replicar. Todo lo que realmente necesita hacer es proporcionar las opciones de DHCP correctas.

La red libvirt predeterminada se verá similar a esto:

<network>
 <name>default</name>
 <uuid>75f4d9cd-9af2-4df5-afcc-f8f9145f7e34</uuid>
 <forward mode='nat'/>
 <bridge name='virbr0' zone='trusted' stp='on' delay='0'/>
 <mac address='52:54:00:95:95:84'/>
 <ip address='192.168.122.1' netmask='255.255.255.0'>
   <dhcp>
     <range start='192.168.100.128' end='192.168.100.254' />
   </dhcp>
 </ip>
</network>

Habilitar PXE heredado está bien documentado, pero incluyo los cambios aquí en caso de que sea útil para cualquiera que lea. Debe definir las opciones DHCP del siguiente servidor y nombre de archivo.

<network>
 <name>default</name>
 <uuid>75f4d9cd-9af2-4df5-afcc-f8f9145f7e34</uuid>
 <forward mode='nat'/>
 <bridge name='virbr0' zone='trusted' stp='on' delay='0'/>
 <mac address='52:54:00:95:95:84'/>
 <ip address='192.168.122.1' netmask='255.255.255.0'>
 <tftp root='/var/lib/tftpboot'/>
   <dhcp>
     <range start='192.168.100.128' end='192.168.100.254' />
     <bootp file='pxelinux.0'/>
   </dhcp>
 </ip>
</network>

Desafortunadamente, el esquema libvirt no admite muchas opciones de configuración disponibles para dnsmasq. Afortunadamente, las versiones recientes de libvirt admiten un espacio de nombres XML que agregará opciones directamente al final del archivo de configuración generado. Este correo electrónico muestra la única configuración funcional de dnsmasq que pude encontrar, ya que el arranque HTTP no está bien documentado para el proyecto. Por ahora, dejo la información de TFTP en su lugar para que las máquinas virtuales que usan BIOS puedan continuar con las instalaciones de red.

Nota :No ignore la primera línea de este ejemplo.

<network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'>
 <name>default</name>
 <uuid>75f4d9cd-9af2-4df5-afcc-f8f9145f7e34</uuid>
 <forward mode='nat'/>
 <bridge name='virbr0' zone='trusted' stp='on' delay='0'/>
 <mac address='52:54:00:95:95:84'/>
 <ip address='192.168.122.1' netmask='255.255.255.0'>
 <tftp root='/var/lib/tftpboot'/>
   <dhcp>
     <range start='192.168.100.128' end='192.168.100.254' />
     <bootp file='pxelinux.0'/>
   </dhcp>
 </ip>
 <dnsmasq:options>
   <dnsmasq:option value='dhcp-vendorclass=set:efi-http,HTTPClient:Arch:00016'/>
   <dnsmasq:option value='dhcp-option-force=tag:efi-http,60,HTTPClient'/>
   <dnsmasq:option value='dhcp-boot=tag:efi-http,&quot;http://192.168.122.1/rhel8/EFI/BOOT/BOOTX64.EFI&quot;'/>
 </dnsmasq:options>
</network>

Con la configuración de red establecida, un simple sudo virsh net-destroy default && sudo virsh net-start default cargará la nueva configuración. A continuación, necesita un servidor web. Estoy ejecutando httpd en mi sistema Como puede ver, se define en el ejemplo anterior como 192.168.122.1. Uno de los principales beneficios de esta configuración es que el extremo web puede estar en cualquier lugar, así que use lo que tenga sentido para su entorno. Por razones que no entiendo, Silverblue incluye httpd; todo lo que necesitaba hacer en mi sistema era ejecutar systemctl start httpd .

Configuración del menú de inicio

Como estoy trabajando con Red Hat Enterprise Linux (RHEL) 8.4 Beta, todo lo que se necesita es descargar el mínimo boot.iso , móntelo y copie el contenido en /var/www/html/rhel8/ . No monte la ISO directamente en esta ubicación, ya que debe modificar la configuración de GRUB y escribir el archivo. A continuación, debe modificar el kernel y initrd rutas en la configuración predeterminada de GRUB que se encuentra en /var/www/html/rhel8/EFI/BOOT/grub.cfg ya que las rutas relativas no funcionarán. Para mi configuración, es necesario agregar /rhel8 en cada línea. Pase cualquier otra opción necesaria y listo.

menuentry 'Install Red Hat Enterprise Linux 8.4' --class fedora --class gnu-linux --class gnu --class os {
     linuxefi /rhel8/images/pxeboot/vmlinuz inst.stage2=http://192.168.122.1/rhel8 inst.ks=http://192.168.122.1/ks/84.ks quiet
     initrdefi /rhel8/images/pxeboot/initrd.img
}

Hora de arrancar

Ahora está listo para crear y arrancar una VM, lo que lleva a la parte molesta. De forma predeterminada, un arranque de red con OVMF intentará un IPv4 PXE -> IPv6 PXE -> IPv4 HTTP -> IPv6 HTTP en ese orden. Lleva mucho tiempo dejar que fallen, por lo que querrá interrumpir el proceso de arranque estándar presionando rápidamente el botón Escape. repetidamente una vez que aparezca la consola de VM para seleccionar IPv4 HTTP manualmente. En el screencast vinculado a continuación, estoy presionando Escape tecla rápidamente para seleccionar la opción correcta. Esto es menos que ideal, y estoy seguro de que hay una mejor manera de configurar el firmware para deshabilitar las opciones heredadas. Por favor, hágame saber si sabe cómo hacer esto.

sudo virt-install \
  --name=8.4-uefi-httpboot \
  --ram=2048 \
  --vcpus=1 \
  --os-type=linux \
  --os-variant=rhel8.4 \
  --graphics=vnc \
  --pxe \
  --disk=path=/var/home/bbreard/data/distros/uefi.qcow2 \
  --check path_in_use=off \
  --network=network=default,model=virtio \
  --boot=uefi

[ Curso gratuito:Resumen técnico de Red Hat Satellite. ] 

Resumir

Si vas a mi sitio, puedes ver un screencast del proceso. Es rápido y sencillo. Y, eso es todo lo que hay que hacer. Espero que te unas a mí en un mundo libre de las limitaciones de TFTP.

Referencias:

  • Habilitación del complemento HTTPBoot para Foreman 1.20
  • UEFI_HTTPBoot_Server_Setup
  • Arranque HTTP UEFI con Libvirt
  • Arranque EFI HTTP con dnsmasq
  • página man de dnsmasq

Linux
  1. Configuración de un servidor FTP con vsFTPd en Raspberry Pi

  2. Arranque de red (pxe) desde Bios/efi?

  3. ¿Arranque no gráfico con Systemd?

  4. ¿Instalar Ubuntu en USB y arrancar desde Destop con Uefi?

  5. ¿Configuración de Xhost en el arranque?

Autenticación HTTP básica con Nginx

Cómo configurar el arranque PXE para hardware UEFI

Configuración de un clúster de Linux con Keepalived:configuración básica

Arranque PXE con hardware UEFI continuación

Cómo deshabilitar el arranque seguro UEFI en Windows 10

Cómo habilitar HTTP/2 con Apache en Ubuntu