使用 PXE + NFS 实现 Linux 无盘启动(Ubuntu / Rocky / Red Hat 通用)
在数据中心、集群环境、教育实验室或大规模节点部署场景中,无盘启动(Diskless Boot)是一种常见且高效的系统启动方式。通过 PXE(Preboot eXecution Environment)结合 NFS 根文件系统(rootfs),客户端无需本地磁盘即可启动 Linux 系统。这不仅降低硬件成本,也方便集中管理与系统统一更新。
本文将介绍如何使用 PXE + NFS 为 Ubuntu / Rocky Linux / Red Hat Enterprise Linux 提供无盘启动能力,包括必要的服务配置、根文件系统准备以及客户端启动流程。
1. 无盘启动的整体架构(PXE + NFS)
无盘启动涉及三个关键阶段:
1.1 DHCP 阶段:引导信息下发
DHCP 服务器向客户端返回:
- TFTP 服务器地址(next-server)
- 启动文件名(pxelinux.0 或 shim/grubx64.efi)
1.2 TFTP 阶段:加载内核与 initramfs
客户端下载:
- Linux 内核(vmlinuz)
- initramfs(initrd.img)
- 启动引导器(pxelinux/grub)
1.3 NFS 阶段:挂载根文件系统
initramfs 中的脚本执行:
- 挂载 NFS 根文件系统
- 切换到根文件系统并启动系统
架构图:
[PXE Client] → DHCP Server → TFTP Server → Kernel/initrd → NFS Root2. 环境示例
以一台服务器作为统一的 PXE + NFS 提供者:
| 组件 | 示例 |
|---|---|
| PXE/NFS 服务器 | 10.0.0.1 |
| 客户端 | DHCP 自动分配 |
| Linux 发行版 | Ubuntu / Rocky / RHEL |
目录结构示例:
bash
/srv/tftpboot/ # TFTP 文件
/srv/nfsroot/ubuntu # 各发行版 rootfs
/srv/nfsroot/rocky
/srv/nfsroot/rhel3. 配置 DHCP(ISC DHCP / dnsmasq)
3.1 使用 dnsmasq(推荐)
适用于轻量化 PXE 环境。
安装:
bash
sudo apt install dnsmasq配置 /etc/dnsmasq.conf:
ini
port=0
dhcp-range=10.0.0.50,10.0.0.150,12h
# PXE 引导文件
dhcp-boot=pxelinux.0,pxeserver,10.0.0.1
# TFTP 服务
enable-tftp
tftp-root=/srv/tftpboot重启:
bash
sudo systemctl restart dnsmasq4. 配置 TFTP 并准备 PXE 引导文件
安装 TFTP 服务:
bash
sudo apt install tftpd-hpa pxelinux syslinux-common确保目录存在:
bash
sudo mkdir -p /srv/tftpboot/pxelinux.cfg复制启动文件:
bash
cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftpboot/
cp /usr/lib/syslinux/modules/bios/* /srv/tftpboot/5. 准备内核与 initramfs
以 Ubuntu 为例:
bash
mkdir -p /srv/tftpboot/ubuntu
cp /boot/vmlinuz-$(uname -r) /srv/tftpboot/ubuntu/
cp /boot/initrd.img-$(uname -r) /srv/tftpboot/ubuntu/RHEL/Rocky:
bash
cp /boot/vmlinuz-<version> /srv/tftpboot/rocky/
cp /boot/initramfs-<version>.img /srv/tftpboot/rocky/6. 配置 NFS 服务
安装 NFS:
bash
sudo apt install nfs-kernel-server导出根目录:
bash
/srv/nfsroot/ubuntu *(rw,no_root_squash,no_subtree_check)
/srv/nfsroot/rocky *(rw,no_root_squash,no_subtree_check)
/srv/nfsroot/rhel *(rw,no_root_squash,no_subtree_check)应用配置:
bash
sudo exportfs -a7. 构建无盘根文件系统(rootfs)
7.1 Ubuntu 使用 debootstrap
bash
sudo debootstrap focal /srv/nfsroot/ubuntu http://archive.ubuntu.com/ubuntu/必需配置:
bash
echo "ubuntu-client" > /srv/nfsroot/ubuntu/etc/hostname
echo "127.0.1.1 ubuntu-client" >> /srv/nfsroot/ubuntu/etc/hosts7.2 Rocky / RHEL 使用 dnf --installroot
bash
sudo dnf --releasever=9 --installroot=/srv/nfsroot/rocky groupinstall "Minimal Install"8. 配置 PXE 启动菜单
编辑 /srv/tftpboot/pxelinux.cfg/default:
text
DEFAULT menu.c32
PROMPT 0
TIMEOUT 50
LABEL Ubuntu Diskless
KERNEL ubuntu/vmlinuz
APPEND initrd=ubuntu/initrd.img root=/dev/nfs ip=dhcp nfsroot=10.0.0.1:/srv/nfsroot/ubuntu rw
LABEL Rocky Diskless
KERNEL rocky/vmlinuz
APPEND initrd=rocky/initramfs.img root=/dev/nfs ip=dhcp nfsroot=10.0.0.1:/srv/nfsroot/rocky rw9. 客户端启动流程验证
在 BIOS/UEFI 中启用 PXE:
- Intel: Network Boot
- ARM: PXE over IPv4
启动流程:
- DHCP 获取 IP
- 从 TFTP 下载 pxelinux.0
- 加载内核与 initrd
- 挂载 NFS root
- 进入系统
通过服务器日志验证:
DHCP:
bash
journalctl -u dnsmasqNFS:
bash
journalctl -u nfs-server10. 常见问题与排查
| 问题 | 原因 | 解决 |
|---|---|---|
| PXE-T01: File not found | TFTP 路径错误 | 检查 tftp-root 和文件名 |
| Kernel panic: unable to mount rootfs | NFS 配置错误 | 确认 nfsroot 参数、exportfs 设置 |
| DHCP 超时 | DHCP 服务未生效 | 关闭其他 DHCP,检查防火墙 |
11. 总结
使用 PXE + NFS 实现 Linux 无盘启动,可以显著降低节点成本、提升环境一致性,并简化批量部署。文中示例基于 Ubuntu、Rocky 和 Red Hat,其他发行版亦可按类似方式实现。
