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