??最近,正在學(xué)習(xí) iPXE 的源代碼,于是開始各種 Google 查找 iPXE 的資料進(jìn)行學(xué)習(xí)。由于之前完全沒有接觸過 PXE,因此從基本概念開始一點(diǎn)點(diǎn)學(xué)習(xí),以下為學(xué)習(xí)中的一些總結(jié)。
??網(wǎng)絡(luò)啟動(dòng)一直都沒有一個(gè)事實(shí)標(biāo)準(zhǔn)。早在 1993 年,網(wǎng)卡就已經(jīng)在其擴(kuò)展卡上包含了啟動(dòng) ROM,每個(gè)擴(kuò)展卡都遵循自己的專有協(xié)議來加載和執(zhí)行引導(dǎo)程序。Jamie Honan 非正式發(fā)布的 “Net Boot Image Proposal” 是標(biāo)準(zhǔn)化的第一次努力,很快兩個(gè)開源項(xiàng)目 Etherboot(1995)和 Netboot(1996)提供了具有可插拔驅(qū)動(dòng)程序支持的通用 ROM 映像。
??與此同時(shí),英特爾從一個(gè)更商業(yè)的角度來研究無磁盤引導(dǎo):它應(yīng)該整合資源,使管理更容易。很快,他們發(fā)布了預(yù)啟動(dòng)執(zhí)行環(huán)境(PXE)規(guī)范,作為其 Wired for Management 的一部分。此后,PXE 逐漸成為了一種廣泛應(yīng)用的規(guī)范,并成為了計(jì)算機(jī)的標(biāo)配。
??PXE(Preboot eXecution Environment,預(yù)啟動(dòng)執(zhí)行環(huán)境)通常也被稱為 PXE Boot、Network Boot,最初是由 Intel 公司開發(fā)的一種技術(shù),該技術(shù)旨在提供了一種使用網(wǎng)絡(luò)接口(Network Interface)啟動(dòng)計(jì)算機(jī)的機(jī)制。
??原始的 PXE 規(guī)范是由 Intel 和 Systemsoft 于 1999 年 9 月 20 日公布 2.1 版本,至今沒有再更新過。后來,Intel 直接將 PXE 引入到統(tǒng)一可擴(kuò)展固件接口 (UEFI) 標(biāo)準(zhǔn)中,被稱為 PXE Boot。
??PXE 規(guī)范描述了一個(gè)標(biāo)準(zhǔn)化的 客戶端 ? 服務(wù)器 環(huán)境,通信過程使用的是 UDP/IP、DHCP、TFTP 等多個(gè)標(biāo)準(zhǔn)互聯(lián)網(wǎng)協(xié)議。在這個(gè)環(huán)境中,計(jì)算機(jī)啟動(dòng)時(shí)可以通過與服務(wù)器交互,來動(dòng)態(tài)獲取啟動(dòng)需要的資源,從而讓計(jì)算機(jī)的啟動(dòng)可以不依賴本地?cái)?shù)據(jù)存儲(chǔ)設(shè)備(如硬盤)。
??PXE 客戶端的實(shí)現(xiàn)方法就是在博文 Network 之十 BIOS + MBR、UEFI + GPT、GRUB、BOOTMGR、SYSLINUX 中介紹的 Option ROM 機(jī)制。PXE 客戶端(通常也稱為 PXE 固件)是網(wǎng)卡固件的一部分,被網(wǎng)卡廠商固化在了網(wǎng)卡的 ROM 中。
有些資料中說,也可以在 UEFI 固件中實(shí)現(xiàn) PXE,這個(gè)沒怎么見過
??PXE 固件提供了基本的通用網(wǎng)絡(luò)設(shè)備接口(UNDI)、極簡(jiǎn)的 UDP/IP 堆棧、預(yù)啟動(dòng)(DHCP)客戶端模塊和 TFTP 客戶端等功能模塊。這些功能模塊共同構(gòu)成了 PXE 應(yīng)用程序編程接口(API), 網(wǎng)絡(luò)引導(dǎo)程序(Network Bootstrap Program,NBP )在需要與 PXE 環(huán)境的服務(wù)器對(duì)等端提供的服務(wù)進(jìn)行交互時(shí)使用這些接口。
??PXE 客戶端固件與 BIOS 密切相關(guān),可以分為傳統(tǒng) PXE 客戶端 和 EFI PXE 客戶端。傳統(tǒng) PXE 客戶端與傳統(tǒng) BIOS 一起工作,工作在 16 位 8086 的實(shí)地址模式;EFI PXE 客戶端則是工作在 32 位或 64 位的保護(hù)地址模式下。
??PXE 服務(wù)端就是互聯(lián)網(wǎng)中標(biāo)準(zhǔn)的提供 DHCP、TFTP 等服務(wù)的服務(wù)器,可能是功能齊全的一臺(tái)服務(wù)器,也可能是互相獨(dú)立的提供不同服務(wù)的多臺(tái)服務(wù)器。其中,DHCP 服務(wù)端用于提供適當(dāng)?shù)目蛻舳司W(wǎng)絡(luò)參數(shù)及 TFTP 信息;TFTP 服務(wù)端提供引導(dǎo)鏡像文件的下載。由于服務(wù)端通常是功能強(qiáng)大的服務(wù)器,因此,其具有完整的協(xié)議棧及應(yīng)用功能。
??除此之外,PXE 還提出了 proxyDHCP 的概念,用在無法修改現(xiàn)有 DHCP 服務(wù)器的情況(即不允許在現(xiàn)有 DHCP 服務(wù)器上配置 PXE 的情況)。使用 proxyDHCP 就可以實(shí)現(xiàn)與已有 DHCP 服務(wù)器的網(wǎng)絡(luò)兼容。PXE 和 DHCP 可以由單獨(dú)的服務(wù)器提供,互不干擾。
??網(wǎng)絡(luò)引導(dǎo)程序(Network Bootstrap Program,NBP ) 是引導(dǎo)鏈過程中的第一個(gè)環(huán)節(jié),它們通常通過 TFTP 請(qǐng)求一小組補(bǔ)充文件,以便運(yùn)行一個(gè)極簡(jiǎn)的操作系統(tǒng)執(zhí)行器(例如,Windows PE 或基本的 Linux 內(nèi)核 + initrd)。
常見的 NBP:iPXE、PXELINUX
??小型操作系統(tǒng)執(zhí)行器加載自己的網(wǎng)絡(luò)驅(qū)動(dòng)程序和 TCP/IP 堆棧,然后進(jìn)一步完成安裝操作系統(tǒng)。此時(shí),引導(dǎo)或安裝完整操作系統(tǒng)所需的其余文件通常不是通過 TFTP 提供的,而是使用可靠的傳輸協(xié)議(如 HTTP、CIFS 或 NFS)提供的。
??HTTP Boot 是 UEFI 規(guī)范版本 2.5 中引入的另一個(gè)網(wǎng)絡(luò)引導(dǎo)方案,可用作 PXE 的高性能替代品。HTTP Boot 結(jié)合了動(dòng)態(tài)主機(jī)配置協(xié)議 (DHCP)、域名系統(tǒng) (DNS) 和超文本傳輸協(xié)議 (HTTP),以通過網(wǎng)絡(luò)提供系統(tǒng)部署和配置功能。
??HTTP Boot 的引入主要是解決安全問題。PXE 在設(shè)計(jì)時(shí)沒有考慮加密或身份驗(yàn)證機(jī)制,容易受到中間人攻擊,無法在本地網(wǎng)絡(luò)之外擴(kuò)展,并且存在與 TFTP 超時(shí)和 UDP 數(shù)據(jù)包丟失相關(guān)的可靠性問題。
??首先,確保網(wǎng)絡(luò)中必須具有已配置的動(dòng)態(tài)主機(jī)配置協(xié)議(DHCP)服務(wù)器和普通文件傳輸協(xié)議(TFTP)服務(wù)器,其次,通過 BIOS 或 UEFI 提供的自主選擇啟動(dòng)位置的選項(xiàng)選擇從網(wǎng)絡(luò)啟動(dòng)(如果支持 PXE,通常就會(huì)專門有一項(xiàng)是從網(wǎng)絡(luò)啟動(dòng))。
??傳統(tǒng)的 PXE 固件就是指的最初由 Intel 實(shí)現(xiàn)的 PXE 固件,運(yùn)行在 8086 實(shí)地址模式,主要指的是與傳統(tǒng) BIOS 一起工作的固件。它通常僅支持通過 TFTP 傳輸文件,現(xiàn)在,很多網(wǎng)卡中的固件還都是傳統(tǒng)的 PXE 固件。PXE 固件啟動(dòng)后會(huì)在屏幕上輸出 PXE + 版本
類似的字符串。
PXEClient:Arch:xxxxxUNDI:yyyzz
。用于告訴服務(wù)端,客戶機(jī)的具體架構(gòu)及引導(dǎo)方式(rfc4578)。
??iPXE 對(duì) PXE 功能進(jìn)行了擴(kuò)展,是先前的 PXE 實(shí)現(xiàn)的超集,支持更多協(xié)議。iPXE 固件主要針對(duì) UEFI 模式的引導(dǎo)。最為主要的是,iPXE 支持靈活的配置腳本。iPXE 固件啟動(dòng)后會(huì)在屏幕上輸出 iPXE + 版本
類似的字符串。
??第二個(gè)階段結(jié)束之后,NBP 就會(huì)加載獲得的配置腳本文件。配置腳本文件通常會(huì)提供一個(gè)菜單界面,可以選擇各種操作系統(tǒng)或者工具。選擇相應(yīng)菜單后才是真正請(qǐng)求操作系統(tǒng)文件。
??Windows 系統(tǒng)下有一些 All-In-One 的 PXE 服務(wù)端軟件,例如,Tiny PXE Server、Serva,只用這些工具,我們就無需再單獨(dú)安裝及配置 DHCP、TFTP 等服務(wù)端。
??Tiny PXE Server 是完全免費(fèi)的,它自帶了很多配置,且提供了更為完整的引導(dǎo)文件示例(根目錄下的 files 文件夾),直接啟動(dòng) pxesrv.exe
就可以使用了。它已經(jīng)預(yù)先配置好了一些在線安裝,啥也不用配置就可以安裝一個(gè)系統(tǒng)。
??當(dāng)然,pxesrv.exe
是個(gè)獨(dú)立的程序,使用它完全可以自己重新搭建一個(gè)服務(wù)端。接下來,我就使用它從頭搭建一下安裝 Ubuntu 22.04 LTS 的服務(wù)端。
D:/PXE/TinyPXE
),用于存放 PXE 服務(wù)端所需要的各種文件。各目錄及文件的來源及作用見下圖的說明即可。pxesrv.exe
,然后根據(jù)自己的實(shí)際環(huán)境進(jìn)行修改。注意,最后一定要在右鍵菜單中保存配置,然后關(guān)閉重新啟動(dòng)后配置才會(huì)生效(暫時(shí)不用選擇 Online,等后續(xù)配置完后在啟動(dòng)即可)。ipxe.pxe
并保存之后,Tiny PXE Server 就會(huì)自動(dòng)將 ipxe.pxe
所在的目錄作為引導(dǎo)的根目錄。如果選擇了頂部的 HTTPd
然后啟動(dòng)服務(wù)端之后,那么就可以直接在瀏覽器中使用 http://你的 IP 地址
訪問根目錄下的文件。ubuntu-22.04-desktop-amd64
),然后將我們的系統(tǒng) iso 文件內(nèi)容解壓到新建的目錄下。注意,每個(gè)子目錄下存放一個(gè)操作系統(tǒng),這樣可以允許我們選擇安裝不同的系統(tǒng)。menu.ipxe
純文本文件,然后編輯其中的內(nèi)容。注意,根據(jù)自己的情況稍作修改。#!ipxe #============== Set Variables =============== set menu-timeout 16000 set menu-default ubuntu-22.04-desktop-amd64 isset ${ip} || dhcp isset ${next-server} || set next-server 192.168.100.214 set boot-url http://${next-server} #============== Menu =============== :start menu iPXE Boot Menu item --gap -- -------------------------------- System Operation --------------------------- item ubuntu-22.04-desktop-amd64 Install Ubuntu Desktop 22.04 LTS item --gap -- -------------------------------- Advanced ----------------------------- item --key s shell [S] Drop to iPXE Shell item --key r reboot [R] Reboot the Computer item --key x exit [X] Exit iPXE and Continue BIOS Booting choose --timeout ${menu-timeout} --default ${menu-default} selected goto ${selected} #============ Main Menu Options ============= :ubuntu-22.04-desktop-amd64 set os_root os-images/ubuntu-22.04-desktop-amd64 kernel ${boot-url}/os-images/ubuntu-22.04-desktop-amd64/casper/vmlinuz initrd ${boot-url}/os-images/ubuntu-22.04-desktop-amd64/casper/initrd imgargs vmlinuz initrd=initrd boot=casper maybe-ubiquity netboot=nfs ip=dhcp nfsroot=${next-server}:/D/PXE/TinyPXE/iPXE/os-images/ubuntu-22.04-desktop-amd64 quiet splash --- boot :shell echo Type 'exit' to go back to the menu. shell goto start :reboot reboot :exit exit
windfsd.exe
將 iPXE 這個(gè)目錄共享。共享的原因是系統(tǒng)文件的獲取依賴于 NFS。在 TinyPXE 中單獨(dú)開啟一個(gè)命令行工具(cmd,不能用 Powershell),然后輸入 winnfsd.exe -id 0 0 D:\PXE\TinyPXE\iPXE
。注意,不要關(guān)閉命令行,關(guān)閉后將停止共享。??Serva 分專業(yè)版和社區(qū)版,社區(qū)版支持的功能很少(例如,不支持 UEFI),官網(wǎng)有很多應(yīng)用示例可以參考。使用 Serva 的好處就是,他會(huì)在自動(dòng)生成相關(guān)目錄文件。
D:/PXE/ServaPXE
),用于存放 PXE 服務(wù)端所需要的各種文件。各目錄及文件的來源及作用見下圖的說明即可。Serva64.exe
,然后進(jìn)行配置。配置后重啟,Serva 就會(huì)在我們指定的根目錄(Boot)下自動(dòng)生成各種目錄及文件。我們需要做的就是按照 Serva 的要求把系統(tǒng)放到指定的文件夾下。NWA_PXE
下新建一個(gè)目錄(我這里是 ubuntu-22.04-desktop-amd64
),然后將我們的系統(tǒng) iso 文件內(nèi)容解壓到新建的目錄下。注意,每個(gè)子目錄下存放一個(gè)操作系統(tǒng),這樣可以允許我們選擇安裝不同的系統(tǒng)。NWA_PXE/ubuntu-22.04-desktop-amd64
)新建一個(gè)名為 ServaAsset.inf
的純文本文件,然后添加以下內(nèi)容。注意,如果有多個(gè)系統(tǒng)目錄,每個(gè)都需要添加。[PXESERVA_MENU_ENTRY]
asset = Ubuntu 22.04 LTS
platform = amd64
kernel_bios = /NWA_PXE/$HEAD_DIR$/casper/vmlinuz
append_bios = showmounts toram root=/dev/cifs initrd=/NWA_PXE/$HEAD_DIR$/casper/initrd boot=casper netboot=cifs nfsroot=//$IP_BSRV$/NWA_PXE_SHARE/$HEAD_DIR$ NFSOPTS=-ouser=serva,pass=avres,sec=ntlmv2,vers=2.0,ro ip=dhcp ro ipv6.disable=1
kernel_efi64 = /NWA_PXE/$HEAD_DIR$/casper/vmlinuz
append_efi64 = showmounts toram root=/dev/cifs initrd=/NWA_PXE/$HEAD_DIR$/casper/initrd boot=casper netboot=cifs nfsroot=//$IP_BSRV$/NWA_PXE_SHARE/$HEAD_DIR$ NFSOPTS=-ouser=serva,pass=avres,sec=ntlm,vers=1.0,ro ip=dhcp ro ipv6.disable=1
NWA_PXE
。直接在 NWA_PXE
上右鍵,選擇 屬性->共享,將目錄共享即可。Serva64.exe
,此時(shí)服務(wù)端準(zhǔn)備好了,接下來就是啟動(dòng)客戶端了。??Linux(我使用的是 Ubuntu 22.04 LTS)下的配置需要手動(dòng)單獨(dú)安裝組件:DHCP SERVER、TFTP SERVER、HTTP SERVER、NFS SERVER、DNS SERVER(可選)。以下就簡(jiǎn)單介紹每個(gè)服務(wù)端的安裝及配置。同時(shí),注意以下幾個(gè)問題:
dnsmasq
,dnsmasq 是一個(gè) Linux工具,它結(jié)合了 DNS 服務(wù)器、DHCP 服務(wù)器、TFTP 服務(wù)器和 PXE 服務(wù)器。我并沒有使用它。sudo service xxx start
:?jiǎn)?dòng) xxx 服務(wù)sudo service xxx stop
:停止 xxx 服務(wù)sudo service xxx restart
:重啟 xxx 服務(wù)sudo systemctl enable xxx
:開機(jī)自動(dòng)啟動(dòng) xxx 服務(wù)sudo systemctl disable xxx
:禁用 xxx 服務(wù)sudo systemctl status xxx
:查看 xxx 服務(wù)的狀態(tài)journalctl -u xxx
:查看服務(wù)信息sudo ufw status
。??在 Ubuntu 下,TFTP SERVER 對(duì)應(yīng)的軟件包是 tftpd-hpa
(tftpd-hpa
是 BSD TFTP 客戶端和服務(wù)器的增強(qiáng)版本。與原始版本相比,它擁有許多錯(cuò)誤修正和增強(qiáng)),因此,直接使用命令 sudo apt install tftpd-hpa
進(jìn)行安裝。
tftp-hpa
的配置文件為 /etc/default/tftpd-hpa
,可以不用修改。默認(rèn)情況下,tftp-hpa
的根目錄是 /srv/tftp
,將 PXE 的啟動(dòng)配置文件放到該目錄即可。這樣 PXE 客戶端就可以直接獲取到這些文件。隨便找個(gè)客戶端:tftp 192.168.100.63 -c get ipxe.pxe
進(jìn)行測(cè)試。??在 Ubuntu 下,DHCP SERVER 對(duì)應(yīng)的軟件包是 isc-dhcp-server
(Internet Systems Consortium 開發(fā)的,目前主流的開源 DHCP 實(shí)現(xiàn)),因此,直接使用命令 sudo apt install isc-dhcp-server
進(jìn)行安裝。
/etc/dhcp/dhcpd.conf
才可以正常工作。修改之后使用命令 sudo service isc-dhcp-server restart
重啟 DHCP SERVER。詳細(xì)介紹可以參考 ISC-DHCP 官方文檔。針對(duì) PXE,在 /etc/dhcp/dhcpd.conf
的最后追加如下內(nèi)容(注意根據(jù)自己的網(wǎng)絡(luò)環(huán)境更改):
option routers 192.168.100.1; #option broadcast-address 192.168.100.255; subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.215 192.168.100.230; } #option client-system-arch code 93 = unsigned integer 16; class 'pxeclients' { match if substring(option vendor-class-identifier, 0, 9) = 'PXEClient'; next-server 192.168.100.214; if exists user-class and option user-class = 'iPXE' { filename 'menu.ipxe'; } else { filename 'ipxe.pxe'; } }
isc-dhcp-server6
,配置文件名為 /etc/dhcp/dhcpd.conf
),上面說的僅針對(duì) IPv4。/etc/default/isc-dhcp-server
:??在 Ubuntu 下,NFS SERVER 對(duì)應(yīng)的軟件包是 nfs-kernel-server
,因此,直接使用命令 sudo apt install nfs-kernel-server
進(jìn)行安裝。正常安裝時(shí),會(huì)進(jìn)行一系列的配置。感興趣的的話,可以自行去學(xué)習(xí)。
/etc/export
中添加需要共享的目錄。例如,我這里的是 /home/zcshou/PXE/os-images *(rw,sync,no_root_squash,no_subtree_check)
。注意配置后需要重啟 sudo service nfs-kernel-server restart
或 sudo exportfs -ar
生效。使用 showmount -e [ip]
可以查看共享的目錄。sudo mount -t nfs -o vers=4 192.168.100.63:/home/zcshou/PXE/os-images /mnt/nfs
。
??在 Ubuntu 下,HTTP SERVER 對(duì)應(yīng)的軟件包是 apache2
,因此,直接使用命令 sudo apt install apache2
進(jìn)行安裝。安裝完成之后,我們就可以直接從瀏覽器進(jìn)行訪問,看到如下頁面。
/var/www/html
,默認(rèn)的說明頁面中有介紹它的配置文件。Apache2 Web Server 在 Ubuntu 下的配置有些特殊(與上游不同),詳細(xì)介紹參見 Ubuntu 的專題頁面 HTTPD - Apache2 Web Server。
??默認(rèn)情況下,Ubuntu 不允許通過 web 訪問 /var/www
、public_thml
和 /usr/share
之外的目錄。如果您的站點(diǎn)使用的是位于其他地方的 web 文檔根目錄,您可能需要在 /etc/apache2/apache2.conf
中將文檔根目錄指定為白名單。
??在 Ubuntu 下,HTTP SERVER 對(duì)應(yīng)的軟件包是 bind9
(Internet Systems Consortium 開發(fā)的,目前主流的開源 DNS 實(shí)現(xiàn)),因此,直接使用命令 sudo apt install bind9
進(jìn)行安裝。
dnsutils
,一般也會(huì)一起安裝 sudo apt install dnsutils
。需要注意,bind9 默認(rèn)的服務(wù)名字為 named.service
,在 Ubuntu 上有個(gè)別名叫 bind9.service
,我一般直接使用 named.service
即可。
??BIND 的主要配置文件是 /etc/bind/named.conf
,每當(dāng) BIND 啟動(dòng)時(shí),就會(huì)讀取這個(gè)配置文件!不過,現(xiàn)在 BIND 的配置文件結(jié)構(gòu)化了,/etc/bind/named.conf
只用于引入 /etc/bind/named.conf.options
、/etc/bind/named.conf.local
、/etc/bind/named.conf.default-zones
,因此,我們需要修改也是引入的這三個(gè)文件。
/etc/bind/named.conf.options
:這個(gè)文件是全局配置項(xiàng),比如定義解析文件的位置(directory)、DNS 上游服務(wù)器(forwarders)、以及一些安全性格的參數(shù)配置等。基本修改是配置轉(zhuǎn)發(fā) DNS,表示如果我們的 DNS SERVER 有解析不了的,就轉(zhuǎn)發(fā)給這里指定的 DNS 去解析。/etc/bind/named.conf.local
:添加自定義的域名信息(zone)及對(duì)應(yīng)的解析文件(file)。例如,將 xxx.com 和 192.168.xx.xx 關(guān)聯(lián)起來。/etc/bind/named.conf.default-zones
:默認(rèn)的正/反解記錄清單文件相關(guān)參考:
??在 Ubuntu 下,SYSLOG SERVER 對(duì)應(yīng)的軟件包是 rsyslog
,因此,直接使用命令 sudo apt install rsyslog
進(jìn)行安裝。貌似 Ubuntu 好像默認(rèn)就已經(jīng)安裝了 rsyslog
,我在安裝時(shí)提示已經(jīng)安裝了,但不記得安裝過!
??安裝之后,必須要修改配置文件 /etc/rsyslog.conf
,以定義 SYSLOG SERVER 使用的協(xié)議及端口號(hào)。具體就是找到如下部分,去掉注釋,保存即可。使用命令 sudo service rsyslog restart
重啟服務(wù)后生效,使用命令 ss -4altunp | grep 514
查看監(jiān)聽狀態(tài)。默認(rèn)日志位置是 /var/log
。
/etc/rsyslog.conf
文件最后添加 cron.none;*.info;mail.none;authpriv.none @SYSLOG SERVER IP 地址:514
,其中,一個(gè) @ 表示使用 UDP,兩個(gè) @ 表示使用 TCP。
聯(lián)系客服