Configuración del arranque HTTP UEFI con libvirt

He sido un gran partidario de Network Based Procurement la mayor parte de mi carrera. Mi segundo trabajo al salir de la universidad consistía en generar imágenes de alrededor de 800 ordenadores varias veces a la semana. Cuando me contrataron, mis predecesores usaban disquetes para cargar un pequeño sistema operativo (SO), 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 trabajo y mucho tiempo y un proceso horrible. La generación de imágenes de un grupo de sistemas tomó aproximadamente de 30 a 60 minutos. En resumen, redujimos este tiempo a unos cinco minutos después de usar una combinación de PXEWake-on-LAN, controladores de interfaz de dispositivo de red universal (UNDI), redes de área local virtual (VLAN) e indagación IGMP. Mi segunda iteración de la solución llevó el tiempo de respuesta total 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 fan.

De cualquier manera, 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 degradar PXE durante años, y finalmente lo están haciendo. Aunque PXE es omnipresente hoy en día, 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. Se describen otras ventajas y detalles técnicos. aquí. el TL; DR es PXE que se basa en DHCP y TFTP, y el arranque HTTP de la interfaz de firmware extensible unificada (UEFI) requiere DHCP y HTTP. ¿Te suena fácil? Es porque lo es. Incluso podría decir que es tan trivial como pueden ser los protocolos de transferencia de archivos. Lo sentimos, el humor de inicio de red es bastante difícil de encontrar.

Índice

    Cambiar de arranque PXE a arranque 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. Luego, cambie las opciones de DHCP para recuperar el NBP desde un punto final HTTP/HTTPS. Estoy usando GRUB como NBP en este artículo. Entornos que utilizan dhcpd puede simplemente agregar la configuración que proporcionan, y todo debería funcionar suponiendo que cambie 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 interesante porque también permite que arranquen los sistemas UEFI con ROM PXE heredada.

    Aplicar esto a libvirt

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

    La red libvirt predeterminada se verá así:

    <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 Legacy PXE está bien documentado, pero incluyo los cambios aquí en caso de que sea útil para cualquiera que lea. Debe establecer las opciones de 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 de las 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 indica la única configuración funcional de dnsmasq que pude encontrar, ya que el inicio de 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 realizando instalaciones de red.

    Notar: 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>

    Una vez que la configuración de la red esté en su lugar, un simple sudo virsh net-destroy default && sudo virsh net-start default cargará la nueva configuración. Entonces necesitas un servidor web. Estoy corriendo httpd en mi sistema Como puede ver, se define en el ejemplo anterior como 192.168.122.1. Una de las principales ventajas de esta configuración es que el extremo web puede estar en cualquier lugar, así que use lo que funcione para su entorno. Por razones que no entiendo, Azul plateado comprender httpd; todo lo que tenía que hacer en mi sistema era ejecutar systemctl start httpd.

    Configuración del menú de inicio

    Como estoy trabajando con la versión beta de Red Hat Enterprise Linux (RHEL) 8.4, simplemente descargue el archivo mínimo boot.isomontarlo y copiar el contenido a /var/www/html/rhel8/. No monte la ISO directamente en esta ubicación, ya que deberá modificar la configuración de GRUB y escribir el archivo. Entonces necesitas 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 porque las rutas relativas no funcionarán. Para mi configuración, es necesario agregar /rhel8 en cada línea. Omita cualquier otra opción necesaria y estará listo para comenzar.

    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
    }

    Es hora de empezar

    Ahora está listo para crear e iniciar una máquina virtual, lo que lleva a la parte aburrida. De forma predeterminada, un arranque de red con OVMF intentará una IPv4 PXE -> IPv6 PXE -> IPv4 HTTP -> IPv6 HTTP en este orden. Lleva mucho tiempo dejar que fallen, por lo que querrá interrumpir el proceso de arranque estándar presionando rápidamente el botón. Escapar repetidamente después de que se muestre la consola de la VM para seleccionar manualmente HTTP IPv4. En el screencast vinculado a continuación, presioné el botón Escapar rápidamente para seleccionar la opción correcta. Esto está lejos de ser ideal, y estoy seguro de que hay una mejor manera de configurar el firmware para deshabilitar las opciones heredadas. Por favor, avíseme 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

    Conclusión

    Si vas a mi sitio puedes ver un captura de pantalla del proceso Es rápido y fácil. Y eso es todo lo que hay que hacer. Espero que se una a mí en un mundo libre de las limitaciones de TFTP.

    Las referencias:

    Artículos de interés

    Subir