實(shí)戰(zhàn):從DHCP到Kickstart無人值守部署)
做運(yùn)維的最煩的一類重復(fù)勞動是什么我個人的答案不是故障排查也不是上線變更而是裝系統(tǒng)。故障排查好歹有挑戰(zhàn)性上變更也算有點(diǎn)儀式感裝系統(tǒng)純粹是體力活。尤其是有幾十臺裸機(jī)需要交付的時候光盤加U盤一臺一臺懟一下午下來人都是麻的而且手動操作最容易出岔子機(jī)器配置稍有不同分區(qū)方案和基礎(chǔ)設(shè)置就容易弄亂。后來我把目光轉(zhuǎn)向PXE批量裝機(jī)才算是把這個環(huán)節(jié)真正從“人肉模式”切換到了“半自動流水線”。這篇文章就把我折騰PXE的完整過程、踩過的坑、以及最終沉淀下來的方案一次性說清楚。PXEPreboot eXecution Environment預(yù)啟動執(zhí)行環(huán)境簡單講就是讓機(jī)器通過網(wǎng)卡引導(dǎo)系統(tǒng)不需要任何本地存儲介質(zhì)介入。配合DHCP自動分配地址、TFTP傳輸引導(dǎo)文件、HTTP或NFS提供安裝源、Kickstart應(yīng)答文件自動填表一套批量裝機(jī)系統(tǒng)就能在半小時內(nèi)完成從規(guī)劃到上線。整個過程的核心思路是只在一臺服務(wù)器上做一次配置后面所有客戶端機(jī)器只要設(shè)好網(wǎng)絡(luò)啟動選項(xiàng)就能全自動完成系統(tǒng)的部署、分區(qū)、配置和基礎(chǔ)軟件安裝。這篇文章適合所有承擔(dān)過批量交付任務(wù)的運(yùn)維工程師、網(wǎng)管、以及想深入理解Linux網(wǎng)絡(luò)引導(dǎo)原理的學(xué)習(xí)者。不會只講命令怎么敲我會把每個關(guān)鍵組件“為什么這么設(shè)計”也一并講透并附上實(shí)操中真正會遇到的故障和對應(yīng)排查方法。1. 內(nèi)容整體設(shè)計與思路拆解1.1 裝機(jī)這件事為什么要“網(wǎng)絡(luò)化”先從需求說起。假設(shè)你面前有30臺配置相近的服務(wù)器需要統(tǒng)一安裝某個Linux發(fā)行版并預(yù)設(shè)同樣的主機(jī)名規(guī)則、分區(qū)結(jié)構(gòu)、網(wǎng)絡(luò)參數(shù)和初始化用戶。傳統(tǒng)手工裝機(jī)的流程是制作啟動盤、逐臺插拔、選擇鏡像、分區(qū)、寫配置、裝系統(tǒng)、然后手工執(zhí)行后續(xù)腳本。操作周期的重復(fù)度非常高人工介入越久出現(xiàn)偏差的概率越大比如分區(qū)時手滑選錯盤或者軟件包列表沒勾全都可能在交付后暴露成線上問題。用PXE之后流程變成了所有機(jī)器上電開機(jī)網(wǎng)卡主動廣播DHCP請求獲得IP地址和引導(dǎo)文件位置再通過TFTP把引導(dǎo)程序拉下來引導(dǎo)程序去讀取指定安裝源按Kickstart文件里的答案自動完成整個安裝。人只需要在控制臺提前確認(rèn)好默認(rèn)引導(dǎo)菜單剩下的全部交給鏈路自動執(zhí)行。這解決了三個關(guān)鍵問題規(guī)模化交付、配置一致性、無人值守。從原理上看PXE起始于客戶端的網(wǎng)卡固件。網(wǎng)卡固件在啟動階段啟用PXE協(xié)議棧發(fā)出DHCP廣播DHCP服務(wù)器不僅返回IP地址還帶上引導(dǎo)信息比如文件名和服務(wù)器IP。隨后客戶端通過TFTP從引導(dǎo)服務(wù)器拉取引導(dǎo)文件這個文件通常是pxelinux.0或grub相關(guān)的引導(dǎo)器。引導(dǎo)器運(yùn)行后讀取菜單配置文件決定從哪個鏡像啟動最終加載內(nèi)核和解耦然后掛載安裝源開始系統(tǒng)安裝。1.2 方案選型一體化還是分離式搭建PXE環(huán)境有兩條主流路線。一條是用dnsmasq把所有服務(wù)合成一個進(jìn)程順帶把DHCP和TFTP都干了安裝源則用一個HTTP服務(wù)承載。另一條是分離部署DHCP用dhcpd、TFTP用tftp-hpa、HTTP用nginx或httpd各司其職。一開始我圖省事用了一體化方案確實(shí)上手快但等環(huán)境復(fù)雜到要管理多網(wǎng)段、多系統(tǒng)鏡像時單進(jìn)程配置就變得臃腫排障也要從一堆日志里撈。后來生產(chǎn)環(huán)境我全部改成了分離方案。分離方案的好處有很多。DHCP作為整個PXE鏈路的入口配置相對獨(dú)立調(diào)試時不會牽連其他服務(wù)TFTP服務(wù)只在引導(dǎo)階段工作傳輸量小獨(dú)立部署可以單獨(dú)調(diào)整超時和并發(fā)參數(shù)HTTP服務(wù)是安裝源的核心獨(dú)立出來天然支持多目錄、多版本鏡像并行。而且三個服務(wù)進(jìn)程獨(dú)立重啟不會出現(xiàn)一個配置錯了全家起不來的尷尬局面??刂品?wù)器建議用長期支持版本的系統(tǒng)比如Rocky Linux 9或Debian穩(wěn)定版分配一個靜態(tài)內(nèi)網(wǎng)IP。所有PXE相關(guān)的流量都建議在獨(dú)立管理網(wǎng)段中進(jìn)行避免和業(yè)務(wù)流量混跑。安全問題也不要忽略內(nèi)網(wǎng)雖然默認(rèn)可信但TFTP本身沒有認(rèn)證機(jī)制HTTP端口也經(jīng)常是弱防護(hù)區(qū)所以管理網(wǎng)段建議與業(yè)務(wù)網(wǎng)段物理或邏輯隔離至少要做好對應(yīng)的網(wǎng)絡(luò)訪問控制。1.3 鏈路階段拆解從網(wǎng)卡啟動到系統(tǒng)交付完整的PXE裝機(jī)鏈路在原理上可以分為五個階段。第一階段是預(yù)啟動環(huán)境也就是網(wǎng)卡固件發(fā)起DHCP廣播這一步需要客戶端在BIOS或UEFI中開啟網(wǎng)絡(luò)啟動選項(xiàng)并設(shè)置正確的引導(dǎo)順序。第二階段是引導(dǎo)加載階段客戶端通過TFTP獲取引導(dǎo)器引導(dǎo)器再加載內(nèi)核和解耦文件。第三階段是啟動安裝程序階段內(nèi)核掛載initrd后安裝程序開始運(yùn)行并通過引導(dǎo)參數(shù)中的路徑去獲取應(yīng)答文件。第四階段是系統(tǒng)安裝階段安裝程序根據(jù)應(yīng)答文件訪問HTTP安裝源完成文件拷貝、引導(dǎo)安裝和基礎(chǔ)配置。第五階段是首次啟動初始化安裝完成后重啟系統(tǒng)首次啟動執(zhí)行cloud-init、自定義腳本等收尾動作。這里面任何一個環(huán)節(jié)出問題表現(xiàn)都可能極其相似比如卡在某個界面不動、報超時、或者直接拿到一個空內(nèi)核環(huán)境。所以做PXE排障必須牢牢記住這條鏈路順序配合抓包和服務(wù)日志定位才不會亂猜原因。2. 核心組件解析與配置要點(diǎn)2.1 DHCPPXE鏈路的入口總開關(guān)DHCP是PXE啟動的起點(diǎn)。客戶端上電后網(wǎng)卡固件發(fā)出DHCP Discover服務(wù)器需要提供兩組信息一組是常規(guī)IP參數(shù)另一組是PXE引導(dǎo)參數(shù)。常規(guī)參數(shù)包括IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)和DNS。PXE引導(dǎo)參數(shù)則通過DHCP Option 66TFTP服務(wù)器地址和Option 67引導(dǎo)文件名傳遞或者在新版協(xié)議中使用Option 150等擴(kuò)展字段。簡單起見配置時直接把next-server指向TFTP服務(wù)器IP把filename寫成引導(dǎo)文件名。dhcpd配置里相對容易踩的坑是子網(wǎng)聲明和網(wǎng)卡接口綁定。一臺PXE控制服務(wù)器往往有多個網(wǎng)口務(wù)必確認(rèn)DHCP服務(wù)監(jiān)聽的網(wǎng)卡就是通向客戶端網(wǎng)段的那個網(wǎng)卡。啟動服務(wù)后第一步不要急著連客戶端測試先在本機(jī)跑一下DHCP請求模擬驗(yàn)證確認(rèn)服務(wù)能正常分配地址再進(jìn)入下一步。這個習(xí)慣能省下大量神經(jīng)。配置DHCP時還有一個容易被新手忽略的細(xì)節(jié)如果目標(biāo)網(wǎng)段存在其他DHCP服務(wù)器一定要在配置里嚴(yán)格限定子網(wǎng)作用域甚至用allow unknown-clients結(jié)合MAC白名單來控制。PXE環(huán)境講究的是可控如果混進(jìn)來一個非法DHCP服務(wù)器所有客戶端引導(dǎo)都會亂套。2.2 TFTP經(jīng)典小步快跑瓶頸也在小TFTP的作用范圍很有限只在客戶端獲取引導(dǎo)器的初始階段用到。因?yàn)檫@個階段網(wǎng)絡(luò)棧還很簡單無法承載復(fù)雜協(xié)議所以選用TFTP這種基礎(chǔ)文件傳輸協(xié)議。TFTP默認(rèn)基于UDP 69端口數(shù)據(jù)包小且沒有復(fù)雜的握手和狀態(tài)機(jī)實(shí)現(xiàn)簡化到了極致。協(xié)議的代價是傳輸效率低尤其是默認(rèn)塊大小512字節(jié)時傳一個幾兆字節(jié)的引導(dǎo)文件都會有明顯延遲。解決效率問題有兩個辦法。一是調(diào)整引導(dǎo)器的pxelinux.0加載后的內(nèi)核和解耦文件傳送這是不可避免走TFTP的但引導(dǎo)器本身足夠小。二是讓引導(dǎo)器后期從HTTP獲取內(nèi)核和initrd繞過TFTP的低效率。SYSLINUX系列引導(dǎo)器支持菜單配置里直接用HTTP URL加載內(nèi)核。我生產(chǎn)環(huán)境就是用HTTP承載內(nèi)核和initrdTFTP只保底傳pxelinux.0和菜單文件實(shí)測安裝速度比純TFTP快不少。TFTP配置上不建議用xinetd管理的版本直接安裝獨(dú)立的tftpd-hpa在配置文件中明確指定blocksize 1468乃至更大值減少包往返次數(shù)。同時把超時時間調(diào)大一些否則幾十臺客戶端同時廣播請求時偶發(fā)的瞬時丟包會觸發(fā)重傳超時直接表現(xiàn)為客戶端拿不到菜單。2.3 HTTP安裝源鏡像、倉庫與目錄規(guī)劃PXE引導(dǎo)成功后系統(tǒng)的安裝數(shù)據(jù)就全部從安裝源獲取。安裝源用HTTP承載比用NFS省心得多不依賴特定協(xié)議棧瀏覽器、CIFS、普通抓包工具都能訪問排查也直觀。我通常用nginx作為安裝源服務(wù)器配置非常簡單設(shè)置一個根目錄把各類發(fā)行版的ISO鏡像掛在對應(yīng)子目錄同時目錄結(jié)構(gòu)保持清晰可讀。鏡像的加載方式有兩個選擇直接把整個ISO文件放在磁盤上然后通過loop掛載或者把ISO內(nèi)容解壓到目錄中通過目錄訪問。前者省磁盤空間但每次訪問都需要內(nèi)核處理loop設(shè)備后者浪費(fèi)點(diǎn)空間但訪問效率高、部署直觀。我推薦把ISO解壓到目錄然后軟鏈或nginx alias指向它。需要注意掛載ISO時用mount -o loop解壓時尤其不要遺漏隱藏文件因?yàn)長inux ISO中有些配置文件和校驗(yàn)文件是以點(diǎn)開頭的。HTTP服務(wù)的響應(yīng)速度和并發(fā)也值得關(guān)注。默認(rèn)nginx配置就行不必額外調(diào)優(yōu)。但如果客戶端數(shù)量很大比如同時有幾十上百臺機(jī)器在拉包可以考慮把HTTP的日志級別降低減少磁盤寫日志帶來的性能損耗。還有一點(diǎn)確認(rèn)HTTP服務(wù)對安裝源目錄沒有做目錄列表限制或鑒權(quán)攔截否則安裝程序會在從源讀取元數(shù)據(jù)時報403。2.4 Kickstart無人值守的關(guān)鍵開關(guān)Kickstart是一種自動化應(yīng)答文件安裝程序按它的內(nèi)容自動回答原本必須人工交互的每一項(xiàng)問題。文件包括磁盤分區(qū)方案、文件系統(tǒng)類型、軟件包列表、語言與鍵盤布局、時區(qū)、root密碼、網(wǎng)絡(luò)配置、安全策略、以及首次啟動要執(zhí)行的腳本。這個文件是整個PXE方案里最能體現(xiàn)設(shè)計水平的地方。一份好的Kickstart文件應(yīng)該把“通用的安裝邏輯”和“每臺機(jī)器的差異項(xiàng)”分開。通用的部分比如基礎(chǔ)軟件包組、分區(qū)模板、時區(qū)、語言統(tǒng)一寫在ks文件里。有差異的地方比如主機(jī)名、IP地址、部分服務(wù)開關(guān)通過引導(dǎo)參數(shù)傳遞再用%pre腳本動態(tài)處理。這樣一套配置文件就能管住一個機(jī)房的環(huán)境而不是為每種硬件規(guī)格寫一份單獨(dú)的ks。分區(qū)方案建議采用LVM預(yù)留足夠的/home或/data空間給業(yè)務(wù)數(shù)據(jù)/boot獨(dú)立出來swap大小按物理內(nèi)存的1到2倍規(guī)劃。對于服務(wù)器場景根分區(qū)容量可以適當(dāng)給足后續(xù)擴(kuò)容少折騰。軟件包選擇上用最小化安裝加必要工具組寧可裝少了后期再補(bǔ)也別一上來把整組圖形化都裝上。2.5 網(wǎng)絡(luò)規(guī)劃與安全邊界PXE依賴網(wǎng)絡(luò)的程度比日常運(yùn)維高一個量級對網(wǎng)絡(luò)環(huán)境的要求也苛刻一些。首先是交換機(jī)端口客戶端機(jī)器所在的交換機(jī)下聯(lián)口不建議開啟端口隔離或個別準(zhǔn)入策略至少要讓DHCP Discover、TFTP客戶端請求、HTTP請求都能順利穿過。其次是VLAN劃分管理網(wǎng)段和業(yè)務(wù)網(wǎng)段分開PXE服務(wù)只監(jiān)聽管理網(wǎng)段避免誤用DHCP干擾業(yè)務(wù)地址池。最后是網(wǎng)關(guān)和廣播域DHCP Discover是廣播報文客戶端和服務(wù)器必須在同一個二層廣播域里跨三層就需要配置DHCP中繼代理。安全方面TFTP默認(rèn)不限制訪問目錄建議在TFTP目錄內(nèi)部做好讀寫權(quán)限控制只開放必要的子目錄。HTTP服務(wù)如果沒有特殊需求不建議直接綁定到公網(wǎng)網(wǎng)口。PXE環(huán)境如果可能接觸不受信任的客戶端考慮在DHCP服務(wù)中啟用動態(tài)分配合約或IP/MAC綁定保證只有已知的客戶端才能獲得引導(dǎo)資格。3. 實(shí)操全流程從零搭建一套可用的PXE環(huán)境3.1 準(zhǔn)備工作與基礎(chǔ)環(huán)境初始化我以一套Rocky Linux 9服務(wù)器作為控制端客戶端統(tǒng)一安裝同版本系統(tǒng)為例??刂品?wù)器的IP規(guī)劃為192.168.110.10客戶端網(wǎng)段192.168.110.0/24。數(shù)據(jù)庫術(shù)語上我們稱這臺服務(wù)器為PXE控制器其他所有機(jī)器都作為PXE客戶端。開始之前先把本機(jī)系統(tǒng)更新好關(guān)閉或放行對應(yīng)的防火墻端口并安裝所需軟件包。涉及的核心服務(wù)端口有三類DHCP使用UDP 67、TFTP使用UDP 69、HTTP使用TCP 80。如果控制端啟用了防火墻需要提前放行這組端口。同時要確認(rèn)SELinux不會攔截HTTP服務(wù)讀取掛載目錄最簡單的方式是把安裝源目錄的標(biāo)準(zhǔn)上下文手動設(shè)置一下或者臨時調(diào)整SELinux布爾值我建議按目錄標(biāo)準(zhǔn)設(shè)定上下文而不是直接關(guān)閉SELinux。# 安裝所需軟件包 dnf install -y dhcp-server tftp-server syslinux-tftpboot nginx3.2 DHCP配置明確引導(dǎo)入口編輯/etc/dhcp/dhcpd.conf定義子網(wǎng)和PXE引導(dǎo)參數(shù)。這里核心是next-server和filename兩個選項(xiàng)。一個基礎(chǔ)配置模板如下subnet 192.168.110.0 netmask 255.255.255.0 { range 192.168.110.100 192.168.110.200; option routers 192.168.110.1; option domain-name-servers 192.168.110.10; option subnet-mask 255.255.255.0; next-server 192.168.110.10; filename pxelinux.0; default-lease-time 3600; max-lease-time 7200; }next-server告訴你TFTP服務(wù)器在哪里filename告訴該取什么引導(dǎo)文件。配置好之后啟動服務(wù)并檢查日志確認(rèn)沒有語法錯誤。有一點(diǎn)我后來又改進(jìn)了公司內(nèi)部有多個網(wǎng)段PXE客戶端跨越了VLAN這就需要在每個VLAN的網(wǎng)關(guān)設(shè)備上配置DHCP中繼或者用DHCP服務(wù)端同時監(jiān)聽多個子網(wǎng)有條件可以配置基于端口的動態(tài)分配。3.3 TFTP引導(dǎo)環(huán)境放置引導(dǎo)器和菜單安裝syslinux-tftpboot后把pxelinux.0、菜單模塊、內(nèi)核和解耦文件放到TFTP根目錄。這里的常規(guī)TFTP根目錄是/var/lib/tftpboot實(shí)際路徑看發(fā)行版差異。拷貝引導(dǎo)器cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ mkdir -p /var/lib/tftpboot/pxelinux.cfg創(chuàng)建/var/lib/tftpboot/pxelinux.cfg/default作為默認(rèn)引導(dǎo)菜單。我先讓客戶端啟動到安裝程序所有具體的鏡像選擇都放在這個菜單里。默認(rèn)菜單內(nèi)容如下DEFAULT menu.c32 PROMPT 0 MENU TITLE PXE Boot Menu TIMEOUT 100 LABEL linux MENU LABEL Install Rocky Linux 9 x86_64 KERNEL images/rocky9/vmlinuz APPEND initrdimages/rocky9/initrd.img kshttp://192.168.110.10/ks/ks.cfg這段配置里KERNEL指向內(nèi)核文件在TFTP根下的相對路徑APPEND里的initrd參數(shù)告訴引導(dǎo)器加載哪個解耦文件ks參數(shù)用HTTP URL指定Kickstart文件位置。注意如果使用UEFI引導(dǎo)環(huán)境圖形化菜單模塊選用menu.c32可能不生效需要根據(jù)啟動模式針對性配置。TFTP根目錄、權(quán)限和SELinux上下文都要配套。TFTP服務(wù)默認(rèn)對目錄有讀取權(quán)限要求如果用tftp-hpa默認(rèn)用戶是tftp需要保證引導(dǎo)文件對tftp用戶可讀使用chmod 644即可。如果啟用了SELinuxtftp服務(wù)有對應(yīng)的布爾值開關(guān)我因?yàn)閳D省事踩過一整晚的坑最后是檢查/var/log/messages才定位到SELinux攔截了TFTP讀取。3.4 HTTP安裝源掛載ISO并配置訪問安裝源放在nginx目錄下。先把ISO鏡像拷貝到控制服務(wù)器或者直接掛載然后創(chuàng)建軟鏈接指向解壓目錄。我的做法是統(tǒng)一放在/data/pxe/iso每個鏡像一個目錄同時給客戶端訪問路徑以簡潔的URL展示。mkdir -p /data/pxe/iso mount -o loop rocky9.iso /mnt/rocky9 cp -a /mnt/rocky9/. /data/pxe/iso/rocky9/nginx配置指向這個目錄server { listen 80 default_server; root /data/pxe/iso; autoindex on; }autoindex on是必要的雖然Kickstart不一定需要目錄列表但調(diào)試時可以先用瀏覽器訪問目錄確認(rèn)鏡像文件是否完整可見。安裝時安裝程序會訪問repodata目錄抓取軟件包元數(shù)據(jù)所以目錄里必須有這個文件如果ISO拷貝不完整經(jīng)常會在安裝進(jìn)度走到一半時報倉庫加載失敗。3.5 Kickstart應(yīng)答文件編寫兼顧通用與個性Kickstart文件放在HTTP服務(wù)下路徑/ks/ks.cfg對應(yīng)磁盤路徑/data/pxe/ks/。下面這個腳本是適應(yīng)多機(jī)器的通用模板已在多臺物理機(jī)上跑通過。# 版式Kickstart 格式 install url --urlhttp://192.168.110.10/rocky9/ lang en_US.UTF-8 keyboard us timezone Asia/Shanghai rootpw --iscrypted $6$... authconfig --enableshadow --passalgosha512 selinux --enforcing firewall --disabled firstboot --disable # 磁盤與引導(dǎo)配置 zerombr clearpart --all --initlabel part /boot --fstypexfs --size1024 part pv.01 --size1 --grow volgroup vg0 pv.01 logvol / --fstypexfs --nameroot --vgnamevg0 --size40960 logvol swap --fstypeswap --nameswap --vgnamevg0 --size4096 logvol /data --fstypexfs --namedata --vgnamevg0 --size1 --grow # 軟件包配置 %packages core vim wget %end # 首次啟動自定義 %post --log/root/pxe-post.log echo PXE install completed /root/pxe-post.log %end這個文件的關(guān)鍵在于分區(qū)策略和軟件包配置。分區(qū)統(tǒng)一走LVM后續(xù)擴(kuò)展不再需要停機(jī)調(diào)整物理分區(qū)。%post腳本用于安裝完成后做定制操作比如寫主機(jī)名、配置SSH key、添加用戶等。我是習(xí)慣在%post里通過讀取DHCP的hostname或預(yù)設(shè)參數(shù)來生成每臺機(jī)器的主機(jī)名這樣就不需要每臺機(jī)器手工改主機(jī)名了。第一段代碼里的root密碼以密文形式存放。生成方法可以用openssl passwd -6或者grub-crypt絕對不要寫明文密碼。整個Kickstart文件在HTTP目錄中時確認(rèn)權(quán)限盡量收緊比如只用root可讀寫但如果需要遠(yuǎn)程修改也可以另設(shè)專用賬號。3.6 客戶端啟動驗(yàn)證與參數(shù)傳遞技巧配置全部就位后在一臺測試機(jī)上將其啟動方式設(shè)置為網(wǎng)絡(luò)啟動開始觀察安裝流程。理想情況下控制臺會依次出現(xiàn)PXE準(zhǔn)備階段、引導(dǎo)菜單、內(nèi)核加載、安裝程序初始化然后進(jìn)入無人值守安裝。全程大約10分鐘期間不需要任何人工干預(yù)。如果希望客戶端能自動區(qū)分不同主機(jī)名或不同分區(qū)配置可以使用Kickstart里的%pre腳本配合引導(dǎo)參數(shù)實(shí)現(xiàn)。引導(dǎo)器APPEND里可以帶自定義參數(shù)比如hostnameweb01然后在%pre中解析這些參數(shù)并寫入對應(yīng)配置文件。這種方式比客戶端都讀同一個模塊更靈活也方便和資產(chǎn)管理平臺打通。%pre --log/tmp/ks-pre.log hostname$(find /proc/cmdline -o -print | grep hostname | cut -d -f2) echo $hostname /etc/hostname %end還有一個小技巧是把menu.c32作為默認(rèn)引導(dǎo)菜單同時鍵盤快捷鍵可以快速進(jìn)入shell方便調(diào)試。實(shí)際使用中我在APPEND里經(jīng)常額外加一個ipdhcp參數(shù)確保安裝程序正確獲取網(wǎng)絡(luò)配置避免因?yàn)榫W(wǎng)卡名混亂導(dǎo)致連不上安裝源。4. 常見問題與排查技巧實(shí)錄4.1 客戶端卡在“PXE-E51: No DHCP or proxyDHCP offers”這個報錯說明DHCP階段就沒通。排查順序很明確看看DHCP服務(wù)是否在跑監(jiān)聽端口是否是67確認(rèn)客戶端和服務(wù)器在同一二層網(wǎng)絡(luò)檢查防火墻是否丟棄了UDP 67報文。如果服務(wù)正常再用tcpdump在服務(wù)器側(cè)抓包觀察DHCP Discover是否能收到。這類問題九成是網(wǎng)絡(luò)隔離或服務(wù)監(jiān)聽錯了接口。4.2 客戶端能拿到IP但TFTP下載引導(dǎo)文件超時此時DHCP已經(jīng)成功問題出在引導(dǎo)文件獲取階段。常見原因包括TFTP服務(wù)器沒放行UDP 69端口、pxelinux.0文件不存在、或文件權(quán)限不對。另外一個很容易忽略的是filename里如果寫了路徑比如filename pxelinux.0TFTP服務(wù)會把它當(dāng)作相對路徑拼接在根目錄之后路徑寫錯會直接404。建議先用tftp命令行手動測試一遍文件下載能手動下載成功再談客戶端引導(dǎo)。tftp 192.168.110.10 -c get pxelinux.04.3 引導(dǎo)菜單正常顯示但內(nèi)核啟動后黑屏或Kernel Panic這類問題一般和引導(dǎo)參數(shù)有關(guān)。最常見的是APPEND里沒有指定正確initrd或者vmlinuz和initrd.img與系統(tǒng)架構(gòu)不匹配。另一個常見坑是UEFI機(jī)器加載了BIOS版引導(dǎo)文件導(dǎo)致啟動協(xié)議不符。當(dāng)前架構(gòu)統(tǒng)一使用UEFI引導(dǎo)我配置時都會放兩套引導(dǎo)文件按啟動模式提供不同文件名從一開始避免混用。4.4 安裝程序已啟動但在獲取倉庫或安裝軟件包階段失敗安裝程序能跑起來說明引導(dǎo)鏈路OK之后的失敗通常都和HTTP源有關(guān)。建議先訪問http://192.168.110.10確認(rèn)目錄列表能看到ISO內(nèi)容。如果目錄能打開但安裝報404請看Kickstart里url --url寫的具體路徑是否與nginx目錄的alias或軟鏈路徑對應(yīng)。還有一個容易踩的坑如果通過mount -o loop臨時掛載ISO服務(wù)器一重啟掛載點(diǎn)就消失。我的建議是把ISO解壓到目錄后長期保留避免循環(huán)掛載依賴進(jìn)程狀態(tài)。4.5 Kickstart文件無法讀取如果引導(dǎo)器能找到kshttp://...但安裝程序提示解析錯誤或訪問失敗先用瀏覽器或curl確認(rèn)該URL可以正常返回內(nèi)容再檢查文件格式。Kickstart文件其實(shí)對行尾和編碼有要求Windows下編輯過再傳到服務(wù)器很容易栽在回車符差異上。另一個隱蔽的問題是文件中出現(xiàn)空行、注釋錯位或者使用了不支持的指令建議安裝前用ksvalidator做一次語法驗(yàn)證能省去大量現(xiàn)場調(diào)試時間。4.6 大規(guī)模并發(fā)安裝時的延時與資源瓶頸同時引導(dǎo)幾十臺客戶端時DHCP、TFTP、HTTP三個服務(wù)都可能成為瓶頸。DHCP層面可以把default-lease-time縮短讓地址盡早釋放TFTP層面引導(dǎo)器文件本身傳輸盡力減小必要時僅傳輸引導(dǎo)器內(nèi)核和initrd走HTTPHTTP層面建議把所有安裝源目錄的冗余日志級別關(guān)閉同時nginx開啟sendfile和aio并考慮采用proxy_cache做倉庫包緩存。實(shí)測中同樣的配置優(yōu)化HTTP路徑后并發(fā)20臺以上也能穩(wěn)定交付。4.7 安裝完成后首次啟動進(jìn)不了系統(tǒng)這類問題多出在引導(dǎo)加載器安裝和分區(qū)設(shè)計上。如果/boot分區(qū)存在但內(nèi)核沒寫入引導(dǎo)項(xiàng)檢查Kickstart里是否包含bootloader --locationmbr或UEFI相關(guān)參數(shù)。此外部分機(jī)器因固件原因在PXE安裝后還保留PXE啟動順序?qū)е轮貑⒂只氐骄W(wǎng)絡(luò)啟動菜單。處理辦法是在Kickstart%post階段寫一段腳本將啟動順序調(diào)整為本機(jī)磁盤優(yōu)先或者依靠UEFI的引導(dǎo)管理器設(shè)置。5. 擴(kuò)展場景與現(xiàn)實(shí)經(jīng)驗(yàn)PXE不止能裝單機(jī)系統(tǒng)稍微擴(kuò)展一下邏輯就能覆蓋多種運(yùn)維場景。比如配合模板鏡像可以用PXE引導(dǎo)一個內(nèi)存系統(tǒng)然后在內(nèi)存系統(tǒng)里執(zhí)行克隆、備份或抽檢硬件固件信息再比如把Kickstart文件里的軟件包列表換成某一業(yè)務(wù)組的常用軟件集合就相當(dāng)于批量交付了統(tǒng)一基線還能和監(jiān)控平臺打通讓安裝完成后的系統(tǒng)第一時間自動上報到CMDB。我在實(shí)際落地中還總結(jié)了一條經(jīng)驗(yàn)PXE的搭建代碼相對固定難的不是寫配置而是對網(wǎng)絡(luò)細(xì)節(jié)的理解和異常處理。每次導(dǎo)入一批新機(jī)型我都會先拿一臺樣機(jī)完整跑一遍安裝觀察日志里是否有新硬件導(dǎo)致的異常再決定是否批量執(zhí)行。如果機(jī)器網(wǎng)卡型號較新引導(dǎo)階段可能還需要嵌入廠商網(wǎng)卡驅(qū)動否則會出現(xiàn)內(nèi)核無法識別網(wǎng)卡而無法進(jìn)入安裝程序的怪問題。后來說個非常實(shí)用的小技巧建議把控制服務(wù)器上的配置做版本管理至少對dhcpd.conf、nginx配置和Kickstart腳本打上git標(biāo)簽。出現(xiàn)配置回退時幾秒鐘就能恢復(fù)。做PXE的樂趣就在于前期配置雖然瑣碎但換來的是一勞永逸的交付能力這種投入非常值得。祝各位順利跑通自己的PXE鏈路。