跳转至

PXE环境部署

基础环境准备

我使用的Rocky9.6系统

首先PXE主机需要静态IP地址

vim /etc/NetworkManager/system-connections/eth0.nmconnection

Bash
[connection]
id=eth0
uuid=4975726a-6298-3181-88fe-35c850dc0962
type=ethernet
autoconnect-priority=-999
interface-name=eth0
timestamp=1769617386

[ethernet]

[ipv4]
method=manual
address1=192.168.100.1/24,192.168.100.1

[ipv6]
method=disabled

[proxy]

另外注意宿主机的防火墙配置,我一般把它停掉

systemctl stop firewalld && systemctl disable firewalld

selinux也给停掉

sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

安装基础包

Bash
yum makecache
yum install dhcp-server tftp-server httpd
  • dhcp-server: 负责IP地址分配与指向引导文件,有的DHCP服务包是dhcp
  • tftp: 存放pxelinux配置文件
  • httpd: 负责提供镜像下载服务,也可以配置nginx,或者nfs

配置服务

tftp

引导文件存放路径: /var/lib/tftpboot/

如果安装多版本,可以在这个目录下创建不同的目录,回头引导文件就放在创建的目录

mkdir /var/lib/tftpboot/rocky9.6

修改启动文件路径:vim /usr/lib/systemd/system/tftp.service

ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot/rocky9.6

启动服务

systemctl daemon-reload

systemctl start tftp && systemctl enable tftp

http

创建两个目录,一个存放配置,一个存放系统镜像

mkdir -p /var/www/html/{conf/rocky9.6,iso/rocky9.6}

启动服务

systemctl start httpd && systemctl enable httpd

dhcp

注意:配置dhcp时,需要避开网络内的主DHCP服务,避免网络内有两台DHCP服务在搅和,影响正常网络

编辑配置文件:vim /etc/dhcp/dhcpd.conf

Bash
# 定义客户端架构类
#class "UEFI-64" {
#    match if option vendor-class-identifier = "PXEClient:Arch:00007";
#    filename "shim.efi";
#}
#class "Legacy-BIOS" {
#    match if option vendor-class-identifier = "PXEClient:Arch:00000";
#    filename "pxelinux.0";
#}

# 定义 PXE 相关选项
option space PXE;
option PXE.mtftp-ip    code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;

# 定义客户端架构类型(用于区分 BIOS/UEFI)
option arch code 93 = unsigned integer 16;

subnet 192.168.100.0 netmask 255.255.255.0{
  option routers 192.168.100.1;
  option domain-name-servers 192.168.100.1;
  option subnet-mask 255.255.255.0;
  default-lease-time 86400;
  max-lease-time 86400;
  range 192.168.100.10 192.168.100.200;
  next-server 192.168.100.1;
#  filename "shim.efi";

    # 根据客户端架构(BIOS/UEFI)提供不同的引导文件
    if option arch = 00:07 {  # UEFI x64
        filename "shim.efi";
    } elsif option arch = 00:09 {  # UEFI x64 (新版)
        filename "shim.efi";
    } else {  # 传统 BIOS
        filename "pxelinux.0";
    }
}
#host host_100.10 { hardware ethernet 00:0C:29:A5:2C:96 ; fixed-address 192.168.100.10;}

配置后可以测试一下: dhcpd -t -cf /etc/dhcp/dhcpd.conf

使用dhcpdump工具可以查看客户端架构Arch,来确认UEFI引导

Bash
1
2
3
4
5
6
7
8
9
yum install -y dhcpdump
dhcpdump -i eth0 -h "option93"

示例输出:
# 示例输出:
# TIME: 2023-10-01 10:30:00
#   IP: 192.168.100.10 (0:c:29:xx:xx:xx) 
#   OPTION:  93 (  2) Client System Architecture         0x0007
#   OPTION:  97 (  17) Client Network Interface Identifier

这里先配置,最后在启动

systemctl start dhcpd && systemctl enable dhcpd

准备系统文件

ISO 文件

1、将ISO文件存放在/var/www/html/iso,可以直接挂载,也可以copy,我是准备多系统环境的,就copy了

Bash
1
2
3
4
5
6
7
8
9
# 先挂载ISO
mount /dev/sr0 /mnt/
# 如果是ISO镜像文件可以这样挂载
mount -o loop Rocky-9.6-x86_64-dvd.iso /mnt/
# 注意复制的时候有两个隐藏文件也需要复制(.discinfo .treeinfo)
rsync -avzP /mnt/ /var/www/html/iso/rocky9.6/
# 查看一下
# ls -a /var/www/html/iso/rocky9.6/
.  ..  AppStream  BaseOS  .discinfo  EFI  images  isolinux  LICENSE  media.repo  .treeinfo

准备ks.cfg 配置文件

参考官网的参数更新

Rocky kickstart File

红帽的生成器(需要订阅)

按照需求准备ks.cfg文件,主要区别一下传统BIOS引导与UEFI引导(efi分区),分区不同

centos7.9 ks.cfg

centos7.9 ks_uefi.cfg

Rocky9.6 ks.cfg

Rocky9.6 ks_uefi.cfg

