1,PXE原理 

PXE环境依赖于行业标准Internet协议的组合,即UDP / IP,DHCP和TFTP。已经选择了这些协议,因为它们是在客户端的网卡固件容易实现,从而标准化的小足迹 PXE光盘。标准化,小尺寸PXE固件映像及其低资源使用是一些主要的设计目标,允许PXE标准的客户端在各种系统上相同地实现,从强大的客户端计算机到资源有限的单板计算机(SBC)和片上系统(SoC)计算机。

DHCP用于提供适当的客户端网络参数,特别是TFTP服务器托管,准备下载,初始引导程序(NBP)和补充文件的位置(IP地址)。要启动PXE引导会话,客户端的PXE固件的DHCP组件将进行广播DHCPDISCOVER数据包,包含端口67 / UDP(DHCP服务器端口)的PXE特定选项; 它要求所需的网络配置和网络引导参数。PXE特定选项将启动的DHCP事务标识为PXE事务。标准DHCP服务器(未启用PXE)将能够使用携带网络信息(即IP地址)的常规DHCPOFFER进行应答,但不能使用PXE特定参数进行应答。如果PXE客户端仅从未启用PXE的DHCP服务器收到应答,则无法启动。

解析支持PXE的DHCP服务器DHCPOFFER后,客户端将能够根据收到的TFTP服务器IP地址和名称,设置自己的网络IP地址,IP掩码等,并指向网络所在的引导资源。 NBP。客户端接下来使用TFTP 将NBP传输到其自己的随机存取存储器(RAM)中,可能验证它(即UEFI 安全启动),最后从它启动。NBP只是引导链过程中的第一个链接,它们通常通过TFTP请求一小组补充文件,以便运行简约的OS执行程序(即WindowsPE,或基本的Linux内核 + initrd))。小型OS执行程序加载自己的网络驱动程序和TCP / IP堆栈。此时,引导或安装完整操作系统所需的其余指令不是通过TFTP提供的,而是使用强大的传输协议(例如HTTP,CIFS或NFS)。

https://en.wikipedia.org/wiki/Preboot_Execution_Environment

  过程图:

   image.png

流程: 

①    PXE 客户端发送UDP广播请求

  PXE 客户端从自己的PXE网卡启动,通过PXE BootROM(自启动芯片)会以UDP(简单用户数据报协议)发送一个广播请求,向本网络中的DHCP服务器索取IP。
②   DHCP服务器提供信息
  DHCP服务器收到客户端的请求,验证是否来至合法的PXE 客户端的请求,验证通过它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、pxelinux启动程序(TFTP)位置,以及配置文件所在位置。
③  PXE客户端请求下载启动文件
  客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等文件。
④  TETP服务器响应客户端请求并传送文件
  当服务器收到客户端的请求后,他们之间之后将有更多的信息在客户端与服务器之间作应答, 用以决定启动参数。BootROM由TFTP通讯协议从tftp服务器 下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。
⑤  请求下载自动应答文件
  客户端通过pxelinux.cfg/default文件成功的引导Linux安装内核后,安装程序首先必须确定你通过什么安装介质来安装linux,如果是通过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络,并定位安装源位置。接着会读取default文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。
⑥  客户端安装操作系统
  将ks.cfg文件下载回来后,通过该文件找到http镜像,并按照该文件的配置请求下载安装过程需要的软件包。
  http镜像和客户端建立连接后,将开始传输软件包,客户端将开始安装操作系统


2,基本操作

    1)tftp的安装及配置

cat  /etc/xinetd.d/tftp service tftp
{socket_type = dgramprotocol = udpwait = yesuser = rootserver = /usr/sbin/in.tftpdserver_args = -s /var/lib/tftpbootdisable = no     #需修改为no per_source = 11cps = 100 2flags = IPv4
}

  必须的文件:

• 引导文件 - pxelinux.0
• 内核文件:vmlinuz    initrd.img   (挂载光盘在iso中获取)
• 引导菜单:isolinux.cfg       改名生成   /var/lib/tftpboot/pxelinux.cfg/default  并重新配置

 如:

[root@source /var/lib/tftpboot] # cat  pxelinux.cfg/default 
default vesamenu.c32
timeout 600
menu title  #### PXE Boot  Menu  ####label  1menu label ^Install CentOS 7 x64 
menu   default
kernel vmlinuz
append initrd=initrd.img  ip=dhcp   inst.ks=   #指定ks文件的路径

  1. 拷贝文件到/var/lib/tftpboot 目录
    yum  -y  install  syslinux  
    cp -rf /usr/share/syslinux/*   /var/lib/tftpboot   # 需要pxelinux.0

  2. 导入内核及菜单文件(可从光盘镜ISO像中拷贝)
       内核文件:vmlinuz     initrd.img
       引导菜单配置文件:isolinux.cfg--→  pxelinux.cfg/default
       系统自带的两种窗口模块之一:vesamenu.c32 (必须)
       窗口提示信息文件:boot.msg(可选)
       窗口背景图片:splash.png(可选)

kickstart 文件可以根据 root用户/root下anaconda-ks.cfg 修改,也可使用system-config-kickstart  图形配置生成。
Kickstart 文件 使用 ksvalidator进行验证。

参考:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-howto#sect-kickstart-installation-starting

ks文件 概览

[root@source /var/ftp/pub] # cat  ks.cfg 
#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard 'us'
# Root password
rootpw --iscrypted $1$Xn4pvDTh$qqqGHsPCHomsp88ZRR6/H/
# Use network installation
# 此处指定 安装系统的镜像源,即根目录
url --url="      
# System language
lang en_US
# Firewall configuration
firewall --disabled
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use text mode install
text
# SELinux configuration
selinux --disabled
# Do not configure the X Window System
skipx# Network information
network  --bootproto=dhcp --device=eth0
# Reboot after installation
reboot
# System timezone
timezone Africa/Abidjan
# System bootloader configuration
bootloader --location=mbr
# Partition clearing information
clearpart --all --initlabel
# Disk partitioning information
part /boot --fstype="xfs" --size=2048
part / --fstype="xfs" --grow --size=1


dhcp 配置

subnet 192.168.36.0 netmask 255.255.255.0 {range 192.168.36.100 192.168.36.120;option routers 192.168.36.1;default-lease-time 600;max-lease-time 7200;next-server  192.168.36.1;   #pxelinux.0的位置filename "pxelinux.0" ;   #重点
}

###在多网卡的情况下绑定网卡启动DHCP服务 (指定服务监听的端口,未测试)
cat /usr/lib/systemd/system/dhcpd.service
[Service] 

Type=notify ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group  dhcpd --no-pid eno33554984