GNU/Linux >> Belajar Linux >  >> Linux

Menyiapkan boot HTTP UEFI dengan libvirt

Saya telah menjadi pendukung besar penyediaan berbasis jaringan hampir sepanjang karir saya. Pekerjaan kedua saya di luar perguruan tinggi melibatkan pencitraan ~ 800 komputer beberapa kali seminggu. Ketika saya dipekerjakan, pendahulu saya menggunakan floppy disk untuk memuat sistem operasi kecil (OS), driver kartu antarmuka jaringan (NIC), dan klien pencitraan (ingat Ghost?). Intinya adalah itu sangat padat waktu/tenaga dan proses yang mengerikan. Pencitraan sekelompok sistem membutuhkan waktu sekitar 30-60 menit. Singkat cerita, kami mengurangi waktu itu menjadi sekitar lima menit setelah memanfaatkan kombinasi driver PXE, Wake-on-LAN, Universal Network Device Interface (UNDI), virtual LAN (VLAN), dan pengintaian IGMP. Iterasi kedua saya dari solusi mengambil total waktu hadir menjadi kurang dari 30 detik. Ini adalah teknologi yang luar biasa untuk penyediaan dan saya bahkan dipekerjakan di Red Hat dengan memberikan presentasi tentang lingkungan eksekusi pra-boot (PXE). Tak perlu dikatakan, saya penggemar berat.

[ Anda mungkin juga menikmati: Membuat sistem desktop Linux multi-boot ]

Bagaimanapun, masalahnya di sini adalah PXE berasal dari tahun 90-an dan sangat dibatasi oleh ketergantungannya pada teknologi seperti protokol transfer file sepele (TFTP). Intel telah mengancam untuk tidak menggunakan PXE selama bertahun-tahun sekarang, dan mereka akhirnya melakukannya. Meskipun PXE tersebar luas saat ini, kemungkinan dalam 2-10 tahun ke depan, booting HTTP UEFI akan menjadi default untuk sebagian besar lingkungan. Manfaat lain dan detail teknis diuraikan di sini. TL;DR adalah PXE yang mengandalkan DHCP dan TFTP, dan boot HTTP Unified Extensible Firmware Interface (UEFI) membutuhkan DHCP dan HTTP. Terdengar mudah? Itu karena itu. Anda bahkan mungkin mengatakan itu sepele seperti yang didapat oleh Protokol Transfer File. Maaf— humor booting jaringan cukup sulit didapat.

Beralih dari boot PXE ke HTTP

Dokumentasi terbaik yang dapat saya temukan tentang topik ini saat ini diberikan di bawah di bagian Referensi. Pada dasarnya, kebutuhan akan TFTP dihilangkan. Selanjutnya, edit opsi DHCP untuk mengambil NBP dari endpoint HTTP/HTTPS. Saya menggunakan GRUB sebagai NBP dalam artikel ini. Lingkungan menggunakan dhcpd cukup memasukkan konfigurasi yang mereka sediakan, dan semuanya akan berfungsi dengan asumsi Anda mengubah filename untuk menunjuk ke NBP yang benar untuk lingkungan Anda:

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

Contoh ini bagus karena memungkinkan sistem UEFI dengan ROM PXE lama juga untuk boot.

Terapkan ini ke libvirt

Saya awalnya berencana untuk mengatur ini di jaringan rumah saya, tetapi pfSense belum mendukung ini, juga tidak mengizinkan dhcpd konfigurasi untuk dimodifikasi secara langsung. Saya telah membuka masalah, dan mudah-mudahan, ini akan ditambahkan di masa mendatang. Opsi paling sederhana berikutnya yang saya miliki untuk pengujian adalah menggunakan libvirt dan mesin virtual (VM) dengan firmware UEFI Open Virtual Machine Firmware (OVMF) (Tianocore). Selain itu, libvirt berfungsi dengan baik untuk menciptakan lingkungan mandiri untuk bereksperimen dengan teknologi seperti ini dan sangat mudah untuk ditiru. Yang perlu Anda lakukan adalah memberikan opsi DHCP yang benar.

Jaringan libvirt default akan terlihat seperti ini:

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

Mengaktifkan PXE lama didokumentasikan dengan baik, tetapi saya menyertakan perubahan di sini jika ini berguna bagi siapa pun yang membaca. Anda perlu menentukan opsi DHCP server dan nama file berikutnya.

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