可以使用工具验证配置文件

Bash
yum install pykickstart
ksvalidator ks.cfg

准备引导文件

引导文件放在tftpboot目录,结构如下:

Bash
/var/lib/tftpboot/rocky9.6/
├── shim.efi        # UEFI PXE 引导程序(shim 包提供)
├── BOOTX64.EFI     # UEFI 启动文件(shim 包提供)
├── grub.cfg        # UEFI GRUB 配置文件(手动创建)
├── grubx64.efi     # UEFI GRUB 引导程序(grub2-efi-x64包提供)
├── initrd.img      # 通用 初始 RAM 磁盘(从 ISO 提取)
├── vmlinuz         # 通用 内核文件(从 ISO 提取)
├── ldlinux.c32     # 通用 动态链接库文件,支持菜单功能(syslinux-nonlinux包提供)
├── libcom32.c32    # 通用 动态链接库文件,支持菜单功能(syslinux-nonlinux包提供)
├── libutil.c32     # 通用 动态链接库文件,支持菜单功能(syslinux-nonlinux包提供)
├── menu.c32        # 通用 菜单模块(如果使用图形菜单)(syslinux-nonlinux包提供)
├── vesamenu.c32    # 通用 VESA 图形菜单模块(syslinux-nonlinux包提供)
├── pxelinux.0      # 传统BIOS PXE 引导程序(syslinux-nonlinux包提供)
└── pxelinux.cfg    # 传统BIOS 配置目录(手动创建)
    └── default     # 传统BIOS 默认配置文件(手动创建)

1、去镜像目录复制文件:

Bash
cp /var/www/html/iso/rocky9.6/images/pxeboot/{initrd.img,vmlinuz} \
/var/lib/tftpboot/rocky9.6/

2、从rpm包获取文件

syslinux-nonlinux , shim-x64 , grub2-efi-x64

Bash
# 先创建一个临时目录
mkdir /tmp/pack_tmp
# 将提到的三个包复制到临时目录
cd /var/www/html/iso/rocky9.6
cp BaseOS/Packages/s/syslinux-nonlinux-6.04-0.20.el9.noarch.rpm /tmp/pack_tmp/
cp BaseOS/Packages/s/shim-x64-15.8-2.el9.x86_64.rpm /tmp/pack_tmp/
cp BaseOS/Packages/g/grub2-efi-x64-2.06-104.el9_6.x86_64.rpm /tmp/pack_tmp/
# 到临时目录去解压
cd /tmp/pack_tmp
rpm2cpio syslinux-nonlinux-6.04-0.20.el9.noarch.rpm | cpio -dimv
rpm2cpio grub2-efi-x64-2.06-104.el9_6.x86_64.rpm | cpio -dimv
rpm2cpio shim-x64-15.8-2.el9.x86_64.rpm | cpio -dimv
# 复制syslinux-nonlinux包的文件
cp usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/rocky9.6/
cp usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot/rocky9.6/
cp usr/share/syslinux/libcom32.c32 /var/lib/tftpboot/rocky9.6/
cp usr/share/syslinux/libutil.c32 /var/lib/tftpboot/rocky9.6/
cp usr/share/syslinux/menu.c32 /var/lib/tftpboot/rocky9.6/
cp usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot/rocky9.6/
# 复制shim-x64包的文件
cp boot/efi/EFI/BOOT/BOOTX64.EFI /var/lib/tftpboot/rocky9.6/
cp boot/efi/EFI/rocky/shim.efi /var/lib/tftpboot/rocky9.6/
# 复制grub2-efi-x64包的文件
cp boot/efi/EFI/rocky/grubx64.efi /var/lib/tftpboot/rocky9.6/

3、手动创建两个配置文件

传统BIOS:

mkdir /var/lib/tftpboot/rocky9.6/pxelinux.cfg/

vim /var/lib/tftpboot/rocky9.6/pxelinux.cfg/default

Bash
1
2
3
4
5
default auto
prompt 0
label auto
    kernel vmlinuz
    append inst.ks=http://192.168.100.1/conf/rocky9.6/ks.cfg ksdevice=eth0 initrd=initrd.img inst.lang=en_US.UTF-8 net.ifnames=0 biosdevname=0 ip=dhcp

UEFI配置:

vim /var/lib/tftpboot/rocky9.6/grub.cfg

Bash
1
2
3
4
5
set timeout=5
menuentry "Install Rocky Linux 9.6 (UEFI Secure Boot)" {
  linuxefi vmlinuz inst.ks=http://192.168.100.1/conf/rocky9.6/ks_uefi.cfg ksdevice=eth0 inst.lang=en_US.UTF-8 net.ifnames=0 biosdevname=0 ip=dhcp
  initrdefi initrd.img
}

准备安装了

最后准备好文件,别忘记给权限,这里直接777了,(避免出现各种异常)

Bash
1
2
3
4
5
6
chmod -R 777 /var/lib/tftpboot/

systemctl daemon-reload
systemctl restart tftp && systemctl enable tftp
systemctl restart httpd && systemctl enable httpd
systemctl restart dhcpd && systemctl enable dhcpd

去验证安装~

Tips:

红帽参考文档