GNU/Linux >> LINUX-Kenntnisse >  >> Linux

UEFI-HTTP-Boot mit libvirt einrichten

Ich war fast während meiner gesamten Karriere ein großer Befürworter der netzwerkbasierten Bereitstellung. Mein zweiter Job nach dem College bestand darin, mehrmals pro Woche ca. 800 Computer zu scannen. Als ich eingestellt wurde, benutzten meine Vorgänger Disketten, um ein kleines Betriebssystem (OS), den passenden Treiber für die Netzwerkkarte (NIC) und den Imaging-Client (erinnern Sie sich an Ghost?) zu laden. Unter dem Strich war es sehr zeit-/arbeitsintensiv und ein schrecklicher Prozess. Das Abbilden einer Gruppe von Systemen dauerte etwa 30-60 Minuten. Um es kurz zu machen, wir haben diese Zeit auf etwa fünf Minuten reduziert, nachdem wir eine Kombination aus PXE, Wake-on-LAN, Universal Network Device Interface (UNDI)-Treibern, virtuellen LANs (VLANs) und IGMP-Snooping genutzt haben. Meine zweite Iteration der Lösung verkürzte die Gesamtzeit auf weniger als 30 Sekunden. Es ist eine erstaunliche Bereitstellungstechnologie und ich wurde sogar bei Red Hat eingestellt, indem ich eine Präsentation über die Preboot-Ausführungsumgebung (PXE) hielt. Unnötig zu erwähnen, dass ich ein großer Fan bin.

[Das könnte Ihnen auch gefallen: Erstellen eines Multiboot-Linux-Desktopsystems]

Wie auch immer, das Problem hier ist, dass PXE aus den 90er Jahren stammt und durch seine Abhängigkeit von Technologien wie dem Trivial File Transfer Protocol (TFTP) ziemlich eingeschränkt ist. Intel droht seit Jahren damit, PXE abzulehnen, und sie tun es endlich. Auch wenn PXE heute allgegenwärtig ist, ist es wahrscheinlich, dass UEFI-HTTP-Boot in den nächsten 2 bis 10 Jahren zum Standard für die meisten Umgebungen werden wird. Weitere Vorteile und technische Details finden Sie hier. Das TL;DR ist PXE, das auf DHCP und TFTP basiert, und der HTTP-Start der Unified Extensible Firmware Interface (UEFI) erfordert DHCP und HTTP. Klingt einfach? Das ist, weil es ist. Man könnte sogar sagen, es ist so trivial wie File Transfer Protocols. Tut mir leid – Humor zum Hochfahren des Netzwerks ist ziemlich schwer zu bekommen.

Wechsel von PXE zu HTTP-Boot

Die beste Dokumentation, die ich derzeit zu diesem Thema finden kann, ist unten im Abschnitt "Referenzen" aufgeführt. Im Wesentlichen entfällt die Notwendigkeit von TFTP. Bearbeiten Sie als Nächstes die DHCP-Optionen, um den NBP von einem HTTP/HTTPS-Endpunkt abzurufen. Ich verwende in diesem Artikel GRUB als NBP. Umgebungen, die dhcpd verwenden können einfach die von ihnen bereitgestellte Konfiguration einfügen, und alles sollte funktionieren, vorausgesetzt, Sie ändern den filename um auf den richtigen NBP für Ihre Umgebung zu verweisen:

  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";
   }

Dieses Beispiel ist nett, da es auch UEFI-Systemen mit einem Legacy-PXE-ROM das Booten ermöglicht.

Wenden Sie dies auf libvirt an

Ich hatte ursprünglich geplant, dies in meinem Heimnetzwerk einzurichten, aber pfSense unterstützt dies noch nicht und erlaubt auch nicht den dhcpd Konfiguration direkt geändert werden. Ich habe ein Thema eröffnet und hoffe, dass dies in Zukunft hinzugefügt wird. Die nächsteinfachste Option, die ich zum Testen habe, ist die Verwendung von libvirt und virtuellen Maschinen (VMs) mit der Open Virtual Machine Firmware (OVMF) (Tianocore) UEFI-Firmware. Außerdem eignet sich libvirt hervorragend zum Erstellen einer in sich geschlossenen Umgebung zum Experimentieren mit Technologien wie dieser, und es ist super einfach zu replizieren. Sie müssen lediglich die richtigen DHCP-Optionen angeben.

Das standardmäßige libvirt-Netzwerk sieht in etwa so aus:

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

Das Aktivieren von Legacy-PXE ist gut dokumentiert, aber ich füge die Änderungen hier hinzu, falls es für jemanden hilfreich ist, der liest. Sie müssen die DHCP-Optionen für den nächsten Server und den Dateinamen definieren.

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