Sayangnya, skema libvirt tidak mendukung banyak opsi konfigurasi yang tersedia untuk dnsmasq. Untungnya, versi terbaru libvirt mendukung namespace XML yang akan menambahkan opsi langsung ke bagian bawah file konfigurasi yang dihasilkan. Email ini menunjukkan satu-satunya konfigurasi dnsmasq yang berfungsi yang dapat saya temukan, karena boot HTTP tidak didokumentasikan dengan baik untuk proyek tersebut. Untuk saat ini, saya membiarkan informasi TFTP di tempatnya sehingga VM yang menggunakan BIOS dapat terus melakukan pemasangan jaringan.

Catatan :Jangan abaikan baris pertama dari contoh ini.

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

Dengan pengaturan jaringan di tempat, sudo virsh net-destroy default && sudo virsh net-start default akan memuat konfigurasi baru. Selanjutnya, Anda memerlukan server web. Saya menjalankan httpd pada sistem saya. Seperti yang Anda lihat, itu didefinisikan dalam contoh di atas sebagai 192.168.122.1. Salah satu manfaat utama dari pengaturan ini adalah titik akhir web dapat berada di mana saja, jadi silakan gunakan apa pun yang masuk akal untuk lingkungan Anda. Untuk alasan yang saya tidak mengerti, Silverblue menyertakan httpd; yang perlu saya lakukan di sistem saya adalah menjalankan systemctl start httpd .

Menyiapkan menu boot

Karena saya bekerja dengan Red Hat Enterprise Linux (RHEL) 8.4 Beta, yang diperlukan hanyalah mengunduh boot.iso minimal , pasang, dan salin isinya ke /var/www/html/rhel8/ . Jangan pasang ISO secara langsung di lokasi ini karena Anda perlu mengubah konfigurasi GRUB dan menulis file. Selanjutnya, Anda perlu mengubah kernel dan initrd jalur dalam konfigurasi GRUB default ditemukan di bawah /var/www/html/rhel8/EFI/BOOT/grub.cfg karena jalur relatif tidak akan berfungsi. Untuk pengaturan saya, perlu menambahkan /rhel8 pada setiap baris. Lewati opsi lain yang diperlukan, dan Anda siap melakukannya.

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
}

Waktunya untuk boot

Sekarang Anda siap untuk membuat dan mem-boot VM, yang mengarah ke bagian yang mengganggu. Secara default, boot jaringan dengan OVMF akan mencoba IPv4 PXE -> IPv6 PXE -> IPv4 HTTP -> IPv6 HTTP dalam urutan itu. Memerlukan waktu lama untuk membiarkannya gagal, jadi sebaiknya Anda mengganggu proses boot standar dengan menekan tombol Escape dengan cepat kunci berulang kali setelah konsol VM muncul untuk memilih HTTP IPv4 secara manual. Di screencast yang ditautkan di bawah, saya menekan tombol Escape tombol dengan cepat untuk memilih opsi yang benar. Ini kurang ideal, dan saya yakin ada cara yang lebih baik untuk mengonfigurasi firmware untuk menonaktifkan opsi lama. Beri tahu saya jika Anda tahu cara melakukannya.

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

[ Kursus gratis:Tinjauan Teknis Satelit Red Hat. ] 

Menutup

Jika Anda pergi ke situs saya, Anda dapat menonton screencast dari proses tersebut. Ini cepat dan sederhana. Dan, hanya itu yang ada. Saya harap Anda akan bergabung dengan saya di dunia yang bebas dari batasan TFTP.

Referensi:

  • Mengaktifkan plugin HTTPBoot untuk Foreman 1.20
  • UEFI_HTTPBoot_Server_Setup
  • Boot HTTP UEFI dengan Libvirt
  • Boot HTTP EFI dengan dnsmasq
  • halaman manual dnsmasq

Linux
  1. Bagaimana saya menggunakan Vagrant dengan libvirt

  2. Boot Jaringan (pxe) Dari Bios/efi?

  3. Menginstal Ubuntu Di Usb Dan Mem-boot Dari Destop Dengan UEFA?

  1. Apakah Menonaktifkan Boot Aman Diperlukan Untuk Ubuntu 14.04 Dual-boot Dengan Windows 8 Uefi?

  2. Pengaturan Xhost Saat Boot?

  3. Menyiapkan DRBD hanya dengan satu node

  1. Menyiapkan server FTP dengan vsFTPd di Raspberry Pi

  2. Boot Non-grafis Dengan Systemd?

  3. Bagaimana cara mengonversi disk linux saya dari MBR ke GPT dengan UEFI?