搭建一个同时支持 BIOS 和 UEFI 的 PXE 系统

准备

  • 系统为 Rocky 8.10
  • 系统 YUM 源可用
  • PXE 服务器的 IP 为 192.168.255.254/24。主机名为 pxe.example.com
  • 所有客户端系统内存配置至少 4 G

PXE 流程

img

  1. 客户端通过 DHCP 服务获取 IP 地址、启动加载器的位置(下一步通过 TFTP 服务下载);
  2. 客户端通过 TFTP 服务下载启动加载器及其配置文件,启动加载器的配置文件中记载了 Linux 系统 ISO 安装过程中所需文件的位置(下一步通过 HTTPD 服务下载),文件一般为系统 ISO 文件和自动化安装的应答文件(Kickstart 文件);
  3. 客户端通过 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 vmlinuzappend initrd=initrd.img,以及 UEFI 模式的 linuxefi /UEFI/vmlinuzinitrdefi /UEFI/initrd.img 照抄就行,它们的路径和之前 initrd.imgvmlinuz 文件的位置有关。

简单说一下 inst.repoinst.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://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/8/html/performing_an_advanced_rhel_8_installation/configuring-the-dhcpv4-server-for-http-and-pxe-boot_preparing-to-install-from-the-network-using-http

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html-single/performing_an_advanced_rhel_8_installation/index

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

搭建一个同时支持 BIOS 和 UEFI 的 PXE 系统
https://www.linuxstudynotes.com/2026/02/19/linux/%e6%90%ad%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%90%8c%e6%97%b6%e6%94%af%e6%8c%81-bios-%e5%92%8c-uefi-%e7%9a%84-pxe-%e7%b3%bb%e7%bb%9f/
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