PXE(Preboot eXecution Environment,预启动执行环境)提供了一种通过网络接口启动计算机,不依赖本地存储设备(如硬盘)或本地已安装的操作系统。
PXE 常与 kickstart 搭配使用来批量自动化安装系统,实际上 Cobbler 程序就是 PXE 的一种封装。
PXE 特性:
- 由 Intel 和 Systemsoft 公司于 1999 年 9 月 20 日公布 2.1 版本
- C/S 的工作模式
- PXE Cient 会调用网际协议 (IP)、用户数据报协议 (UDP)、动态主机设定协议 (DHCP)、小型文件传输协议 (TFTP) 等
环境
属性 | 值 |
---|---|
操作系统 | CentOS Linux release 7.5.1804 (Core) |
服务端地址 | 192.168.15.100 |
光盘镜像 | CentOS-7-x86_64-DVD-1804.iso |
原理
标准的 C/S 结构,只依赖常见的 DHCP TFTP (HTTP) 服务。
部署
需要部署的服务如下,推荐按下述的顺序进行配置。
DHCP 服务
DHCP 服务为 PXE 客户端提供地址,需要注意的是如果网络内存在其他的 DHCP 服务器,需要停用,或者使用独立的子网进行配置,防止地址分配冲突。
安装 DHCP
sudo yum install -y dhcp
配置 DHCP
sudo vim /etc/dhcp/dhcpd.conf
修改或添加以下字段
option space pxelinux;
option pxelinux.magic code 208 = string;
option pxelinux.configfile code 209 = text;
option pxelinux.pathprefix code 210 = text;
option pxelinux.reboottime code 211 = unsigned integer 32;
option architecture-type code 93 = unsigned integer 16;
subnet 192.168.15.0 netmask 255.255.255.0 {
option routers 192.168.15.2;
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.15.2;
option time-offset -18000;
range dynamic-bootp 192.168.15.60 192.168.15.100;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.15.100;
if option architecture-type = 00:07 {
filename "uefi/shim.efi";
} else {
filename "pxelinux/pxelinux.0";
}
}
}
小贴士:复制时记得移除注释信息。
参数解析:
参数 | 解析 |
---|---|
option routers | 网关 |
option subnet-mask | 子网掩码 |
option domain-name-servers | DNS 搜索域 |
time-offset | 美国东部标准时间 (UTC -4) |
range dynamic-bootp | 将要部署的 DHCP 区段 |
next-server | 下一跳指为 PXE 服务端地址 |
配置策略
sudo systemctl enable dhcpd
TFTP 服务
TFTP 简单文件传输服务为 PXE 客户端提供网络启动所需的镜像和虚拟磁盘文件等,保证系统安装所需的临时系统可以正常加载。
安装 TFTP
sudo yum install -y tftp-server tftp
配置 TFTP
默认的存储目录是 /var/lib/tftpboot/
,不需要也不推荐进行修改,后期将所需的文件放置在此目录即可。
xinetd 服务
xinetd 扩展网络服务守护服务,它会监听网络请求而自动启动相应的服务程序,而不再需要手动启动服务。
安装 xinetd
sudo yum install -y xinetd
配置 xinetd
参数 disable
默认是 yes
,改为 no
即可,其他保持默认。
# sudo 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
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
配置策略
sudo systemctl enable xinetd
HTTP 服务
安装 httpd
sudo yum install -y httpd
默认的网站存储目录是 /var/www/html
,使用 httpd 为 PXE 客户端提供 ks 文件(用于可访问外网环境),或者也可用来提供完整的安装镜像(用于纯内网环境)。
小贴士:如果需要内网提供镜像,只需下载 CentOS 7 DVD 版本镜像,直接挂载在 /var/www/html
即可。
配置策略
sudo systemctl enable httpd
firewalld 服务
如果系统开启了防火墙,那么需要为上述的服务开放防火墙对应的端口,以便 PXE 客户端能正确获取 IP 和获取引导文件。
sudo firewall-cmd --add-service=tftp --permanent
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload
也可以直接禁用防火墙
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
PXE 引导系统
接下来准备系统安装时临时系统的文件准备工作,需要将目录分为两部分:
类别 | 目录 |
---|---|
UEFI | /var/lib/tftpboot/uefi/ |
Legacy | /var/lib/tftpboot/pxelinux/ |
netboot 文件
如果当前系统是 UEFI 引导的,那么相关的 UEFI 引导文件可直接从系统里复制(如果没有可以手动安装或者下载这两个包进行提取)。
补充:安装包下载和提取步骤说明
下载安装包可以使用命令sudo yum install --downloadonly [包名]
,然后在目录/var/cache/yum/x86_64/7/base/packages/
里可以看到安装包;
提取安装包可以使用命令rpm2cpio syslinux-4.05-15.el7.x86_64.rpm | cpio -dimv
会将包内文件提取至当前目录,建议先进入空目录后执行,包名使用绝对路径。
rpm -ql grub2-efi-x64
rpm -ql shim-x64
将 grubx64.efi
和 shim.efi
复制到存储目录
sudo mkdir /var/lib/tftpboot/uefi/
sudo cp /boot/efi/EFI/centos/grubx64.efi /var/lib/tftpboot/uefi/
sudo cp /boot/efi/EFI/centos/shim.efi /var/lib/tftpboot/uefi/
准备引导配置文件
cat <<EOF | sudo tee /var/lib/tftpboot/uefi/grub.cfg
set timeout=10
menuentry 'CentOS Linux (3.10.0) 7 (Core)' {
linuxefi images/CentOS-7/vmlinuz ip=dhcp ks=http://192.168.15.100/anaconda-ks.cfg
initrdefi images/CentOS-7/initrd.img
}
EOF
小贴士:ks 配置文件在实际使用前可使用浏览器访问测试一遍,另外如果网络地址有差异,注意替换为实际使用的地址。
配置引导文件权限
sudo chmod 644 /var/lib/tftpboot/uefi/grub.cfg
sudo chmod 755 /var/lib/tftpboot/uefi/{grubx64.efi,shim.efi}
然后准备 Legacy 引导文件
sudo mkdir /var/lib/tftpboot/pxelinux/
cd /var/lib/tftpboot/pxelinux/
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/boot.msg
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/initrd.img
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/memtest
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/vesamenu.c32
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/vmlinuz
然后按上述的方法下载安装包 syslinux
,解压后复制其中的引导文件。
sudo cp usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux/
创建默认引导配置
sudo mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg
写入配置
cat <<EOF | sudo tee /var/lib/tftpboot/pxelinux/pxelinux.cfg/default
default vesamenu.c32
timeout 60
display boot.msg
menu clear
menu title CentOS 7
menu vshift 8
menu rows 18
menu margin 8
menu helpmsgrow 15
menu tabmsgrow 13
menu color border * #00000000 #00000000 none
menu color sel 0 #ffffffff #00000000 none
menu color title 0 #ff7ba3d0 #00000000 none
menu color tabmsg 0 #ff3a6496 #00000000 none
menu color unsel 0 #84b8ffff #00000000 none
menu color hotsel 0 #84b8ffff #00000000 none
menu color hotkey 0 #ffffffff #00000000 none
menu color help 0 #ffffffff #00000000 none
menu color scrollbar 0 #ffffffff #ff355594 none
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none
menu tabmsg Press Tab for full configuration options on menu items.
menu separator # insert an empty line
menu separator # insert an empty line
label linux
menu label ^Install CentOS 7
menu default
kernel vmlinuz
append initrd=initrd.img ip=dhcp ks=http://192.168.15.100/anaconda-ks.cfg
menu separator
menu begin ^Troubleshooting
menu title Troubleshooting
label vesa
menu indent count 5
menu label Install CentOS 7 in ^basic graphics mode
text help
Try this option out if you're having trouble installing
CentOS 7.
endtext
kernel vmlinuz
append initrd=initrd.img xdriver=vesa nomodeset ip=dhcp ks=http://192.168.15.100/anaconda-ks.cfg
label rescue
menu indent count 5
menu label ^Rescue a CentOS system
text help
If the system will not boot, this lets you access files
and edit config files to try to get it booting again.
endtext
kernel vmlinuz
append initrd=initrd.img rescue quiet
label memtest
menu label Run a ^memory test
text help
If your system is having issues, a problem with your
system's memory may be the cause. Use this utility to
see if the memory is working correctly.
endtext
kernel memtest
menu separator
label local
menu label Boot from ^local drive
localboot 0xffff
menu separator
menu separator
label returntomain
menu label Return to ^main menu
menu exit
menu end
EOF
kickstart 配置
准备自动化部署文件,如果不熟悉语法可以重新安装一个系统,然后从系统 /root/anaconda-ks.cfg
处复制即可获取安装配置模板。
或者直接使用下面的模板,已经配置了软件网络安装源,只要机器有外网或者支持 NAT 网络可以直接从网络安装系统,并且安装系统后自动重启,并创建管理员账户,密码可以根据需要自行修改。
cat <<EOF | sudo tee /var/www/html/anaconda-ks.cfg
#version=DEVEL
auth --enableshadow --passalgo=sha512
#graphical
text
reboot
firstboot --enable
ignoredisk --only-use=sda
keyboard --vckeymap=us --xlayouts='us'
lang en_US.UTF-8
network --bootproto=dhcp --device=ens33 --ipv6=auto --activate
network --hostname=localhost.localdomain
url --url="https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64"
rootpw --lock
services --enabled="chronyd"
timezone Asia/Shanghai --isUtc
user --groups=wheel --name=kane --password=$6$sidR6Za.DSGSPQk7$NxHM9VvYAgjcMYlYBcvLkAdfdPRkJ72N8i3w16Ft0NNC22lOPS8dUhWEJMOHGNJyePOSuAEX3Smq5GaLVfTuh. --iscrypted --gecos="kane"
bootloader --location=mbr --boot-drive=sda
autopart
clearpart --none --initlabel
%packages
@^minimal
@core
chrony
%end
%addon com_redhat_kdump --disable --reserve-mb='auto'
%end
%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end
EOF
小贴士:配置文件的密码部分有变量符,因此需要手动粘贴进去,否则会导致无法登录。
引导镜像
PXE 安装系统时需要使用临时引导文件,这几个文件可以从安装镜像内提取,也可以从网络镜像源中下载。
sudo mkdir -p /var/lib/tftpboot/images/CentOS-7/
cd /var/lib/tftpboot/images/CentOS-7/
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/initrd.img
sudo wget https://mirrors.tuna.tsinghua.edu.cn/centos/7/os/x86_64/isolinux/vmlinuz
检查
上述所有引导所需文件准备妥当后,可以按下述命令进行检查数量和结构($
后为检查命令):
$ ls /var/www/html/ ## 一个文件
anaconda-ks.cfg
$ ls /var/lib/tftpboot/images/CentOS-7/ ## 两个文件
initrd.img vmlinuz
$ ls /var/lib/tftpboot/uefi/ ## 三个文件
grub.cfg grubx64.efi shim.efi
$ ls /var/lib/tftpboot/pxelinux/ ## 六个文件一个目录
boot.msg initrd.img memtest pxelinux.0 pxelinux.cfg vesamenu.c32 vmlinuz
检查无误后即可进行下面的步骤。
sudo systemctl start dhcpd.service xinetd.service httpd.service
启动所有服务,测试虚拟机安装。
测试
以虚拟机为例,创建新机器进行自动化安装测试,需要注意的是在 macOS 上虚拟磁盘默认是 NVMe 协议,需要手动改为 SATA 否则会识别不到自动安装的硬盘,同时记得切换网络至用户创建的子网上,删除创建虚拟机时选择的 CD 光盘。
看到此界面后完全不需要操作,等待时间后会自动开始安装,为方便截图,执行上述操作时手动打断了倒计时。
附录
参考链接
- Preboot Execution Environment - 维基百科
- Preparing for a Network Installation - CentOS Docs
- Kickstart 中的软件包选择 - Red Hat Customer Portal
- 浅谈 PXE 和 iPXE - 知乎
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2023-12-19 18:00 PM