一、簡介
1、什么是PXE
PXE(preboot execute environment,預啟動執行環境)是由Intel公司開發的最新技術,工作於Client/Server的網絡模式,支持工作站通過網絡從遠端服務器下載映像,並由此支持通過網絡啟動操作系統,在啟動過程中,終端要求服務器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)協議下載一個啟動軟件包到本機內存中執行,由這個啟動軟件包完成終端(客戶端)基本軟件設置,從而引導預先安裝在服務器中的終端操作系統。PXE可以引導多種操作系統。
嚴格來說,PXE 並不是一種安裝方式,而是一種引導方式。進行 PXE 安裝的必要條件是在要安裝的計算機中必須包含一個 PXE 支持的網卡(NIC),即網卡中必須要有 PXE Client。PXE 協議可以使計算機通過網絡啟動。此協議分為 Client端和 Server 端,而PXE Client則在網卡的 ROM 中。當計算機引導時,BIOS 把 PXE Client 調入內存中執行,然后由 PXE Client 將放置在遠端的文件通過網絡下載到本地運行。運行 PXE 協議需要設置 DHCP 服務器和 TFTP 服務器。DHCP 服務器會給 PXE Client(將要安裝系統的主機)分配一個 IP 地址,由於是給 PXE Client 分配 IP 地址,所以在配置 DHCP 服務器時需要增加相應的 PXE 設置。此外,在 PXE Client 的 ROM 中,已經存在了 TFTP Client,那么它就可以通過 TFTP 協議到 TFTP Server 上下載所需的文件了。
PXE的工作過程:
1)、 PXE Client 從自己的PXE網卡啟動,向本網絡中的DHCP服務器索取IP;
2)、DHCP 服務器返回分配給客戶機的IP * 以及PXE文件的放置位置(該文件一般是放在一台TFTP服務器上) ;
3)、PXE Client 向本網絡中的TFTP服務器索取pxelinux.0 文件;
4)、PXE Client 取得pxelinux.0 文件后之執行該文件;
5)、 根據pxelinux.0 的執行結果,通過TFTP服務器加載內核和文件系統 ;
6)、 進入安裝畫面, 此時可以通過選擇HTTP、FTP、NFS 方式之一進行安裝;
詳細工作流程,請參考下面這幅圖:

要達成PXE必須要有兩個環節:
(1)一個是客戶端的網卡必須要支持PXE用戶端功能,並且開機時選擇從網卡啟動,這樣系統才會以網卡進入PXE客戶端的程序;
(2)一個是PXE服務器必須要提供至少含有DHCP以及TFTP的服務!
其中:
- DHCP服務必須要能夠提供客戶端的網絡參數,還要告知客戶端TFTP所在的位置;
- TFTP則提供客戶端的boot loader及kernel file下載路徑。
還要加上NFS/FTP/HTTP(選擇一樣即可)等提供安裝文件(安裝鏡像的解壓文件),才算是比較完整的PXE服務器。一般TFTP和DHCP服務都由同一台服務器提供,且大多數時候還提供NFS/FTP/HTTP服務,所以PXE服務器一般是提供3合一的服務
2、什么是Kickstart
Kickstart是一種無人值守的安裝方式。它的工作原理是在安裝過程中記錄典型的需要人工干預填寫的各種參數,並生成一個名為ks.cfg的文件。如果在安裝過程中(不只局限於生成Kickstart安裝文件的機器)出現要填寫參數的情況,安裝程序首先會去查找Kickstart生成的文件,如果找到合適的參數,就采用所找到的參數;如果沒有找到合適的參數,便需要安裝者手工干預了。所以,如果Kickstart文件涵蓋了安裝過程中可能出現的所有需要填寫的參數,那么安裝者完全可以只告訴安裝程序從何處取ks.cfg文件,然后就去忙自己的事情。等安裝完畢,安裝程序會根據ks.cfg中的設置重啟系統,並結束安裝。
PXE+Kickstart 無人值守安裝操作系統完整過程如下:


