准备
- 系统为 Rocky 8.10
- 系统 YUM 源可用
- PXE 服务器的 IP 为 192.168.255.254/24。主机名为
pxe.example.com - 所有客户端系统内存配置至少 4 G
PXE 流程
- 客户端通过 DHCP 服务获取 IP 地址、启动加载器的位置(下一步通过 TFTP 服务下载);
- 客户端通过 TFTP 服务下载启动加载器及其配置文件,启动加载器的配置文件中记载了 Linux 系统 ISO 安装过程中所需文件的位置(下一步通过 HTTPD 服务下载),文件一般为系统 ISO 文件和自动化安装的应答文件(Kickstart 文件);
- 客户端通过 HTTPD 服务下载所需文件并通过预配置的自动化应答文件进行自动化部署。
关闭 Firewalld 和 SELinux
[root@pxe ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@pxe ~]# grubby --update-kernel ALL --args selinux=0
# 配置完重启系统
[root@pxe ~]# reboot
配置 DHCP 服务
安装 DHCP 服务
[root@pxe ~]# dnf -y install dhcp-server
准备 DHCP 服务配置文件
复制如下内容到 /etc/dhcp/dhcpd.conf。(IP 根据实际情况修改)
这个配置的 DHCP 服务可以自动识别 BIOS 和 UEFI 启动模式。
[root@pxe ~]# cat <<-EOF > /etc/dhcp/dhcpd.conf
option architecture-type code 93 = unsigned integer 16;
subnet 192.168.255.0 netmask 255.255.255.0 {
range 192.168.255.100 192.168.255.200;
option domain-name-servers pxe.example.com;
option domain-name "example.com";
option routers 192.168.255.254;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.255.254;
if option architecture-type = 00:07 {
filename "UEFI/BOOTX64.EFI";
}
else {
filename "BIOS/pxelinux.0";
}
}
#class "httpclients" {
# match if substring (option vendor-class-identifier, 0, 10) = "HTTPClient";
# option vendor-class-identifier "HTTPClient";
# filename "http://192.168.124.2/redhat/EFI/BOOT/BOOTX64.EFI";
#}
}
EOF
准备 HTTP 服务
安装 HTTP 服务
[root@pxe ~]# dnf -y install httpd
制作镜像源和 Kickstart 文件源
镜像源配置
无需修改 http 服务的配置文件,直接在 /var/www/html 下制作源即可。
将要安装的镜像挂载进系统,将镜像内的文件全部复制到 /var/www/html 下(包括隐藏文件,可以在 /var/www/html 下创建子目录便于分类),以 Rocky 8.10 为例
#创建 Rocky 8.10 的指定目录
[root@pxe ~]# mkdir -p /var/www/html/iso
#假设镜像挂载到了 /mnt/iso 下
#建议直接复制目录,有个隐藏文件一定要复制,否则可能出现无法安装的情况
[root@pxe ~]# cp -r /mnt/iso/ /var/www/html/iso/Rocky8.10
[root@pxe ~]# ls /var/www/html/iso/Rocky8.10/.treeinfo
/var/www/html/iso/Rocky8.10/.treeinfo
[root@pxe ~]# ls /var/www/html/iso/Rocky8.10/.discinfo
/var/www/html/iso/Rocky8.10/.discinfo
Kickstart 源配置
这里不详细写怎么配置 kickstart,最简单的办法就是分别通过 BIOS 和 UEFI 安装系统,然后使用 /root 下自动生成的文件 anaconda-ks.cfg,这个仅当学习使用,其他的修改可以去红帽官网查找。
#创建 kickstart 子目录
[root@pxe ~]# mkdir -p /var/www/html/ks
#将准备好的 kickstart 文件复制到 /var/www/html/ks
[root@pxe ~]# ls /var/www/html/ks/
rhel_8_BIOS.ks rhel_8_UEFI.ks
[root@pxe ~]# chmod +r /var/www/html/ks/*
[root@pxe ~]# ll /var/www/html/ks/
total 8
-rw-r--r-- 1 root root 1284 Feb 15 18:39 rhel_8_BIOS.ks
-rw-r--r-- 1 root root 1379 Feb 15 18:39 rhel_8_UEFI.ks
Kickstart 文件模板参考
下边放两个 Kickstart 文件,主要修改内容如下:
-
修改
repo行,将baseurl修改为网络源 -
检查
network行,确保 PXE 启动网卡为 dhcp 状态 -
删除
cdrom行,添加url --url=http://192.168.255.254/iso/Rocky8.10/行,通过网络源下载 ISO 相关文件 -
添加如下三行:
# 安装完成后重启 reboot # 设置 Firewall 防火墙开机不启动 firewall --disabled # 关闭 SELinux selinux --disabled -
检查
ignoredisk行是否只包含系统盘,如:只在sda安装系统则为ignoredisk --only-use=sda,设置只操作sda磁盘 -
修改
clearpart行为clearpart --all --initlabel --drives=sda,设置强制格式化磁盘(如果磁盘有文件系统也格式化) -
修改
part /行为part / --fstype="xfs" --ondisk=sda --grow,设置系统盘自动填充剩余空间 -
如果是 UEFI 启动,则需要再添加
part /boot/efi --fstype="efi" --ondisk=sda --size=200 --fsoptions="umask=0077,shortname=winnt"
BIOS
[root@pxe ~]# cat /var/www/html/ks/rhel_8_BIOS.ks
#version=RHEL8
# Use graphical install
graphical
repo --name="AppStream" --baseurl=http://192.168.255.254/iso/Rocky8.10/AppStream
%packages
@^minimal-environment
kexec-tools
%end
# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=ens160 --ipv6=auto --activate
network --hostname=localhost.localdomain
# Use CDROM installation media
url --url=http://192.168.255.254/iso/Rocky8.10/
# Run the Setup Agent on first boot
firstboot --enable
reboot
firewall --disabled
selinux --disabled
ignoredisk --only-use=sda
# Partition clearing information
clearpart --all --initlabel --drives=sda
# Disk partitioning information
part / --fstype="xfs" --ondisk=sda --grow
part /boot --fstype="xfs" --ondisk=sda --size=1024
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# Root password
rootpw --iscrypted $6$kg4JgovHBe.HpdX4$gjR1tX/nMUHH4JM0gnHhVz3mfDKmPjguNW3fT4S4Bjn0kaEEArjHA73fZAZAXFm/khvUX7A90PwfD5YojHQva0
%addon com_redhat_kdump --enable --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
UEFI
[root@pxe ~]# cat /var/www/html/ks/rhel_8_UEFI.ks
#version=RHEL8
# Use graphical install
graphical
repo --name="AppStream" --baseurl=http://192.168.255.254/iso/Rocky8.10/AppStream
%packages
@^minimal-environment
kexec-tools
%end
# Keyboard layouts
keyboard --xlayouts='us'
# System language
lang en_US.UTF-8
# Network information
network --bootproto=dhcp --device=ens160 --ipv6=auto --activate
network --hostname=localhost.localdomain
# Use CDROM installation media
url --url=http://192.168.255.254/iso/Rocky8.10/
# Run the Setup Agent on first boot
firstboot --enable
reboot
firewall --disabled
selinux --disabled
ignoredisk --only-use=sda
# Partition clearing information
clearpart --all --initlabel --drives=sda
# Disk partitioning information
part /boot/efi --fstype="efi" --ondisk=sda --size=1024 --fsoptions="umask=0077,shortname=winnt"
part / --fstype="xfs" --ondisk=sda --grow
part /boot --fstype="xfs" --ondisk=sda --size=1024
# System timezone
timezone Asia/Shanghai --isUtc --nontp
# Root password
rootpw --iscrypted $6$kg4JgovHBe.HpdX4$gjR1tX/nMUHH4JM0gnHhVz3mfDKmPjguNW3fT4S4Bjn0kaEEArjHA73fZAZAXFm/khvUX7A90PwfD5YojHQva0
%addon com_redhat_kdump --enable --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
准备 TFTP 服务
安装 TFTP
[root@pxe ~]# dnf -y install tftp-server
准备文件
# 下载 RPM 包
[root@pxe ~]# mkdir tftp_packages
[root@pxe ~]# cd tftp_packages/
[root@pxe tftp_packages]# dnf install -y yum-utils
[root@pxe tftp_packages]# yumdownloader shim grub2-efi syslinux-nonlinux
# 解压 RPM 包
[root@pxe tftp_packages]# rpm2cpio shim-x64-15.8-2.el8.x86_64.rpm | cpio -dimv
[root@pxe tftp_packages]# rpm2cpio grub2-efi-x64-2.02-156.el8.rocky.0.1.x86_64.rpm | cpio -dimv
[root@pxe tftp_packages]# rpm2cpio syslinux-nonlinux-6.04-6.el8.noarch.rpm | cpio -dimv
# 创建 tftp 目录
[root@pxe tftp_packages]# mkdir -p /var/lib/tftpboot/{BIOS,UEFI}
# 复制相关文件
[root@pxe tftp_packages]# cp -ar usr/share/syslinux/* /var/lib/tftpboot/BIOS/
[root@pxe tftp_packages]# cp -ar boot/efi/EFI/BOOT/* /var/lib/tftpboot/UEFI/
[root@pxe tftp_packages]# cp -ar boot/efi/EFI/rocky/* /var/lib/tftpboot/UEFI/
# 最开始挂在的镜像 ISO
[root@pxe tftp_packages]# cp -ar /mnt/iso/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/BIOS/
[root@pxe tftp_packages]# cp -ar /mnt/iso/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot/UEFI/
[root@pxe tftp_packages]# mkdir /var/lib/tftpboot/BIOS/pxelinux.cfg
# 准备 BIOS 启动加载器的主配置文件
[root@pxe tftp_packages]# cat <<-EOF > /var/lib/tftpboot/BIOS/pxelinux.cfg/default
default linux
timeout 600
ui vesamenu.c32
display boot.msg
label linux
menu label ^RHEL 8.10 AUTO INSTALL
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.255.254/iso/Rocky8.10/ inst.ks=http://192.168.255.254/ks/rhel_8_BIOS.ks quiet
menu end
EOF
# 准备 UEFI 启动加载器的主配置文件
[root@pxe tftp_packages]# cat <<-EOF > /var/lib/tftpboot/UEFI/grub.cfg
set default="0"
set timeout=60
menuentry 'Install Rocky Linux 8.10 AUTO' --class fedora --class gnu-linux --class gnu --class os {
linuxefi /UEFI/vmlinuz inst.repo=http://192.168.255.254/iso/Rocky8.10/ inst.ks=http://192.168.255.254/ks/rhel_8_UEFI.ks quiet
initrdefi /UEFI/initrd.img
}
EOF
# 给所有文件增加读权限
[root@pxe tftp_packages]# chmod +r -R /var/lib/tftpboot/*
BIOS 模式的 kernel vmlinuz 和 append initrd=initrd.img,以及 UEFI 模式的 linuxefi /UEFI/vmlinuz 和 initrdefi /UEFI/initrd.img 照抄就行,它们的路径和之前 initrd.img、vmlinuz 文件的位置有关。
简单说一下 inst.repo 和 inst.ks:
inst.repo用于设置 ISO 源,这里设置为网络源inst.ks用于设置 Kickstart 配置文件源,这里设置为网络源
重启相关服务
[root@pxe tftp_packages]# systemctl restart httpd tftp dhcpd
到此 PXE 配置完成,可以用其他客户端服务器(或虚拟机)测试。
关于 DHCP 识别启动方式的解释
DHCP 配置
这里只解释一下 DHCP 如何判断 BIOS 和 UEFI 启动的,关于地址的的不解释。
因为我没用过 HTTP 的方式部署系统,所以这个跳过,但是它和 PXE 的抓包结果应该也差不多。
option architecture-type code 93 = unsigned integer 16;
subnet 192.168.255.0 netmask 255.255.255.0 {
range 192.168.255.100 192.168.255.200;
option domain-name-servers pxe.example.com;
option domain-name "example.com";
option routers 192.168.255.254;
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
next-server 192.168.255.254;
if option architecture-type = 00:07 {
filename "UEFI/BOOTX64.EFI";
}
else {
filename "BIOS/pxelinux.0";
}
}
#class "httpclients" {
# match if substring (option vendor-class-identifier, 0, 10) = "HTTPClient";
# option vendor-class-identifier "HTTPClient";
# filename "http://192.168.124.2/redhat/EFI/BOOT/BOOTX64.EFI";
#}
}
-
option architecture-type code 93 = unsigned integer 16;:给 DHCP 服务的
Option 93选项定义一个变量名,变量名为:architecture-type -
class "pxeclients":定义一个 DHCP 类(分类规则),满足规则的客户端执行这个 DHCP 类里的操作
-
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";读取
vendor-class-identifier(DHCP 的Option 60),取第 0-9 字符并判断是否为PXEClient -
next-server 192.168.255.254;:告诉客户端去哪个服务器下载启动文件
-
if option architecture-type = 00:07:检查
architecture-type(DHCP 的Option 93),如果它的值为 7,则判断为 UEFI 启动 -
filename "UEFI/BOOTX64.EFI";:UEFI 启动加载器的位置
-
后边的
else表示非 UEFI 启动的就使用 BIOS 启动加载器
上边这个是只针对 x86_64 启动写的,DHCP 还能判断其他的架构,如 ARM 等,下表列出了 DHCP 判断架构对应的值:
| 值 | 名称 | 说明 | 现实常见程度 |
|---|---|---|---|
| 0 | x86 BIOS | 传统 BIOS | 非常常见 |
| 6 | x86 UEFI | 32 位 UEFI | 很少 |
| 7 | x64 UEFI | EFI Boot Client | ⭐⭐⭐⭐⭐ |
| 9 | EFI x86-64 | 64 位 UEFI | ⭐ |
虽然 64 位 UEFI 对应 9,但是一般情况下 64 位 UEFI 用的还是 7。
查看 DHCP 报文
这里通过抓包查看 DHCP 报文(PXE 网卡为 ens224,通过 tcpdump 命令开始抓包,并启动客户端系统):
- BIOS 启动:
tcpdump -i ens224 -nn -w pxe-bios.pcap - UEFI 启动:
tcpdump -i ens224 -nn -w pxe-uefi.pcap
查看 BIOS 报文内容:
[root@pxe ~]# tcpdump -nn -vvv -r pxe-bios.pcap 'udp and (port 67 or port 68)'
reading from file pxe-bios.pcap, link-type EN10MB (Ethernet)
dropped privs to tcpdump
12:48:32.567772 IP (tos 0x0, ttl 127, id 0, offset 0, flags [none], proto UDP (17), length 576)
0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:29:6e:e1:9d, length 548, xid 0x2a6ee19d, secs 4, Flags [Broadcast] (0x8000)
Client-Ethernet-Address 00:0c:29:6e:e1:9d
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Discover
Parameter-Request Option 55, length 24:
Subnet-Mask, Time-Zone, Default-Gateway, IEN-Name-Server
Domain-Name-Server, RL, Hostname, BS
Domain-Name, SS, RP, EP
Vendor-Option, Server-ID, Vendor-Class, BF
Option 128, Option 129, Option 130, Option 131
Option 132, Option 133, Option 134, Option 135
MSZ Option 57, length 2: 1260
GUID Option 97, length 17: 0.86.77.228.56.197.52.52.101.127.208.254.244.96.110.225.157
ARCH Option 93, length 2: 0
NDI Option 94, length 3: 1.2.1
Vendor-Class Option 60, length 32: "PXEClient:Arch:00000:UNDI:002001"
END Option 255, length 0
PAD Option 0, length 0, occurs 212
12:48:33.577791 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
192.168.255.254.67 > 255.255.255.255.68: [udp sum ok] BOOTP/DHCP, Reply, length 300, xid 0x2a6ee19d, secs 4, Flags [Broadcast] (0x8000)
Your-IP 192.168.255.100
Server-IP 192.168.255.254
Client-Ethernet-Address 00:0c:29:6e:e1:9d
file "BIOS/pxelinux.0"
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Offer
Server-ID Option 54, length 4: 192.168.255.254
Lease-Time Option 51, length 4: 41787
Subnet-Mask Option 1, length 4: 255.255.255.0
Default-Gateway Option 3, length 4: 192.168.255.254
Domain-Name Option 15, length 11: "example.com"
END Option 255, length 0
PAD Option 0, length 0, occurs 19
12:48:34.626463 IP (tos 0x0, ttl 127, id 1, offset 0, flags [none], proto UDP (17), length 576)
0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:29:6e:e1:9d, length 548, xid 0x2a6ee19d, secs 4, Flags [Broadcast] (0x8000)
Client-Ethernet-Address 00:0c:29:6e:e1:9d
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Request
Requested-IP Option 50, length 4: 192.168.255.100
Parameter-Request Option 55, length 24:
Subnet-Mask, Time-Zone, Default-Gateway, IEN-Name-Server
Domain-Name-Server, RL, Hostname, BS
Domain-Name, SS, RP, EP
Vendor-Option, Server-ID, Vendor-Class, BF
Option 128, Option 129, Option 130, Option 131
Option 132, Option 133, Option 134, Option 135
MSZ Option 57, length 2: 1260
Server-ID Option 54, length 4: 192.168.255.254
GUID Option 97, length 17: 0.86.77.228.56.197.52.52.101.127.208.254.244.96.110.225.157
ARCH Option 93, length 2: 0
NDI Option 94, length 3: 1.2.1
Vendor-Class Option 60, length 32: "PXEClient:Arch:00000:UNDI:002001"
END Option 255, length 0
PAD Option 0, length 0, occurs 200
12:48:34.626638 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
192.168.255.254.67 > 255.255.255.255.68: [udp sum ok] BOOTP/DHCP, Reply, length 300, xid 0x2a6ee19d, secs 4, Flags [Broadcast] (0x8000)
Your-IP 192.168.255.100
Server-IP 192.168.255.254
Client-Ethernet-Address 00:0c:29:6e:e1:9d
file "BIOS/pxelinux.0"
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: ACK
Server-ID Option 54, length 4: 192.168.255.254
Lease-Time Option 51, length 4: 41785
Subnet-Mask Option 1, length 4: 255.255.255.0
Default-Gateway Option 3, length 4: 192.168.255.254
Domain-Name Option 15, length 11: "example.com"
END Option 255, length 0
PAD Option 0, length 0, occurs 19
Vendor-Class Option 60, length 32: "PXEClient:Arch:00000:UNDI:002001"的 0-9 字符是PXEClient表示为 PXE 客户端ARCH Option 93, length 2: 0表示客户端是 BIOS 启动
查看 UEFI 报文内容:
[root@pxe ~]# tcpdump -nn -vvv -r pxe-uefi.pcap 'udp and (port 67 or port 68)'
reading from file pxe-uefi.pcap, link-type EN10MB (Ethernet)
dropped privs to tcpdump
12:52:22.518404 IP (tos 0x0, ttl 64, id 7950, offset 0, flags [none], proto UDP (17), length 375)
0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:29:8a:d6:b4, length 347, xid 0xf66d7b, Flags [Broadcast] (0x8000)
Client-Ethernet-Address 00:0c:29:8a:d6:b4
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Discover
MSZ Option 57, length 2: 1472
Parameter-Request Option 55, length 35:
Subnet-Mask, Time-Zone, Default-Gateway, Time-Server
IEN-Name-Server, Domain-Name-Server, Hostname, BS
Domain-Name, RP, EP, RSZ
TTL, BR, YD, YS
NTP, Vendor-Option, Requested-IP, Lease-Time
Server-ID, RN, RB, Vendor-Class
TFTP, BF, GUID, Option 128
Option 129, Option 130, Option 131, Option 132
Option 133, Option 134, Option 135
GUID Option 97, length 17: 0.86.77.148.232.102.146.46.177.124.24.119.176.101.138.214.180
NDI Option 94, length 3: 1.3.0
ARCH Option 93, length 2: 7
Vendor-Class Option 60, length 32: "PXEClient:Arch:00007:UNDI:003000"
END Option 255, length 0
12:52:23.539866 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
192.168.255.254.67 > 255.255.255.255.68: [udp sum ok] BOOTP/DHCP, Reply, length 300, xid 0xf66d7b, Flags [Broadcast] (0x8000)
Your-IP 192.168.255.102
Server-IP 192.168.255.254
Client-Ethernet-Address 00:0c:29:8a:d6:b4
file "UEFI/BOOTX64.EFI"
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Offer
Server-ID Option 54, length 4: 192.168.255.254
Lease-Time Option 51, length 4: 43200
Subnet-Mask Option 1, length 4: 255.255.255.0
Default-Gateway Option 3, length 4: 192.168.255.254
Domain-Name Option 15, length 11: "example.com"
END Option 255, length 0
PAD Option 0, length 0, occurs 19
12:52:26.109987 IP (tos 0x0, ttl 64, id 7951, offset 0, flags [none], proto UDP (17), length 387)
0.0.0.0.68 > 255.255.255.255.67: [udp sum ok] BOOTP/DHCP, Request from 00:0c:29:8a:d6:b4, length 359, xid 0xf66d7b, Flags [Broadcast] (0x8000)
Client-Ethernet-Address 00:0c:29:8a:d6:b4
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Request
Server-ID Option 54, length 4: 192.168.255.254
Requested-IP Option 50, length 4: 192.168.255.102
MSZ Option 57, length 2: 65280
Parameter-Request Option 55, length 35:
Subnet-Mask, Time-Zone, Default-Gateway, Time-Server
IEN-Name-Server, Domain-Name-Server, Hostname, BS
Domain-Name, RP, EP, RSZ
TTL, BR, YD, YS
NTP, Vendor-Option, Requested-IP, Lease-Time
Server-ID, RN, RB, Vendor-Class
TFTP, BF, GUID, Option 128
Option 129, Option 130, Option 131, Option 132
Option 133, Option 134, Option 135
GUID Option 97, length 17: 0.86.77.148.232.102.146.46.177.124.24.119.176.101.138.214.180
NDI Option 94, length 3: 1.3.0
ARCH Option 93, length 2: 7
Vendor-Class Option 60, length 32: "PXEClient:Arch:00007:UNDI:003000"
END Option 255, length 0
12:52:26.110885 IP (tos 0x10, ttl 128, id 0, offset 0, flags [none], proto UDP (17), length 328)
192.168.255.254.67 > 255.255.255.255.68: [udp sum ok] BOOTP/DHCP, Reply, length 300, xid 0xf66d7b, Flags [Broadcast] (0x8000)
Your-IP 192.168.255.102
Server-IP 192.168.255.254
Client-Ethernet-Address 00:0c:29:8a:d6:b4
file "UEFI/BOOTX64.EFI"
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: ACK
Server-ID Option 54, length 4: 192.168.255.254
Lease-Time Option 51, length 4: 43200
Subnet-Mask Option 1, length 4: 255.255.255.0
Default-Gateway Option 3, length 4: 192.168.255.254
Domain-Name Option 15, length 11: "example.com"
END Option 255, length 0
PAD Option 0, length 0, occurs 19
Vendor-Class Option 60, length 32: "PXEClient:Arch:00007:UNDI:003000"的 0-9 字符是PXEClient表示为 PXE 客户端ARCH Option 93, length 2: 7表示客户端是 UEFI 启动
参考链接
https://www.redhat.com/sysadmin/pxe-boot-uefi
https://access.redhat.com/solutions/3293511
https://datatracker.ietf.org/doc/html/rfc4578
https://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml