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 地址。
交互流程大致是这样:
- 客户端发 DHCPDISCOVER(广播)。
- DHCP 服务器回 DHCPOFFER,带上 IP 和 option 66/67。
- 客户端发 DHCPREQUEST 确认。
- 服务器回 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 启动流程串起来了。我建议你把它存下来,以后排查问题时对照着看。
整个流程走下来,客户端从“啥也没有”到“跑起一个完整的操作系统”,靠的就是 DHCP 给地址、TFTP 传文件、NFS/HTTP 挂根。任何一个环节断了,启动就卡住。
我的习惯:排查 PXE 问题时,我从来不看日志先。先手动模拟一遍流程——用 dhcp 测试工具看 option 是否下发,用 tftp 客户端看文件能否下载。链路通了,问题就解决了一半。
好了,这一章我们把 PXE 启动的骨架搭起来了。后面几章会深入每个环节的故障场景和排查工具。你先把这张流程图刻在脑子里,后面遇到问题就知道该查哪一段了。