1. PXE 启动原理:协议栈与挂载流程

各位好,我是老张。做网络故障诊断这些年,PXE 启动问题是我遇到最多的场景之一。很多刚入行的朋友一看到 PXE 报错就头大,其实说白了,你只要搞懂它背后的几个协议是怎么配合的,排查起来就顺了。

这一章我们先打地基。把 PXE 的协议栈、DHCP/BOOTP 怎么交互、TFTP 怎么传文件、最后根文件系统怎么挂载,一条线捋清楚。

1.1 PXE 协议栈:谁在跟谁说话?

PXE 全称是 Preboot eXecution Environment,预启动执行环境。它不是一个协议,而是一套协议栈。我习惯把它拆成三层来看:

  • 底层:UDP/IP 网络通信。客户端还没操作系统,只能用最轻量的 UDP。
  • 中间层:DHCP/BOOTP 获取 IP 和引导文件位置。
  • 上层:TFTP 或 HTTP 下载引导文件,NFS 或 HTTP 挂载根文件系统。

你想想看,一台裸机,没有硬盘、没有系统,它怎么知道去哪找启动文件?靠的就是这套协议栈一层层问出来的。

核心要点:PXE 客户端固件(网卡 ROM 或 UEFI)内置了 DHCP 和 TFTP 客户端。这是它能“无中生有”的基础。

1.2 DHCP/BOOTP:第一声招呼

PXE 启动的第一步,客户端发广播找 DHCP 服务器。但这里有个坑——普通的 DHCP 只给 IP,PXE 需要额外的“引导信息”。

我记得有一次,客户说 PXE 能拿到 IP 但就是启动不了。我过去一看,DHCP 服务器根本没配 option 66 和 option 67。这就是典型的“半拉子”配置。

DHCP 在 PXE 中的关键选项:

选项 含义 示例值
option 66 (next-server) TFTP 服务器地址 192.168.1.100
option 67 (bootfile-name) 引导文件名 pxelinux.0 或 bootx64.efi
option 43 (vendor-encapsulated-options) 厂商特定选项,PXE 客户端用它识别“这是 PXE 服务器” 十六进制编码

我曾经踩过的坑:DHCP 服务器和 PXE 服务器是同一台机器时,option 66 写 127.0.0.1 会导致客户端无法连接。必须写实际可路由的 IP 地址。

交互流程大致是这样:

  1. 客户端发 DHCPDISCOVER(广播)。
  2. DHCP 服务器回 DHCPOFFER,带上 IP 和 option 66/67。
  3. 客户端发 DHCPREQUEST 确认。
  4. 服务器回 DHCPACK,PXE 阶段结束。

嗯,这里要注意:PXE 客户端在收到 DHCPACK 后,会检查 option 43 是否包含“PXE”标识。如果没有,它可能认为这不是 PXE 服务器,直接放弃。

1.3 TFTP:传文件的老将

拿到 TFTP 服务器地址和引导文件名后,客户端用 TFTP 去下载。TFTP 基于 UDP,端口 69。它没有认证、没有加密,就是简单粗暴地传文件。

我个人习惯在排查时先手动用 tftp 命令测试一下:

# 在客户端机器上测试(如果已有系统)
tftp 192.168.1.100
tftp> get pxelinux.0
tftp> quit

如果这一步超时或报错,说明 TFTP 服务没起来,或者防火墙挡了。别急着查 PXE 配置,先把这个基础链路打通。

TFTP 传输模式有两种:

  • octet(二进制):用于传输引导文件、内核、initrd。
  • netascii:文本模式,基本不用。

避坑指南:TFTP 默认文件大小限制是 32MB。如果你的 initrd 文件超过这个值,传输会失败。我曾经遇到过内核编译出来 40MB,死活传不完。解决方案是用 HTTP 替代 TFTP,或者把 initrd 拆小。

1.4 根文件系统挂载:最后的临门一脚

引导文件(如 pxelinux.0)下载后,客户端加载内核和 initrd。内核启动后,需要挂载真正的根文件系统。这里有两种主流方式:

方式 协议 特点 适用场景
NFS 挂载 NFS v3/v4 传统方案,配置简单,依赖 RPC 服务 内网小规模部署
HTTP 挂载 HTTP/HTTPS 速度快,支持大文件,可跨公网 大规模集群、跨网络部署

内核启动参数里会指定根文件系统位置。比如:

root=/dev/nfs nfsroot=192.168.1.100:/srv/nfs/rootfs ip=dhcp

或者用 HTTP:

root=live:http://192.168.1.100/rootfs.squashfs

我个人的经验是,NFS 挂载在千兆内网里很稳定,但一旦跨网段或带宽不够,就容易卡在挂载阶段。HTTP 方式更现代,配合 squashfs 只读镜像,安全性也更好。

1.5 整体流程一览

下面这张图把整个 PXE 启动流程串起来了。我建议你把它存下来,以后排查问题时对照着看。

PXE 启动完整流程 PXE 客户端(裸机) ① DHCPDISCOVER(广播) DHCP 服务器 ② DHCPOFFER(IP + option 66/67) ③ DHCPREQUEST / ACK ④ TFTP 下载引导文件 TFTP 服务器 ⑤ 加载内核 + initrd ⑥ 挂载根文件系统(NFS/HTTP) 关键检查点 • option 66/67 是否配置 • TFTP 服务是否可达 • 根文件系统路径是否正确

整个流程走下来,客户端从“啥也没有”到“跑起一个完整的操作系统”,靠的就是 DHCP 给地址、TFTP 传文件、NFS/HTTP 挂根。任何一个环节断了,启动就卡住。

我的习惯:排查 PXE 问题时,我从来不看日志先。先手动模拟一遍流程——用 dhcp 测试工具看 option 是否下发,用 tftp 客户端看文件能否下载。链路通了,问题就解决了一半。

好了,这一章我们把 PXE 启动的骨架搭起来了。后面几章会深入每个环节的故障场景和排查工具。你先把这张流程图刻在脑子里,后面遇到问题就知道该查哪一段了。