Sono stato un grande sostenitore del provisioning basato su rete praticamente per tutta la mia carriera. Il mio secondo lavoro dopo il college riguardava l'imaging di circa 800 computer più volte alla settimana. Quando sono stato assunto, i miei predecessori usavano i floppy disk per caricare un piccolo sistema operativo (OS), il driver della scheda di interfaccia di rete (NIC) corrispondente e il client di imaging (ricordate Ghost?). La conclusione era che era molto tempo/manodopera e un processo orribile. L'imaging di un gruppo di sistemi ha richiesto circa 30-60 minuti. Per farla breve, abbiamo ridotto il tempo a circa cinque minuti dopo aver sfruttato una combinazione di PXE, Wake-on-LAN, driver UNDI (Universal Network Device Interface), LAN virtuali (VLAN) e snooping IGMP. La mia seconda iterazione della soluzione ha portato il tempo totale di attesa a meno di 30 secondi. È una tecnologia straordinaria per il provisioning e sono stato persino assunto da Red Hat tenendo una presentazione sull'ambiente di esecuzione di preavvio (PXE). Inutile dire che sono un grande fan.
[ Potrebbe interessarti anche: Creare un sistema desktop Linux multi-boot ]
Ad ogni modo, il problema qui è che PXE risale agli anni '90 ed è piuttosto limitato dalla sua dipendenza da tecnologie come il protocollo di trasferimento file banale (TFTP). Intel ha minacciato di deprecare PXE ormai da anni e finalmente lo stanno facendo. Anche se PXE è oggi pervasivo, è probabile che nei prossimi 2-10 anni, l'avvio HTTP UEFI diventerà l'impostazione predefinita per la maggior parte degli ambienti. Altri vantaggi e dettagli tecnici sono descritti qui. Il TL; DR è PXE che si basa su DHCP e TFTP e l'avvio HTTP UEFI (Unified Extensible Firmware Interface) richiede DHCP e HTTP. Suona facile? Questo perché lo è. Potresti anche dire che è banale come ottengono i protocolli di trasferimento file. Siamo spiacenti, è piuttosto difficile trovare umorismo durante l'avvio della rete.
Passaggio da PXE all'avvio HTTP
La migliore documentazione che posso trovare attualmente su questo argomento è riportata di seguito nella sezione Riferimenti. In sostanza, la necessità di TFTP viene eliminata. Successivamente, modifica le opzioni DHCP per recuperare l'NBP da un endpoint HTTP/HTTPS. Uso GRUB come NBP in questo articolo. Ambienti che utilizzano dhcpd
può semplicemente inserire la configurazione che forniscono e tutto dovrebbe funzionare semplicemente supponendo che tu modifichi il filename
per puntare al NBP corretto per il tuo ambiente:
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";
}
Questo esempio è interessante in quanto consente l'avvio anche dei sistemi UEFI con una ROM PXE legacy.
Applicalo a libvirt
Inizialmente avevo pianificato di configurarlo sulla mia rete domestica, ma pfSense non lo supporta ancora, né consente il dhcpd
configurazione da modificare direttamente. Ho aperto un problema e, si spera, questo verrà aggiunto in futuro. La prossima opzione più semplice che ho per il test è usare libvirt e macchine virtuali (VM) con il firmware UEFI Open Virtual Machine Firmware (OVMF) (Tianocore). Inoltre, libvirt funziona alla grande per creare un ambiente autonomo per sperimentare tecnologie come questa ed è semplicissimo da replicare. Tutto quello che devi fare è fornire le opzioni DHCP corrette.
La rete libvirt predefinita avrà un aspetto simile a questo:
<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>
L'abilitazione di PXE legacy è ben documentata, ma includo qui le modifiche nel caso in cui sia utile per chiunque legga. Devi definire le opzioni DHCP del server successivo e del nome file.
<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>
Sfortunatamente, lo schema libvirt non supporta molte opzioni di configurazione disponibili per dnsmasq. Fortunatamente, le versioni recenti di libvirt supportano uno spazio dei nomi XML che aggiungerà le opzioni direttamente alla fine del file di configurazione generato. Questa email mostra l'unica configurazione dnsmasq funzionante che sono riuscito a trovare, poiché l'avvio HTTP non è ben documentato per il progetto. Per ora, lascio al loro posto le informazioni TFTP in modo che le macchine virtuali che utilizzano il BIOS possano continuare a eseguire installazioni di rete.
Nota :non ignorare la prima riga di questo esempio.
<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,"http://192.168.122.1/rhel8/EFI/BOOT/BOOTX64.EFI"'/>
</dnsmasq:options>
</network>
Con le impostazioni di rete in atto, un semplice sudo virsh net-destroy default && sudo virsh net-start default
caricherà la nuova configurazione. Successivamente, hai bisogno di un server web. Sto eseguendo httpd
sul mio sistema. Come puoi vedere, è definito nell'esempio sopra come 192.168.122.1. Uno dei principali vantaggi di questa configurazione è che l'endpoint Web può essere ovunque, quindi utilizza tutto ciò che ha senso per il tuo ambiente. Per ragioni che non capisco, Silverblue include httpd
; tutto ciò che dovevo fare sul mio sistema era eseguire systemctl start httpd
.
Configurazione del menu di avvio
Dato che sto lavorando con Red Hat Enterprise Linux (RHEL) 8.4 Beta, tutto ciò che è necessario è scaricare il minimo boot.iso
, montalo e copia il contenuto in /var/www/html/rhel8/
. Non montare l'ISO direttamente in questa posizione poiché devi modificare la configurazione di GRUB e scrivere il file. Successivamente, devi modificare il kernel e initrd
percorsi nella configurazione predefinita di GRUB trovata in /var/www/html/rhel8/EFI/BOOT/grub.cfg
poiché i percorsi relativi non funzioneranno. Per la mia configurazione, è necessario aggiungere /rhel8
su ogni riga. Passa qualsiasi altra opzione necessaria e sei a posto.
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
}
È ora di avviare
Ora sei pronto per creare e avviare una VM, il che porta alla parte fastidiosa. Per impostazione predefinita, un avvio di rete con OVMF tenterà un IPv4 PXE -> IPv6 PXE -> IPv4 HTTP -> IPv6 HTTP in questo ordine. Ci vuole molto tempo prima che falliscano, quindi ti consigliamo di interrompere il processo di avvio standard premendo rapidamente il pulsante Esc premere ripetutamente una volta che la console della macchina virtuale viene visualizzata per selezionare manualmente l'HTTP IPv4. Nello screencast collegato di seguito, premo il pulsante Esc premere rapidamente per selezionare l'opzione corretta. Questo non è l'ideale e sono sicuro che esiste un modo migliore per configurare il firmware per disabilitare le opzioni legacy. Per favore, fammi sapere se sai come farlo.
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
[ Corso gratuito:Panoramica tecnica di Red Hat Satellite. ]
Concludi
Se vai sul mio sito, puoi guardare uno screencast del processo. È veloce e semplice. E questo è tutto quello che c'è da fare. Spero che ti unirai a me in un mondo libero dai limiti di TFTP.
Riferimenti:
- Abilitazione del plug-in HTTPBoot per Foreman 1.20
- UEFI_HTTPBoot_Server_Setup
- Avvio HTTP UEFI con Libvirt
- Avvio HTTP EFI con dnsmasq
- Pagina man di dnsmasq