1. PXE 协议栈概述:从按下电源到系统启动

PXE,全称 Preboot eXecution Environment,说白了就是「让一台空硬盘的机器也能通过网络启动」。我最早接触 PXE 是在十年前给数据中心批量装机的时候,那时候 U 盘都还没普及,几百台服务器一台台插光盘装系统,想想都头大。PXE 的出现,算是把运维从这种体力活里解放了出来。

这一章我们先搭个框架,搞清楚 PXE 到底是怎么工作的,有哪些核心组件,以及它们之间怎么配合。后面 29 章,我们再一步步把这些组件搭起来。

1.1 PXE 工作原理:一个「三阶段」的接力赛

PXE 的启动过程,本质上是一个「客户端找服务器要东西」的过程。客户端(就是那台空机器)开机后,网卡上的 PXE ROM 开始工作,它会经历三个阶段:

  1. DHCP 阶段:客户端广播找 DHCP 服务器,拿到 IP 地址和 TFTP 服务器的地址。
  2. TFTP 阶段:客户端从 TFTP 服务器下载引导文件(比如 pxelinux.0)。
  3. 加载阶段:引导文件运行,再通过 NFS、HTTP 或 iSCSI 拉取真正的操作系统内核和根文件系统。

嗯,这里要注意:很多人以为 PXE 就是 DHCP + TFTP 就完事了。其实 TFTP 只负责传一个很小的引导程序,真正的「大文件」——操作系统镜像,是靠后面的 NFS 或 HTTP 来传的。我在项目中见过有人把整个 ISO 放 TFTP 里传,结果传了半小时还没传完,网卡都快冒烟了。

核心要点:PXE 不是单一协议,而是一个协议栈。它把 DHCP、TFTP、NFS/HTTP 串起来,形成一个完整的网络启动链路。

1.2 启动流程:一步步拆解

我们来看一个典型的 PXE 启动流程。我习惯把它分成 6 步,每一步都有明确的协议和角色:

  1. 客户端开机,网卡 PXE ROM 被激活,发送 DHCP Discover 广播(目标端口 67/68)。
  2. DHCP 服务器响应,返回 Offer,里面包含:客户端 IP、子网掩码、网关、TFTP 服务器地址、引导文件名(如 pxelinux.0)。
  3. 客户端确认,发送 DHCP Request,服务器回复 ACK,IP 租约生效。
  4. 客户端请求 TFTP,从 TFTP 服务器下载引导文件。TFTP 基于 UDP 69 端口,没有认证,没有加密,传小文件很快。
  5. 引导文件执行,它读取配置文件(如 pxelinux.cfg/default),决定下一步加载什么内核和 initrd。
  6. 加载操作系统,通过 NFS 或 HTTP 挂载根文件系统,最终进入安装界面或直接启动系统。

你想想看,这 6 步里,最容出问题的是哪一步?我个人经验是第 2 步——DHCP 的 Option 配置。很多新手把 TFTP 服务器地址写错了,或者引导文件名写错了,客户端卡在「Downloading...」半天不动。我曾经排查过一个案例,折腾了两小时,最后发现是 DHCP 的 Option 67 里多了一个空格。

避坑指南:我曾经在配置 DHCP 时,把引导文件名写成了 "pxelinux.0 "(注意末尾多了一个空格),结果客户端一直报 "File not found"。TFTP 对文件名非常敏感,多一个空格都不行。建议配置完后,用 tftp 命令手动测试一下能否下载文件。

1.3 核心组件详解

PXE 协议栈的核心组件有三个:DHCP、TFTP、NFS/HTTP。它们各司其职,缺一不可。下面这张表可以帮你快速理解它们的区别:

组件 协议/端口 主要作用 传输内容 特点
DHCP UDP 67/68 分配 IP、告知 TFTP 地址和引导文件名 网络配置信息 必须有 Option 66/67
TFTP UDP 69 传输引导文件(pxelinux.0 等) 小文件(< 32MB) 无认证、无加密、速度慢
NFS TCP/UDP 2049 挂载根文件系统或安装镜像 大文件(操作系统镜像) 需要服务端配置 exports
HTTP TCP 80/8080 替代 NFS,通过 HTTP 下载内核和镜像 大文件(内核、initrd、ISO) 现代方案,速度快,易调试

