PXE(预启动执行环境)是一种革命性的网络引导技术,它让计算机无需依赖本地存储设备即可通过网络启动操作系统。本文将从 PXE 的基本原理、核心组件讲起,详细介绍其工作流程、配置文件示例,并提供一个在 Ubuntu 22.04 上搭建完整 PXE 服务端的实战部署指南,帮助读者全面掌握这项自动化运维的关键技术。

1. 什么是 PXE?

PXE(Preboot eXecution Environment,预启动执行环境)是由 Intel 公司开发的一种网络引导技术。它允许计算机通过网络从远程服务器下载并启动操作系统镜像,而无需依赖本地存储设备(如硬盘、U盘或光驱)。

核心思想:将启动过程分为两个阶段。第一阶段由网卡上的 ROM 芯片(或 UEFI 固件)中的 PXE 客户端完成,它通过 DHCP/TFTP 协议获取初始引导文件;第二阶段则执行更复杂的引导程序(如 GRUB、iPXE),最终通过网络加载完整的操作系统。

2. PXE 的工作原理与流程

一次典型的 PXE 启动过程涉及以下组件和步骤:

  1. 客户端开机:支持 PXE 的网卡(或主板固件)广播一个 DHCP Discover 报文。
  2. DHCP 服务器响应
    • 返回客户端的 IP 地址、子网掩码、网关等网络配置。
    • 关键:在 DHCP Offer 或 Ack 报文中包含 next-server(TFTP 服务器地址)和 filename(初始引导文件,如 pxelinux.0bootx64.efi)选项。
  3. 获取引导文件:客户端根据 next-serverfilename,通过 TFTP 协议从指定的 TFTP 服务器下载初始引导文件。
  4. 执行引导程序:客户端执行下载的引导文件(如 SYSLINUX 的 PXELINUX、GRUB2 的 grubnetx64.efi 或功能更强大的 iPXE)。
  5. 加载配置文件与内核:引导程序通常会再次通过 TFTP(或升级到 HTTP、NFS 等更高效的协议)下载其配置文件(如 pxelinux.cfg/default)、内核(vmlinuz)和初始内存盘(initrd.img)。
  6. 启动操作系统:引导程序将控制权交给操作系统内核,完成后续的系统启动过程。
HTTP/NFS 服务器 (可选) TFTP 服务器 DHCP 服务器 PXE 客户端 HTTP/NFS 服务器 (可选) TFTP 服务器 DHCP 服务器 PXE 客户端 7. 执行 pxelinux.0 12. 启动操作系统内核 1. DHCP Discover (广播) 2. DHCP Offer (包含 next-server, filename) 3. DHCP Request 4. DHCP Ack (确认网络配置及引导信息) 5. TFTP Request (获取 filename) 6. TFTP Transfer (发送 pxelinux.0) 8. TFTP Request (获取配置文件、内核等) 9. TFTP Transfer (发送配置、vmlinuz, initrd) 10. (可选) HTTP 获取大型镜像 11. 传输系统镜像

3. 核心组件与协议

  • DHCP 协议:用于动态分配 IP 地址,并传递引导服务器地址(next-server)和引导文件名(filename)。
  • TFTP 协议:一种简单的文件传输协议,用于传输初始引导文件和配置文件。因其简单,常被集成在网卡 ROM 中,但效率较低,不适合传输大文件。
  • 引导程序
    • PXELINUX:SYSLINUX 项目的一部分,是经典的 PXE 引导加载器。
    • GRUB2:支持 PXE 引导,功能强大,配置文件更灵活。
    • iPXE:开源的网络引导固件,可以替换或链式加载原有的 PXE ROM。它支持 HTTP、iSCSI、AoE 等更多协议,大大提升了网络引导的效率和能力。
  • 服务器:需要部署 DHCP 服务器(如 isc-dhcp-server)、TFTP 服务器(如 tftpd-hpa)以及用于存放系统镜像的文件服务器(如 HTTP/NFS/Samba)。

4. 配置文件示例

4.1 DHCP 服务器配置 (ISC DHCP)

# /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.100 192.168.1.200;
  option routers 192.168.1.1;
  option subnet-mask 255.255.255.0;
  option domain-name-servers 8.8.8.8;

  # PXE 引导关键配置
  next-server 192.168.1.10;  # TFTP 服务器 IP
  filename "pxelinux.0";     # 引导文件名 (BIOS 模式)
  
  # 针对 UEFI 客户端的配置 (Class匹配)
  if option arch = 00:07 or option arch = 00:09 {
    filename "bootx64.efi";
  }
}