Leider unterstützt das libvirt-Schema nicht viele verfügbare Konfigurationsoptionen für dnsmasq. Glücklicherweise unterstützen neuere Versionen von libvirt einen XML-Namespace, der Optionen direkt an das Ende der generierten Konfigurationsdatei anhängt. Diese E-Mail zeigt die einzige funktionierende dnsmasq-Konfiguration, die ich finden konnte, da der HTTP-Start für das Projekt nicht gut dokumentiert ist. Im Moment belasse ich die TFTP-Informationen an Ort und Stelle, damit VMs, die das BIOS verwenden, weiterhin Netzwerkinstallationen durchführen können.

Hinweis :Ignorieren Sie nicht die erste Zeile dieses Beispiels.

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

Wenn die Netzwerkeinstellungen vorhanden sind, ein einfaches sudo virsh net-destroy default && sudo virsh net-start default lädt die neue Konfiguration. Als Nächstes benötigen Sie einen Webserver. Ich verwende httpd auf meinem System. Wie Sie sehen können, ist es im obigen Beispiel als 192.168.122.1 definiert. Einer der Hauptvorteile dieses Setups ist, dass der Web-Endpunkt überall sein kann, also verwenden Sie bitte alles, was für Ihre Umgebung sinnvoll ist. Aus Gründen, die ich nicht verstehe, enthält Silverblue httpd; Alles, was ich auf meinem System tun musste, war systemctl start httpd auszuführen .

Einrichten des Boot-Menüs

Da ich mit Red Hat Enterprise Linux (RHEL) 8.4 Beta arbeite, muss lediglich die minimale boot.iso heruntergeladen werden , mounten Sie es und kopieren Sie den Inhalt nach /var/www/html/rhel8/ . Stellen Sie das ISO nicht direkt an diesem Speicherort bereit, da Sie die GRUB-Konfiguration ändern und die Datei schreiben müssen. Als Nächstes müssen Sie den Kernel und initrd anpassen Pfade in der GRUB-Standardkonfiguration unter /var/www/html/rhel8/EFI/BOOT/grub.cfg da relative Pfade nicht funktionieren. Für mein Setup muss /rhel8 hinzugefügt werden auf jeder Zeile. Übergeben Sie jede andere erforderliche Option, und Sie können loslegen.

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
}

Startzeit

Jetzt können Sie eine VM erstellen und booten, was zum lästigen Teil führt. Standardmäßig versucht ein Netzwerkstart mit OVMF einen IPv4 PXE -> IPv6 PXE -> IPv4 HTTP -> IPv6 HTTP in dieser Reihenfolge. Es dauert lange, bis sie fehlschlagen, also sollten Sie den Standard-Boot-Vorgang unterbrechen, indem Sie schnell die Escape-Taste drücken Taste wiederholt, sobald die VM-Konsole erscheint, um das IPv4-HTTP manuell auszuwählen. In dem unten verlinkten Screencast drücke ich die Escape-Taste drücken, um die richtige Option auszuwählen. Dies ist alles andere als ideal, und ich bin sicher, dass es eine bessere Möglichkeit gibt, die Firmware so zu konfigurieren, dass die Legacy-Option(en) deaktiviert werden. Bitte teilen Sie mir mit, ob Sie wissen, wie das geht.

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

[ Kostenloser Kurs:Technischer Überblick über Red Hat Satellite. ] 

Abschluss

Wenn Sie auf meine Website gehen, können Sie sich einen Screencast des Prozesses ansehen. Es ist schnell und einfach. Und das ist alles, was dazu gehört. Ich hoffe, Sie begleiten mich in eine Welt, die frei von den Beschränkungen von TFTP ist.

Referenzen:

  • HTTPBoot-Plugin für Foreman 1.20 aktivieren
  • UEFI_HTTPBoot_Server_Setup
  • UEFI-HTTP-Boot mit Libvirt
  • EFI-HTTP-Boot mit dnsmasq
  • dnsmasq-Manpage

Linux
  1. FTP-Server mit vsFTPd auf dem Raspberry Pi einrichten

  2. Netzwerkstart (pxe) aus Bios/efi?

  3. Nicht-grafischer Boot mit Systemd?

  4. Ubuntu auf USB installieren und von Destop mit Uefi booten?

  5. Ist das Deaktivieren von Secure Boot für Ubuntu 14.04 Dual-Boot mit Windows 8 Uefi erforderlich?

Einfache HTTP-Authentifizierung mit Nginx

So richten Sie den PXE-Start für UEFI-Hardware ein

Einrichten eines Linux-Clusters mit Keepalived:Basiskonfiguration

PXE-Booten mit UEFI-Hardware fortgesetzt

So deaktivieren Sie UEFI Secure Boot in Windows 10

So aktivieren Sie HTTP/2 mit Apache in Ubuntu