Skip to content

使用 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 Root

2. 环境示例

以一台服务器作为统一的 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/rhel

3. 配置 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 dnsmasq

4. 配置 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 -a

7. 构建无盘根文件系统(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/hosts

7.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 rw

9. 客户端启动流程验证

在 BIOS/UEFI 中启用 PXE:

  • Intel: Network Boot
  • ARM: PXE over IPv4

启动流程:

  1. DHCP 获取 IP
  2. 从 TFTP 下载 pxelinux.0
  3. 加载内核与 initrd
  4. 挂载 NFS root
  5. 进入系统

通过服务器日志验证:

DHCP:

bash
journalctl -u dnsmasq

NFS:

bash
journalctl -u nfs-server

10. 常见问题与排查

问题原因解决
PXE-T01: File not foundTFTP 路径错误检查 tftp-root 和文件名
Kernel panic: unable to mount rootfsNFS 配置错误确认 nfsroot 参数、exportfs 设置
DHCP 超时DHCP 服务未生效关闭其他 DHCP,检查防火墙

11. 总结

使用 PXE + NFS 实现 Linux 无盘启动,可以显著降低节点成本、提升环境一致性,并简化批量部署。文中示例基于 Ubuntu、Rocky 和 Red Hat,其他发行版亦可按类似方式实现。

AI-HPC Organization