在實際工作中,傳統純手動安裝操作系統的方式是有一定的局限性的,例如:現在大多數的服務器都不自帶光驅,若要安裝系統需要外接光驅插入光盤,整個安裝過程中需要人工交互確認,手動設置每一個安裝設置項,人必須要在機器前值守,時間大多花費在安裝的等待過程中。假如有一大批服務器需要安裝操作系統,這種傳統手動的方式去逐台安裝系統的方式,效率是極其低下的,而且由於需要人工交互式配置系統的安裝設置項,無法確保每一台機器的系統安裝配置都是完全一致的,即無法做到完全的統一標准化。(在大量重復的操作過程中,人工方式是極易出錯的)
為了解決上述問題,可以采用PXE網絡的方式來實現系統自動化安裝,整個安裝過程中無需人工干預,極大的提供了工作效率。
一、PXE的基本概念
PXE(Pre-boot Execution Environment,預啟動執行環境)是由Inter公司開發的網絡引導技術,工作在Client/Server模式,PXE網卡的ROM內置了對dhcp和tftp協議的支持,允許客戶機通過網絡從遠程服務器下載引導鏡像,並加載安裝文件或者整個操作系統。

二、PXE服務器的相關組件及基本原理
PXE服務器需要的服務:
DHCP服務:為客戶端分配IP地址,定位啟動引導文件
TFTP服務:提供網卡啟動引導程序、系統內核文件及initrd鏡像文件下載
FTP服務(或http/nfs):提供系統鏡像的yum安裝源及ks應答文件下載
客戶端機應具備的條件:
網卡必須支持PXE協議(現在大多數的網卡都已支持)
主板BIOS支持從網絡啟動
1、通過PXE服務器安裝系統原理示意圖:

通常情況下,為了節省資源我們也可以將上述原理圖中的提供DHCP服務、TFTP服務、FTP(或HTTP、NFS)服務的3台不同服務器整合部署到同一台服務器,作為PXE的服務器端,視具體情況而定。
2、PXE網絡安裝系統的優勢:
規模化:高效率,同時安裝多台服務器,輕松應對大規模批量安裝
自動化:安裝過程中無需人工干預、實現自動化無人值守安裝
標准化:按照自設定的系統安裝規則配置硬盤分區及系統組件包,實現系統安裝的統一標准化
遠程實現:不需要光驅光盤、U盤等外部安裝介質
三、PXE服務器搭建步驟詳解
本文以centos7為例,對PXE服務器的搭建過程總結如下:
1、准備操作系統鏡像YUM源,並通過HTTP服務對外發布
安裝httpd服務:
[root@centos7 ~]#yum -y install httpd
[root@centos7 ~]#systemctl start httpd.service #啟動httpd服務
[root@centos7 ~]#systemctl enable httpd.service #設置httpd服務開機啟動
創建系統鏡像ISO文件存放目錄
[root@centos7 ~]#mkdir -p /data/myios #創建 /data/myios 作為系統鏡像文件存放目錄
通過xftp等工具將系統鏡像ISO文件上傳到 /data/myios 目錄
[root@centos7 myiso]#ll
total 14390272
-rw-r--r-- 1 root root 3991928832 Sep 7 13:51 CentOS-6.10-x86_64-bin-DVD1.iso
-rw-r--r-- 1 root root 10743709696 Sep 7 13:54 CentOS-7-x86_64-Everything-1810.iso
在httpd默認的documentroot目錄 /var/www/html 下創建各個系統鏡像源的子目錄
[root@centos7 ~]#mkdir -pv /var/www/html/centos/{6,7}/os/x86_64/
mkdir: created directory ‘/var/www/html/centos’
mkdir: created directory ‘/var/www/html/centos/6’
mkdir: created directory ‘/var/www/html/centos/6/os’
mkdir: created directory ‘/var/www/html/centos/6/os/x86_64/’
mkdir: created directory ‘/var/www/html/centos/7’
mkdir: created directory ‘/var/www/html/centos/7/os’
mkdir: created directory ‘/var/www/html/centos/7/os/x86_64/’
[root@centos7 ~]#
掛載系統ISO鏡像文件到httpd對應的目錄下
vim編輯修改 /etc/fstab文件
[root@centos7 ~]#vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Sep 7 12:12:42 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=4d76f02b-0ebf-4238-89a6-e18709a1025d / xfs defaults 0 0
UUID=b2d24305-3936-4e25-8a40-18b53cd4d809 /boot xfs defaults 0 0
UUID=e5586dc6-a9e2-453b-90da-c009996214ad /data xfs defaults 0 0
UUID=3417eb37-c6ee-4c17-aea5-153413c631c6 swap swap defaults 0 0
/data/myiso/CentOS-6.10-x86_64-bin-DVD1.iso /var/www/html/centos/6/os/x86_64 iso9660 defaults 0 0
/data/myiso/CentOS-7-x86_64-Everything-1810.iso /var/www/html/centos/7/os/x86_64 iso9660 defaults 0 0
添加最后兩行,將/data/myiso 目錄中的2個iso鏡像文件以iso鏡像文件系統掛載到httpd的對應documentroot目錄下
[root@centos7 ~]#mount -a
mount: /dev/loop0 is write-protected, mounting read-only
mount: /dev/loop1 is write-protected, mounting read-only
[root@centos7 ~]#
df查看一下,ISO鏡像已經掛載到httpd對應目錄下