4.2 PXELINUX 配置文件

# /var/lib/tftpboot/pxelinux.cfg/default
DEFAULT menu.c32
PROMPT 0
TIMEOUT 50

LABEL linux
    MENU LABEL ^Install CentOS 7
    KERNEL centos7/vmlinuz
    APPEND initrd=centos7/initrd.img inst.repo=http://192.168.1.10/centos7 ks=http://192.168.1.10/ks.cfg

LABEL local
    MENU LABEL ^Boot from local drive
    LOCALBOOT 0

5. 应用场景与优缺点

应用场景

  • 大规模操作系统部署:如数据中心、网吧、学校机房的无盘系统。
  • 系统恢复与维护:快速将故障机器引导至恢复环境。
  • 磁盘克隆(结合 Clonezilla 等工具)。
  • 运行轻量级 Live 环境

优点

  • 无需物理介质:摆脱光驱、U盘的限制。
  • 集中化管理:镜像和配置在服务器端,更新维护方便。
  • 支持异构硬件:同一套镜像可引导不同型号的机器。

缺点

  • 依赖网络:网络故障会导致启动失败。
  • 配置复杂:需要搭建并协调 DHCP、TFTP、文件服务器。
  • 启动速度:受网络速度和服务器性能影响,比本地启动慢。

6. 常见问题与排查

  1. 客户端获取不到 IP 地址
    • 检查 DHCP 服务器是否运行,防火墙是否放行 UDP 67/68 端口。
    • 确认客户端和服务器在同一广播域(VLAN)。
  2. 客户端报错 “TFTP Open failed” 或 “File not found”
    • 检查 next-server 的 IP 地址是否正确。
    • 检查 TFTP 服务器根目录(如 /var/lib/tftpboot)下是否存在 filename 指定的文件。
    • 检查 TFTP 服务器权限,确保文件可读。
  3. 启动过程卡在 loading kernel…
    • 检查内核 (vmlinuz) 和 initrd (initrd.img) 文件路径是否正确。
    • 确认 APPEND 参数中的 inst.repo 等网络路径可访问。
  4. UEFI 客户端无法引导
    • 确认 DHCP 配置中为 UEFI 客户端(arch 选项)指定了正确的 .efi 引导文件(如 bootx64.efi)。
    • 确保 TFTP 服务器上存在对应的 EFI 引导文件。

7. 总结

PXE 是实现自动化、规模化网络系统部署的基石技术。理解其 DHCP+TFTP 的两阶段引导模型,掌握相关服务器配置和排错方法,是进行高效运维的关键。现代实践中,常会使用 iPXE 来增强其功能,或与 CobblerForemanWDS(Windows)等自动化部署工具结合,构建更完善的无人值守安装体系。

8. 实战部署步骤

以下是在 Ubuntu 22.04 服务器上快速搭建一个最小化 PXE 服务端(包含 DHCP、TFTP、HTTP)的具体命令和关键配置。请确保您拥有 root 或 sudo 权限,并已连接到互联网。

8.1 环境准备与网络规划

  1. 服务器信息

    • 操作系统:Ubuntu 22.04 LTS
    • IP 地址192.168.1.10(请根据您的实际网络环境修改)
    • 网卡ens33(请使用 ip a 命令确认您的网卡名称)
  2. 关闭冲突服务:如果系统已运行其他 DHCP 服务(如 dnsmasq 的 DHCP 功能),请先停止并禁用它们。

8.2 安装必要软件包

执行以下命令安装 DHCP、TFTP、HTTP 服务器以及 PXE 引导文件:

sudo apt update
sudo apt install -y isc-dhcp-server tftpd-hpa apache2 syslinux-common pxelinux

8.3 配置 DHCP 服务器

  1. 编辑 DHCP 主配置文件

    sudo nano /etc/dhcp/dhcpd.conf
    
  2. 清空原内容,替换为以下配置(请根据您的网络修改 subnetrangeroutersnext-server):

    # /etc/dhcp/dhcpd.conf
    authoritative;
    default-lease-time 600;
    max-lease-time 7200;
    
    subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.100 192.168.1.200;
      option routers 192.168.1.1;
      option subnet-mask 255.255.255.0;
      option domain-name-servers 8.8.8.8;
    
      # PXE 引导关键配置
      next-server 192.168.1.10;  # TFTP 服务器 IP(本机)
      filename "pxelinux.0";     # BIOS 引导文件
    
      # 针对 UEFI 客户端的配置
      if option arch = 00:07 or option arch = 00:09 {
        filename "bootx64.efi";
      }
    }
    
  3. 指定 DHCP 服务监听的网卡

    sudo nano /etc/default/isc-dhcp-server
    

    找到 INTERFACESv4="" 行,修改为(例如网卡名为 ens33):

    INTERFACESv4="ens33"
    