滿足Kickstart安裝系統的需求
- 網卡必須支持PXE引導;
- 客戶端需要有與Kickstart 通信的IP地址,這里一般都是通過DHCP自動分配IP地址來實現;
- 提供引導所需的文件,內核文件,內核鏡像文件等,此時一般通過tftp-server等實現;
- kickstart文件,它主要實現自動化安裝的過程,比如配置主機名、添加用戶、安裝系統后相關操作;
- 提供安裝源,一般就是NFS/ftp/httpd等;
總結: 通過如上需求,我們就知道需要安裝的相關服務,如DHCP/tftp-server/syslinux/kickstart/vsftpd等;
二、環境介紹及初紹化
1、環境介紹
- 操作系統:CentOS Linux release 7.4.1708 (Core)
- 網卡地址:192.168.10.7/24
- 光盤鏡像:CentOS-7-x86_64-DVD-1708.iso
- 安裝工具:kickstart + dhcp + tftp-server + tftp + httpd
- Workstaion網絡:VMNet3
2、准備工作
1、服務器禁用SElinux,然后進行重啟操作
[root@kickstart ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@kickstart ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g'
/etc/selinux/config
[root@kickstart ~]# setenforce 0
[root@kickstart ~]# systemctl reboot
[root@kickstart ~]# getenforce
Permissive
2、關閉防火牆及清空策略
[root@kickstart ~]# systemctl stop firewalld.service
[root@kickstart ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@kickstart ~]# iptables -F
[root@kickstart ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@kickstart~]#
3、軟件安裝
[root@kickstart ~]# yum install -y httpd dhcp tftp-server tftp syslinux
[root@kickstart ~]# rpm -q httpd dhcp tftp-server tftp syslinux
httpd-2.4.6-67.el7.centos.x86_64
dhcp-4.2.5-58.el7.centos.x86_64
tftp-server-5.2-13.el7.x86_64
tftp-5.2-13.el7.x86_64
syslinux-4.05-13.el7.x86_64
三、各組件配置及准備
一)DHCP服務配置
1、修改dhcpd配置文件
[root@kickstart ~]# cp -rf /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf
[root@kickstart ~]# egrep -v "^#|^$" /etc/dhcp/dhcpd.conf
option domain-name "
contoso.com";
option domain-name-servers ns1.contoso.com, contoso.com;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 192.168.10.0 netmask 255.255.255.0 { //服務端IP網段及掩碼
option routers 192.168.10.254; //網關
option subnet-mask 255.255.255.0; //掩碼
option domain-name-servers 192.168.10.2;
r
ange dynamic-bootp 192.168.10.100 192.168.10.120; //dhcp分發的地址范圍
default-lease-time 21600;
//設置默認的IP租用期限
max-lease-time 43200;
//設置最大的IP租用期限
next-server 192.168.10.7; //TFTP服務器地址
filename "pxelinux.0"; //指定引導文件位置,這里是TFTP根目錄下的pxelinux.0
}
2、啟動dhcpd服務,並設置為開機啟動
[root@ kickstart ~]# systemctl start dhcpd.service
[root@ kickstart ~]# systemctl enable dhcpd.service
3、dhcp服務端口查看
[root@kickstart ~]# ss -nulp | grep dhcpd
UNCONN 0 0 *:44810 *:* users:(("
dhcpd",pid=5197,fd=20))
UNCONN 0 0 *:67 *:* users:(("
dhcpd",pid=5197,fd=7))
UNCONN 0 0 :::5138 :::* users:(("
dhcpd",pid=5197,fd=21))
二)Httpd服務配置
1、目錄建立及光盤掛載
[root@kickstart ~]# mkdir -pv /var/www/html/CentOS7
[root@kickstart ~]# mount --bind /media/cdrom/ /var/www/html/CentOS7/
2、啟動httpd服務,並設置為開機啟動
[root@ kickstart ~]# systemctl start httpd.service
[root@ kickstart ~]# systemctl enable httpd.service
3、httpd服務端口查看
[root@kickstart ~]# ss -tnl | grep 80
LISTEN 0 128 :::
80
[root@kickstart ~]# lftp http://192.168.10.7/CentOS7
//用lftp對CentOS7進行測試
cd: received redirection to `http://192.168.10.7/CentOS7/'
cd ok, cwd=/CentOS7
lftp 192.168.10.7:/CentOS7> ls
drwxr-xr-x -- /
-rw-r--r-- -- CentOS_BuildTag
drwxr-xr-x -- EFI
-rw-r--r-- -- EULA
-rw-r--r-- -- GPL
drwxr-xr-x -- LiveOS
drwxr-xr-x -- Packages
-rw-r--r-- -- RPM-GPG-KEY-CentOS-7
-rw-r--r-- -- RPM-GPG-KEY-CentOS-Testing-7
-rw-r--r-- -- TRANS.TBL
drwxr-xr-x -- images
drwxr-xr-x -- isolinux
drwxr-xr-x -- repodata
lftp 192.168.10.7:/CentOS7>
三)tftp服務配置
1、配置xinetd
[root@kickstart ~]# vim /etc/xinetd.d/tftp
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot //修改tftp的根目錄
disable = no //認disable是yes的,把它改為no即可
per_source = 11
cps = 100 2
flags = IPv4
}
2、確保tftp.socket正常
[root@kickstart ~]#
systemctl start tftp.socket
[root@kickstart ~]#
systemctl enable tftp.socket
Created symlink from /etc/systemd/system/sockets.target.wants/tftp.socket to /usr/lib/systemd/system/tftp.socket.
[root@kickstart ~]# systemctl status tftp.socket
● tftp.socket - Tftp Server Activation Socket
Loaded: loaded (/usr/lib/systemd/system/tftp.socket; enabled; vendor preset: disabled)
Active:
active (listening) since Thu 2017-12-28 01:56:55 CST; 2min 29s ago
Listen: [::]:69 (Datagram)
Dec 28 01:56:55 kickstart.contoso.com systemd[1]: Listening on Tftp Server Activation Socket.
Dec 28 01:56:55 kickstart.contoso.com systemd[1]: Starting Tftp Server Activation Socket
3、然后啟動tftp.service
[root@kickstart ~]# systemctl start tftp.service
[root@kickstart ~]# systemctl enable tftp.service
[root@kickstart ~]# systemctl status tftp.service
● tftp.service - Tftp Server
Loaded: loaded (/usr/lib/systemd/system/tftp.service; indirect; vendor preset: disabled)
Active:
active (running) since Thu 2017-12-28 02:04:32 CST; 20s ago
Docs: man:in.tftpd
Main PID: 1777 (in.tftpd)
CGroup: /system.slice/tftp.service
└─1777 /usr/sbin/in.tftpd -s /var/lib/tftpboot
[root@kickstart ~]# ss -unlp | grep 69 //端口為UDP:69
UNCONN 0 0
:::69 :::* users:(("systemd",pid=1,fd=42))
3、導入必要的引導文件
需要導入TFTP服務器的主要文件有:
- 引導文件 - pxelinux.0
- 內核文件:vmlinuz initrd.img
- 引導菜單:isolinux.cfg -- 開機后選擇啟動項的菜單文
- 引導文件pxelinux.0 由軟件包syslinux生成,安裝syslinux軟件包
[root@kickstart ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/ //boot loader文件
- 導入內核及菜單文件
內核文件:
vmlinuz initrd.img
引導菜單配置文件: isolinux.cfg
系統自帶的兩種窗口模塊之一:vesamenu.c32
窗口提示信息文件:boot.msg
窗口背景圖片:splash.png
[root@kickstart pxeboot]#
cp /media/cdrom/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/ //導入內核文件
[root@kickstart ~]# cp /media/cdrom/isolinux/{vesamenu.c32,boot.msg,splash.png} /var/lib/tftpboot/
[root@kickstart ~]# cp /usr/share/syslinux/{chain.c32,mboot.c32,menu.c32,memdisk} /var/lib/tftpboot/
[root@kickstart ~]# mkdir /var/lib/tftpboot/pxelinux.cfg/ //新建pxelinux.cfg文件夾
[root@kickstart ~]# ls /var/lib/tftpboot/
//查看目錄下准備的文件
boot.msg chain.c32 initrd.img mboot.c32 memdisk menu.c32 pxelinux.0
pxelinux.cfg splash.png vesamenu.c32 vmlinuz
- 復制文件進行修改
[root@kickstart ~]#
cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
[root@kickstart ~]# vim /var/lib/tftpboot/pxelinux.cfg/default
[root@kickstart ~]#
cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
[root@kickstart ~]# vim /var/lib/tftpboot/pxelinux.cfg/default
//修改引導菜單選項:
[root@pxe1 pxelinux.cfg]# vim /var/lib/tftpboot/pxelinux.cfg/default
//首先修改菜單等待時間
timeout 600 //菜單顯示等待時間,單位為1/10秒,默認等待60秒。
//修改菜單等待時間為60,即等待6秒,若無操作則進入默認菜單;
timeout 600
//然后修改顯示菜單,找到文件中的以下部分
label linux
menu label ^Install CentOS Linux 7
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet
label check
menu label Test this ^media & install CentOS Linux 7
menu default
kernel vmlinuz
append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet
# 將其修改為
label linux
menu label ^Install CentOS 7
kernel vmlinuz
append initrd=initrd.img
label linux 2
menu label ^Install CentOS 7 by Kickstart
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.10.7/CentOS7
inst.ks=http://192.168.10.7/CentOS7.cfg
label linux 3
menu label ^Install CentOS 7 by Kickstart_Min
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.10.7/CentOS7 inst.ks=http://192.168.10.7/CentOS7Min.cfg
- 將CentOS7.kfg放到/var/www/html目錄下面,CentOS7. cfg文件內容如下:
[root@kickstart html]# cat CentOS7.cfg
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# Root password
rootpw --iscrypted $1$xBL2ptUE$hJOPvy.dysetezxpEXCaL0
# Use network installation
url --url="http://192.168.10.7/CentOS7"
//指定網絡安裝的服務地址及目錄
# System language
lang en_US.UTF-8 --addsupport=zh_CN.UTF-8
//語言
# Firewall configuration
firewall --disabled
# System authorization information
auth --useshadow --passalgo=sha512
# Use graphical install
graphical
firstboot --disable
# SELinux configuration
selinux --disabled
# Network information
network --bootproto=dhcp --device=ens33 --onboot=yes --noipv6 --activate
//啟動並激活網卡的名稱
network --hostname=Centos7.contoso.com
//設置主機名
# Reboot after installation
reboot
# System timezone
timezone Asia/Shanghai --isUtc --nontp
//設置時區
user --groups=wheel --name=tony --gecos="tony"
//增加tony用戶
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
# Clear the Master Boot Record
zerombr
//清除mbr信息
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
//磁盤為50G的硬盤,這里根據自己來進行修改
part /boot --fstype="xfs" --size=200
part / --fstype="xfs" --size=20480
part swap --fstype="swap" --size=2048
part /usr --fstype="xfs" --size=20480
part /tmp --fstype="xfs" --grow --size=1
%packages
@base
@compat-libraries
@desktop-debugging
@development
@dial-up
@fonts
@gnome-apps
@gnome-desktop
@legacy-x
@platform-devel
@remote-desktop-clients
@x11
vinagre
%end
說明:生成kickstart文件時,需要安裝通過yum -y install system-config-kickst 安裝此軟件包,安裝的軟件包之前,首先需要repo文件中第一行寫成
[development],括號中建議填寫development,填寫其他內容會導致后面system-config-kickstart命令生成kickstart文件文件時無法選擇軟件包
四、驗證自動化安裝
啟動之前准備的客戶端虛擬機查看是否可以正常顯示引導菜單,是否可以正常獲取initrd.img和vmlinuz內核文件。
若配置正常,會看到之前配置的引導菜單出現:

先擇第二項, 按
Enter鍵后,會出現獲取內核文件的界面:

正常獲取獲取ks文件之后,若正常進入自動安裝界面,如下圖所示,等待系統安裝完成即可

注意:若要安裝圖形界面,選擇內存時盡量大點(實驗中我選擇2GB),若太小的話,估計會報相關錯誤!