什麼是 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 可以進行網路資料的存取.
DHCP 我通常使用 isc-dhcp 跟 tftp-server ,有同事建議可以使用 dnsmasq (提供 DNS , DHCP , TFTP ) 就可以全部搞定.
第一步 PXE Client 需要從 DHCP 得到 IP 與開機檔案,ISC DHCP (Ipv4 , IPv6 ) 會依據不同平台提供不同檔案給 PXE Client ,下面是有支援的 Architecture Type ,詳細請參考 – https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml#processor-architecture
IPv4 範例:
[root@localhost ~]# cat /etc/dhcp/dhcpd.conf #ddns-update-style interim; ddns-update-style none; ignore client-updates; authoritative; 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.6.1.0 netmask 255.255.255.0 { range 192.6.1.30 192.6.1.250; option routers 192.6.1.254; option subnet-mask 255.255.255.0; if option arch = 00:07 { next-server 192.6.1.1; filename "grubx64.efi"; } else if option arch=00:00 { next-server 192.6.1.1; filename "pxelinux.0"; } }
IPv6 範例:
[root@localhost ~]# cat /etc/dhcp/dhcpd6.conf # # DHCPv6 Server Configuration file. # see /usr/share/doc/dhcp*/dhcpd6.conf.example # see dhcpd.conf(5) man page # default-lease-time 2592000; preferred-lifetime 604800; option dhcp-renewal-time 3600; option dhcp-rebinding-time 7200; #option dhcp6.name-servers 3ffe:501:ffff:100:200:ff:fe00:3f3e; #option dhcp6.bootfile-url code 59 = string; #option dhcp6.domain-search "sit.com"; option dhcp6.info-refresh-time 21600; dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases"; option dhcp6.vendor-class code 16={integer 32,integer 16,string}; subnet6 3ffe:501:6666:100::/64 { range6 3ffe:501:6666:100::10 3ffe:501:6666:100::299; range6 3ffe:501:6666:100:: temporary; prefix6 3ffe:501:6666:100:: 3ffe:501:6666:111:: /64; option dhcp6.name-servers 3ffe:501:6666:100::1; if option dhcp6.client-arch-type = 00:07 { option dhcp6.bootfile-url "tftp://[3ffe:501:ffff:100::1]/grubx64.efi"; } }
下面來看一下支援的 Boot .
- 0x00:0x00 – x86 BIOS
- Legacy PXE Boot – https://benjr.tw/83
- Legacy / EFI PXE Boot IPv4 & v6 – https://benjr.tw/102397
- Linux PXEBoot WinPE (WinXP) – https://benjr.tw/275
- Linux PXEBoot WinPE (windows ADK) – https://benjr.tw/917
- Windows WinPE RIS / WDS – https://benjr.tw/279 , WDS – https://benjr.tw/100848
- 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
Extensible Firmware Interface (EFI) 的功能就類似傳統 BIOS ,他是 OS 與硬體之間溝通介面. 不過相較於傳統的 BIOS EFI 他的架構更模組化,功能更強大.EFI 的架構是由 Intel 提出的, 目前是交由 Unified EFI Forum 來管理.也就是我們現在所稱的 Unified Extensible Firmware Interface (UEFI),建議先設定好你的 Legacy PXE 環境再來升級到 uEFI .
EFI OS
IA64 的 RHEL 是有支援 EFI PXE Boot 的功能,但是我們常用的 RHEL 3 / 4 / 5 – x86 / x64 的系統並不支援 EFI boot ,不過新版的 RHEL6 和 SLES11 SP1 x64 (目前都看到的只有 x64 的系統有支援 EFI, i386/x86 的光碟找不到支援 EFI 開機的檔案) 都將支援 EFI 開機.- RHEL6
要怎麼判斷 RHEL 作業系統是否支援 EFI Boot 的方式最直接的方式是直接看光碟中是否包含 EFI Boot image ,RHEL6 的光碟中就有一個資料夾為 /EFI/BOOT 這就是支援了 EFI Boot 的証明. - SLES11
要怎麼判斷 SLES 作業系統是否支援 EFI Boot 的方式最直接的方式是直接看光碟中是否包含 EFI Boot image ,SLES11 的光碟中就有一個資料夾為 /boot/x86_64 裡面有一個檔案 efi 這就是支援了 EFI Boot 的証明.
關於 uEFI PXE Boot 有一個很大的關鍵是使用對的 BOOTX64.efi (PE32+ executable EFI application) 與設定檔.
- RHEL6 EFI PXE Boot – https://benjr.tw/16115
- SLES11 EFI PXE Boot – https://benjr.tw/16182
- IPv6 UEFI PXE boot – https://benjr.tw/94956
- RHEL6
- 0x00:0x08 – EFI Xscale
- 0x00:0x09 – EBC
- 0x00:0x0a – ARM 32-bit UEFI
- 0x00:0x0b – ARM 64-bit UEFI
- ARM UEFI PXE Boot – https://benjr.tw/96963
- 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
- EDKII HTTP Boot – https://benjr.tw/97836
傳統的網卡 ROM 裡面存放了一些基本的網路協定如: Internet Protocol (IP), User Datagram Protocol (UDP), Dynamic Host Configuration Protocol (DHCP) 以及 Trivial File Transfer Protocol (TFTP) , EDK II 有支援從 HTTP Boot 開機的選項,同時支援 IPv4 與 IPv6 的環境.
- EDKII HTTP Boot – https://benjr.tw/97836
- 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
ISC DHCP 支援這麼多種 Architecture Type 是否可以整合在同一台 PXE 環境,只需透過 if else 的判斷句來決定是哪一種系統,請參考 EFI + Legacy PXE Boot 設定 – https://benjr.tw/16194
PXE 設定蠻麻煩的,這時候可以透過 Cobbler 軟體來協助完成 https://benjr.tw/97916
windows 2008 sp2 64bit/R2 也都支援 uEFI,Windows 的 WDS 也有支援 uEFI Boot.
支援列表中有 x64 的 Windows Server 2008 and Windows Vista Service Pack 1.
http://en.wikipedia.org/wiki/Extensible_Firmware_Interface
Microsoft introduced UEFI support for x64 Windows operating systems with Windows Server 2008 and Windows Vista Service Pack 1. Microsoft does not offer support for 32-bit UEFI since vendors did not have any interest in producing native 32-bit UEFI firmware because of the mainstream status of 64-bit computing.
一開始 RHEL x86 / x64 的系統並不支援 uEFI boot ,一直到目前的 RHEL5 都還是一樣不支援,不過新版的 RHEL6 和 SLES11 SP1 x86 / x64 都將支援 uEFI 開機,其實要看你的作業系統是否支援 uEFI Boot 的方式最直接的方式是直接看光碟中是否包含 uEFI Boot image 比如 RHEL6 的光碟中就有一個資料夾為 /EFI/BOOT 這就是支援了 uEFI Boot 的証明.