8.4 配置 TFTP 服务器

  1. 编辑 TFTP 配置文件

    sudo nano /etc/default/tftpd-hpa
    
  2. 修改为以下内容

    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/var/lib/tftpboot"
    TFTP_ADDRESS=":69"
    TFTP_OPTIONS="--secure --create"
    RUN_DAEMON="yes"
    
  3. 创建 TFTP 根目录并设置权限

    sudo mkdir -p /var/lib/tftpboot
    sudo chown -R tftp:tftp /var/lib/tftpboot
    sudo chmod -R 755 /var/lib/tftpboot
    
  4. 复制 PXE 引导文件到 TFTP 目录

    sudo cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
    sudo cp /usr/lib/syslinux/modules/bios/{ldlinux.c32,libutil.c32,menu.c32} /var/lib/tftpboot/
    # 对于 UEFI,需要准备 bootx64.efi(可从 syslinux-efi 包获取或从发行版镜像提取)
    # 此处以复制 shim 和 grub 为例(如果已安装 grub-efi-amd64-signed)
    sudo cp /usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed /var/lib/tftpboot/bootx64.efi
    
  5. 创建 PXE 菜单配置目录和文件

    sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg
    sudo nano /var/lib/tftpboot/pxelinux.cfg/default
    
  6. 写入一个简单的 PXE 菜单配置

    DEFAULT menu.c32
    PROMPT 0
    TIMEOUT 50
    LABEL local
        MENU LABEL ^Boot from local hard drive
        LOCALBOOT 0
    LABEL memtest
        MENU LABEL ^Run Memtest86+
        KERNEL memtest
    

8.5 配置 HTTP 服务器(用于存放安装镜像)

  1. 创建镜像存放目录并设置权限

    sudo mkdir -p /var/www/html/iso
    sudo chown -R www-data:www-data /var/www/html/iso
    
  2. (可选)下载一个 Live CD 或安装镜像,例如 Ubuntu 22.04 Live Server:

    sudo wget -P /var/www/html/iso/ https://releases.ubuntu.com/22.04/ubuntu-22.04.4-live-server-amd64.iso
    
  3. 提取内核和 initrd(以 Ubuntu 为例):

    cd /var/www/html/iso
    sudo mount -o loop ubuntu-22.04.4-live-server-amd64.iso /mnt
    sudo cp /mnt/casper/{vmlinuz,initrd} .
    sudo umount /mnt
    
  4. 在 PXE 菜单中添加对应条目(编辑 /var/lib/tftpboot/pxelinux.cfg/default):

    LABEL ubuntu-live
        MENU LABEL ^Install Ubuntu 22.04 Live Server
        KERNEL http://192.168.1.10/iso/vmlinuz
        APPEND initrd=http://192.168.1.10/iso/initrd root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://192.168.1.10/iso/ubuntu-22.04.4-live-server-amd64.iso
    

8.6 启动服务并验证

  1. 重启相关服务并设置开机自启

    sudo systemctl restart isc-dhcp-server tftpd-hpa apache2
    sudo systemctl enable isc-dhcp-server tftpd-hpa apache2
    
  2. 检查服务状态

    sudo systemctl status isc-dhcp-server tftpd-hpa apache2
    
  3. 验证 TFTP 文件可访问

    tftp 192.168.1.10 -c get pxelinux.0 /tmp/test.pxe
    ls -lh /tmp/test.pxe
    
  4. 验证 HTTP 文件可访问

    curl -I http://192.168.1.10/iso/vmlinuz
    

8.7 客户端测试

  1. 将目标客户端设置为 网络引导(PXE) 优先。
  2. 开机后,客户端应自动从 DHCP 服务器获取 IP,并从 TFTP 服务器加载 pxelinux.0
  3. 随后会出现 PXE 菜单,选择对应的条目(如 “Install Ubuntu 22.04 Live Server”)即可开始网络安装。

8.8 防火墙配置(如果启用)

如果系统防火墙(ufw)已启用,需要放行相关端口:

sudo ufw allow 69/udp    # TFTP
sudo ufw allow 80/tcp     # HTTP (Apache)
sudo ufw allow 67/udp     # DHCP
sudo ufw reload

至此,一个最小化的 PXE 服务端环境已搭建完成。您可以根据需要,在 HTTP 目录中添加更多系统镜像,并相应更新 PXE 菜单配置文件。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