1.3.1 DHCP:PXE 的「引路人」

DHCP 在 PXE 里的角色,不只是分配 IP。它还要告诉客户端:「你的引导文件在哪台服务器上,文件名是什么」。这两个信息通过 DHCP Option 传递:

  • Option 66 (TFTP server name):TFTP 服务器的 IP 地址或主机名。
  • Option 67 (Bootfile name):引导文件的路径和名称。

我建议你在配置 DHCP 时,优先用 IP 地址而不是主机名。因为 PXE 启动早期,客户端可能还没有 DNS 解析能力,用主机名会导致解析失败。嗯,这个坑我踩过。

1.3.2 TFTP:小文件传输的「老黄牛」

TFTP 协议很古老,也很简单。它基于 UDP,没有窗口控制,没有拥塞控制,所以传输大文件时效率极低。但它的优势是:实现简单,占用资源少,PXE ROM 里内置了 TFTP 客户端。

TFTP 只负责传输引导文件,比如 pxelinux.0、grubx64.efi、menu.c32 等。这些文件通常只有几 MB,TFTP 完全够用。如果你发现 TFTP 传输很慢,可以检查一下 MTU 设置和网络延迟。我在项目中遇到过 TFTP 块大小默认 512 字节导致传输慢的问题,后来改成 1468 字节,速度快了将近三倍。

注意事项:TFTP 没有认证和加密机制,所有数据都是明文传输。如果你的网络环境不安全,建议只在隔离的管理网络中使用 PXE。或者考虑用 HTTP 替代 TFTP 传输引导文件(现代 PXE 实现如 iPXE 支持这个功能)。

1.3.3 NFS 与 HTTP:大文件传输的「主力军」

引导文件加载完成后,客户端需要拉取真正的操作系统内核、initrd 和根文件系统。这时候 TFTP 就不够用了——一个 CentOS 的安装镜像动辄 4-8GB,用 TFTP 传得传到猴年马月。

所以 PXE 引入了 NFS 或 HTTP 来传输大文件:

  • NFS:传统方案,通过 NFS 挂载远程目录,客户端可以直接访问文件系统。配置稍复杂,需要设置 exports 和权限。
  • HTTP:现代方案,通过 HTTP 下载文件。配置简单,速度快,而且可以利用缓存加速。我个人更推荐 HTTP,尤其是在大规模部署时。

你想想看,HTTP 相比 NFS 有什么优势?第一,HTTP 有断点续传(虽然 PXE 场景用不到);第二,HTTP 可以配合 CDN 或代理缓存,适合跨地域部署;第三,HTTP 的日志和调试工具更丰富,出问题容易排查。

1.4 PXE 协议栈整体架构图

下面这张 SVG 图展示了 PXE 协议栈的整体架构和启动流程。你可以看到客户端、DHCP 服务器、TFTP 服务器、NFS/HTTP 服务器之间的交互关系:

PXE 协议栈架构与启动流程 PXE 协议栈架构与启动流程 PXE 客户端 (空机器 / 网卡 PXE ROM) DHCP 服务器 (分配 IP + Option 66/67) TFTP 服务器 (传输引导文件) NFS / HTTP 服务器 (传输操作系统镜像) ① DHCP Discover ② DHCP Offer (IP + TFTP 地址) ③ 请求引导文件 (pxelinux.0) ④ 传输引导文件 ⑤ 引导文件执行 读取配置文件 ⑥ 请求操作系统内核 / 根文件系统 ⑦ 传输操作系统镜像 (NFS/HTTP) 说明 TFTP 只传小文件(引导程序) NFS/HTTP 传大文件(OS 镜像) DHCP 负责「指路」

1.5 小结:PXE 不是什么黑魔法

PXE 协议栈说白了就是三个服务串起来的一条链:DHCP 指路,TFTP 传小文件,NFS/HTTP 传大文件。每个环节都有自己要注意的细节,但整体逻辑并不复杂。

我个人习惯在搭建 PXE 环境时,先手动模拟每一步:先用 dhcpd 分配 IP,再用 tftp 命令下载文件,最后用 mount 或 curl 测试 NFS/HTTP 是否可达。每一步都验证通过,再让客户端自动走完整流程。这样出问题的时候,你能快速定位到是哪个环节出了岔子。