測試環境為 Red Hat Enterprise Linux Server release 6.0 (Santiago) + dhcp-4.1.1-12.P1.el6.x86_64
什麼是 uEFI!! 什麼是 PXE!!
- uEFI
Extensible Firmware Interface (EFI) 的功能就類似傳統 BIOS ,他是 OS 與硬體之間溝通介面. 不過相較於傳統的 BIOS EFI 他的架構更模組化,功能更強大.EFI 的架構是由 Intel 提出的, 目前是交由 Unified EFI Forum 來管理.也就是我們現在所稱的 Unified Extensible Firmware Interface (UEFI) - PXE
PXE (Preboot eXecution Environment) 是透過網路來安裝作業系統,在網卡上有一塊 ROM(firmware) 裡面存放了一些基本的網路協定如:Internet Protocol (IP), User Datagram Protocol (UDP), Dynamic Host Configuration Protocol (DHCP) 以及 Trivial File Transfer Protocol (TFTP) 透過這一些協定使得 PXE 可以進行網路的存取進一步安裝作業系統.
建議先設定好你的 Legacy PXE 環境再來升級到 uEFI 的環境
- Legacy PXE Boot – https://benjr.tw/83
- RHEL6 EFI PXE Boot – https://benjr.tw/16115
- SLES11 EFI PXE Boot – https://benjr.tw/16182
那 Legacy PXE 和 EFI PXE Boot 有可能處於同一台機器上嗎?在 Fedora 的官方網站有點出 PXEBoot (EFI + Legacy) 多種選擇的 https://fedoraproject.org/wiki/QA:Testcase_UEFI_pxeboot 的開機方式, 主要是 DHCP 的設定檔不同而已.
IPv4
[root@gulf linux-install]# cat /etc/dhcp/dhcpd.conf #ddns-update-style interim; ddns-update-style none; ignore client-updates; allow booting; allow bootp; option space PXE; option PXE.mtftp-ip code 1 = ip-address; option PXE.mtftp-cport code 2 = unsigned integer 16; option PXE.mtftp-sport code 3 = unsigned integer 16; option PXE.mtftp-tmout code 4 = unsigned integer 8; option PXE.mtftp-delay code 5 = unsigned integer 8; option arch code 93 = unsigned integer 16; subnet 192.8.1.0 netmask 255.255.255.0 { range 192.8.1.50 192.8.1.250; option broadcast-address 192.8.1.255; option subnet-mask 255.255.255.0; option domain-name-servers 192.8.1.1; class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; next-server 192.8.1.1; if option arch = 00:07 { filename "linux-install/BOOTX64.efi"; } else if option arch = 00:06 { filename "linux-install/bootia32.efi"; } else { filename "linux-install/pxelinux.0"; } } }
DHCP 可支援的 Architecture Type 如下,詳細請參考 – https://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.txt .
- 0x00:0x00 – x86 BIOS
- 0x00:0x01 – NEC/PC98
- 0x00:0x02 – Itanium
- 0x00:0x03 – DEC Alpha
- 0x00:0x04 – Arc x86
- 0x00:0x05 – Intel Lean Client
- 0x00:0x06 – x86 UEFI
- 0x00:0x07 – x64 UEFI
- 0x00:0x08 – EFI Xscale
- 0x00:0x09 – EBC
- 0x00:0x0a – ARM 32-bit UEFI
- 0x00:0x0b – ARM 64-bit UEFI
- 0x00:0x0c – PowerPC Open Firmware
- 0x00:0x0d – PowerPC ePAPR
- 0x00:0x0e – POWER OPAL v3
- 0x00:0x0f – x86 uefi boot from http
- 0x00:0x10 – x64 uefi boot from http
- 0x00:0x11 – ebc boot from http
- 0x00:0x12 – arm uefi 32 boot from http
- 0x00:0x13 – arm uefi 64 boot from http
- 0x00:0x14 – pc/at bios boot from http
- 0x00:0x15 – arm 32 uboot
- 0x00:0x16 – arm 64 uboot
- 0x00:0x17 – arm uboot 32 boot from http
- 0x00:0x18 – arm uboot 64 boot from http
- 0x00:0x19 – RISC-V 32-bit UEFI
- 0x00:0x1a – RISC-V 32-bit UEFI boot from http
- 0x00:0x1b – RISC-V 64-bit UEFI
- 0x00:0x1c – RISC-V 64-bit UEFI boot from http
- 0x00:0x1d – RISC-V 128-bit UEFI
- 0x00:0x1e – RISC-V 128-bit UEFI boot from http
- 0x00:0x1f – s390 Basic
- 0x00:0x20 – s390 Extended
我還沒有實際試過.最近給他試了一下,的確是可行的.重點如下:
if option arch = 00:07 { filename "linux-install/BOOTX64.efi"; } else if option arch = 00:06 { filename "linux-install/bootia32.efi"; } else { filename "linux-install/pxelinux.0"; }
主要是用 if else 的判斷句,決定開機是要用 UEFI 的 BOOTX64.efi , bootia32.efi 還是 Legacy 的 pxelinx.0
IPv6
ipv6 一樣可以使用 Architecture Type 的設定.
[root@localhost ~]# cat /etc/dhcp/dhcpd6.conf default-lease-time 600; max-lease-time 7200; log-facility local7; option dhcp6.vendor-class code 16 = {integer 32, integer 16, string}; subnet6 3ffe:501:ffff:100::1/64 { range6 3ffe:501:ffff:100::100 3ffe:501:ffff:100::200 if option dhcp6.arch-type = 00:010 { option dhcp6.vendor-class 0 0 “HTTPClient”; option dhcp6.bootfile-url “http://3ffe:501:ffff:100::1/EFI/Shell.efi”; } else { option dhcp6.bootfile-url “http://3ffe:501:ffff:100::1/EFI/grub64.efi”; } }
需注意如果 isc-dhcp 版本為 4.4 參數 dhcp6.arch-type 需改成 dhcp6.client-arch-type .
遇過的問題
作業系統為 CentOS 8 ISC DHCP v4.4
無法啟動 dhcpd6 服務,透過 # journalctl -xe 顯示以下的錯誤訊息.
no option named arch-type in space dhcp6
檢視官方文件 https://kb.isc.org/docs/isc-dhcp-44-manual-pages-dhcp-options#standard-dhcpv6-options 說明 dhcp6.arch-type 參數需改成 dhcp6.client-arch-type .
Legacy PXE boot 是讓本機,以包在NIC 的 boot ROM裡的UNDI,或BIOS裡LOM的 UNDI driver (低階語言寫成的LAN driver) 來做 NIC或LOM的初始設定工作。而且執行的PXE Base code也是包在NIC 的 boot ROM裡的、或是BIOS裡LOM binary裡的。這是因應從前各NIC廠商各有各的 LAN driver 功能與PXE動作的產物,又不得不使用uEFI BIOS的妥協辦法。BIOS的本機控制看似一致了,但是網路功能能如舊時代各行其是。
Native EFI 才是使用包在BIOS裡的 LAN driver 和 Tiano或uEFI裡標準的 PXE base code來執行 PXE preboot 工作。BIOS的本機控制與網路行為表現都一致了,而且在uEFI shell執行網路相關 uEFI comand 命令,就像在Linux shell 或 Window CMD 裡一樣有很高的 一致性。