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
过程图:
流程:
① 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文件的路径
拷贝文件到/var/lib/tftpboot 目录
yum -y install syslinux
cp -rf /usr/share/syslinux/* /var/lib/tftpboot # 需要pxelinux.0导入内核及菜单文件(可从光盘镜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