說明:10.10.10.254為PXE服務器的IP,需提前配置好,且設置為靜態IP。
設置本機IP與PXE服務器同網段,通過URL訪問 http://10.10.10.254/centos/ 可以到yum源已經發布成功。



2、准備系統自動安裝ks應答文件(kickstart),並使用HTTP發布
kickstart文件用途:
ks應答文件的作用就是實現系統安裝過程中的無人值守,自動安裝的。系統安裝的時候就是依靠讀取KS文件里面預先定義的各項安裝設置,如硬盤分區、系統語言、安裝哪些組件包等。
ks文件的配置方式:
(1)從現有已經安裝好的系統中獲取anaconda-ks.cfg(此文件是anaconda系統安裝向導在系統安裝完成后生成的),然后根據anaconda-ks.cfg里面的配置項來修改配置為自己需要的ks文件(需要注意的是centos6和centos7系統的ks配置不通用,需要使用對應的系統的anaconda文件來修改配置)
ks文件文件的格式范例和設置項說明如下(適用centos7)
[root@centos7 ksdir]#cat ks7_desktop.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install #全新安裝
# Keyboard layouts
keyboard 'us' #鍵盤模式,美式US
# Root password
rootpw --iscrypted $1$7Q46UR0F$uZjZh2p9X.MlrV0dW8euj. #設置root賬號口令並采用加密
# Use network installation
url --url="http://10.10.10.254/centos7/os/x86_64" #系統鏡像yum源的URL地址
# System language
lang en_US #系統默認語言,en_US
# System authorization information
auth --useshadow --passalgo=sha512 #系統默認使用shadow文件作為賬號登錄驗證
# Use text mode install
text #安裝過程默認使用text文本的tui界面
firstboot --disable
# SELinux configuration
selinux --disabled #禁用selinux
# Firewall configuration
firewall --disabled #禁用系統防火牆
# Network information
network --bootproto=dhcp --device=eth0 #系統默認的網卡配置
# Reboot after installation
reboot #安裝完成后自動重啟系統
# System timezone
timezone Asia/Shanghai #設置系統默認時區 Asia/Shanghai
# System bootloader configuration
bootloader --append="net.ifnames=0" --location=mbr #安裝新的bootload程序,並添加內核啟動參數 net.ifnames=0
# Clear the Master Boot Record
zerombr #清除原有的MBR引導記錄
# Partition clearing information
clearpart --all --initlabel #清除原有的硬盤分區標簽
# Disk partitioning information #硬盤分區信息,按實際需求設定
part /boot --fstype="xfs" --size=1024
part / --fstype="xfs" --size=51200
part swap --fstype="swap" --size=4096
part /data --fstype="xfs" --grow --size=1 # /data分區使用所有剩余硬盤空間
%packages #要安裝的包組,以%packages行開始,到%end結尾,包組以@符號開頭,單個包直接寫包名
@desktop-debugging
@fonts
@gnome-desktop
@input-methods
@legacy-x
@remote-desktop-clients
@x11
vinagre
%end #需要注意的是,centos6中,如果選擇最小化安裝,ks文件最后需要寫上 %packages開始行%end結尾行的2行,否則系統會默認安裝所有的包組,centos7系統如果最小化安裝,則可以不用寫這2行
[root@centos7 ksdir]#
通過anaconda文件為模板修改生成的ks文件,可以使用命令 ksvalidator /PATH/KICKSTART_FILE 來檢查ks文件語法是否正確。
(2)使用system-config-kickstart工具,通過圖形界面設置向導來配置生成(需要服務器帶有圖形界面的包組,如果是最小化安裝的系統,需要安裝x11圖形包組)
[root@centos7 ~]#yum -y install system-config-kickstart #此工具包來自epel源
[root@centos7 ~]#yum -y groupinstall x11 #最小化安裝的系統需要安裝x11圖形包組才能支持system-config-kickstart工具調出圖形界面的ks文件配置向導窗口
運行system-config-kickstart工具調出kickstart圖形配置向導窗口
[root@centos7 ~]#system-config-kickstart
system-config-kickstart工具的設置如下:











設置完成后,點擊左上角save保存

修改ks文件名稱,指定存放路徑,點擊右下角save保存

注意:如果是通過system-config-kickstart工具生成centos6系統最小化安裝的ks文件,需要手動修改ks文件,在最后添加%package開始行和%end結束行的2行,否則安裝向導會默認安裝所有包組,如下圖:

在http服務器documentroot目錄下創建 ksdir目錄,作為ks文件的專用存放路徑
[root@centos7 ksdir]#cd /var/www/html/
[root@centos7 html]#mkdir ksdir/
將通過上述任一方式配置好的ks文件,上傳到http服務器專用的ks文件存放路徑下,對外發布,並確保所有ks文件通過url可以正常訪問
[root@centos7 ksdir]#ll
total 16
-rw-r--r-- 1 root root 2109 Sep 7 20:00 ks6_desktop.cfg #centos6帶gnome桌面安裝
-rw-r--r-- 1 root root 1757 Sep 7 22:13 ks6_mininal.cfg #centos6最小化安裝
-rw-r--r-- 1 root root 1809 Sep 7 20:02 ks7_desktop.cfg #centos7帶gnone桌面安裝
-rw-r--r-- 1 root root 1695 Sep 7 20:02 ks7_mininal.cfg #centos7最小化安裝
3、安裝配置TFTP服務,並部署網卡引導文件、系統內核文件及系統初始化鏡像文件
配置並啟用TFTP服務,安裝tftp-server軟件包,監聽端口為UDP 69
TFTP根目錄:/var/lib/tftpboot/
[root@centos7 ~]#yum -y install tftp-server
[root@centos7 ~]#systemctl start tftp.socket
[root@centos7 ~]#systemctl enable tftp.socket
TFTP根目錄需要部署的文件如下:
[root@centos7 tftpboot]#ll
total 84
drwxr-xr-x 2 root root 39 Sep 7 14:48 centos6
drwxr-xr-x 2 root root 39 Sep 7 14:48 centos7
-rw-r--r-- 1 root root 55140 Sep 7 14:46 menu.c32
-rw-r--r-- 1 root root 26759 Sep 7 14:46 pxelinux.0
drwxr-xr-x 2 root root 21 Sep 7 21:36 pxelinux.cfg
[root@centos7 tftpboot]#tree
.
├── centos6 #centos6系統內核文件和intrd.img存放目錄
│ ├── initrd.img
│ └── vmlinuz
├── centos7 #centos7系統內核文件和intrd.img存放目錄
│ ├── initrd.img
│ └── vmlinuz
├── menu.c32 #PXE啟動菜單界面背景圖
├── pxelinux.0 #網卡啟動引導文件
└── pxelinux.cfg #PXE啟動菜單文件存放目錄,目錄名必須為pxelinux.cfg
└── default #PXE啟動菜單文件,文件名必須為default
准備網卡啟動引導文件pxelinux.0和PXE啟動菜單界面背景圖片文件menu.c32
yum安裝syslinux包
[root@centos7 ~]#yum -y install syslinux
復制pxelinux文件到tftp的根目錄下
[root@centos7 ~]#cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
復制PXE啟動菜單界面背景圖片文件到tftp根目錄下
[root@centos7 ~]#cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/
在tftp根目錄創建系統內核文件及initrd鏡像文件的存放目錄,並從系統ISO鏡像yum源目錄復制對應的文件到tftp中對應的目錄
在tftp根目錄創建centos6和centos7系統內核文件及initrd鏡像文件的存放目錄
[root@centos7 ~]#mkdir -pv /var/lib/tftpboot/centos{6,7}
mkdir: created directory ‘/var/lib/tftpboot/centos6’
mkdir: created directory ‘/var/lib/tftpboot/centos7’
分別從centos6和centos7鏡像yum源路徑復制系統內核文件和initrd鏡像文件到tftp根目錄中對應的目錄
[root@centos7 ~]#cp /var/www/html/centos/6/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos6/
[root@centos7 ~]#cp /var/www/html/centos/7/os/x86_64/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/centos7/
准備安裝菜單文件並放到tftp指定目錄中
在tftp根目錄中創建安裝菜單文件存放目錄 pexlinux.cfg/
[root@centos7 ~]#mkdir /var/lib/tftpboot/pxelinux.cfg/
從系統ISO鏡像yum源路徑復制啟動菜單文件到對應目錄中,並改為為default
vim編輯修改pxe啟動菜單default文件,修改為如下內容:
[root@centos7 pxelinux.cfg]#vim default
default menu.c32 #使用menu.c32作為背景圖片
timeout 600 #默認等待時間60秒(600的十分之一)
menu title Auto Install CentOS #啟動菜單的標題
label CentOS6_Mininal #label標簽說明
menu label Install CentOS 6.10 Mininal #安裝選項菜單
kernel centos6/vmlinuz #系統內核文件在tftp中的相對路徑
append initrd=centos6/initrd.img ks=http://10.10.10.254/ksdir/ks6_mininal.cfg #boot啟動引導的參數,指定系統initrd鏡像文件在tftp中的相對路徑以及ks應答文件的訪問地址
label CentOS6_Desktop
menu label Install CentOS 6.10 Desktop
kernel centos6/vmlinuz
append initrd=centos6/initrd.img ks=http://10.10.10.254/ksdir/ks6_desktop.cfg
label CentOS7
menu label Install CentOS 7.6 Mininal
kernel centos7/vmlinuz
append initrd=centos7/initrd.img ks=http://10.10.10.254/ksdir/ks7_mininal.cfg
label CentOS7
menu label Install CentOS 7.6 Desktop
kernel centos7/vmlinuz
append initrd=centos7/initrd.img ks=http://10.10.10.254/ksdir/ks7_desktop.cfg
label Local
menu label Boot from Local drive #從本地硬盤啟動
menu default #默認啟動選項,光標默認選中此項,timeout時間后默認從此項啟動,建議默認設定為此項,防止60秒等待時間后未經過人工選擇,造成直接進入系統安裝
localboot 0xffff
4、安裝配置DHCP服務
安裝dhcp服務
[root@centos7 ~]#yum -y install dhcp
dhcp服務安裝完成后,默認無法啟動,需要對配置文件進行修改,否則啟動報錯。
默認的配置文件中無內容,根據提示從范例文件復制配置文件進行修改
復制dhcp服務的范例配置文件覆蓋默認配置文件
[root@centos7 ~]#cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
vim編輯修改dhcp服務配置文件,並添加如下內容
[root@centos7 ~]#vim /etc/dhcp/dhcpd.conf
subnet 10.10.10.0 netmask 255.255.255.0 { #dhcp服務器分配的網段需要與本機的固定IP地址位於同一網段 (本機IP為 10.10.10.254)
range 10.10.10.200 10.10.10.250; #指定自動分配的IP地址范圍
option routers 10.10.10.1; #指定網關地址
option domain-name-servers 114.114.114.114,8.8.8.8; #指定DNS服務器地址
option domain-name "test.org"; #DNS搜索域名
next-server 10.10.10.254; #指定TFTP服務器IP(關鍵設定項)
filename "pxelinux.0"; #指定網卡pxe啟動引導文件名(關鍵設定項)
}
啟動dhcp服務,並設置開機啟動
[root@centos7 ~]#systemctl start dhcpd.service
[root@centos7 ~]#systemctl enable dhcpd.service
如啟動成功,dhcp服務將監聽udp 67端口,如發生報錯,則需檢查配置文件。
四、使用客戶端機器安裝系統測試PXE環境
設置客戶端機器BIOS默認從網卡啟動

如能順利進入到啟動菜單選擇界面,則證明DHCP服務工作正常

根據菜單項目,選擇安裝對應的系統,例如選擇centos7.6最小化安裝:

安裝選項及磁盤分區界面

可以看到centos7.6最小化安裝需要裝310個包

centos6.10最小化安裝的過程界面:


至此,整個PXE服務器的搭建過程完成。
注意事項:
1、預先設置關閉並禁用PXE服務器selinux
2、預先關閉並禁用系統防火牆,如考慮安全,需要保持系統防火牆開啟,則需要將HTTP服務、TFTP服務、DHCP服務需要使用到的網絡端口在防火牆中打開,否則客戶端將無法通過網絡訪問相關服務
3、不可在已存在DHCP服務器的網絡內再配置新的DHCP服務器,否則會造成一個網絡內多個DHCP服務器,造成IP地址獲取混亂導致網絡故障。可以直接使用現有的DHCP服務器,修改添加相應的配置文件即可。
4、如通過虛擬機來使用PXE安裝centos7系統,則虛擬機的內存分配需要大於1G以上,否則會出現下圖中錯誤:

