摘要:你是否厌倦了在一堆服务器或电脑前反复插拔U盘来安装系统?PXE(预启动执行环境)正是你需要的解决方案。本篇博客将带你从零开始,一步步搭建一个功能强大的PXE服务器,实现操作系统的无人值守网络化部署。
PXE启动流程示意图

什么是PXE?为什么需要它?
PXE(Pre-boot Execution Environment)读作“Pixie”,它允许客户端计算机在没有硬盘、光驱或U盘的情况下,直接从网络启动。
核心优势:
-
高效部署:同时为多台机器安装系统,极大提升运维效率。
-
无人值守:结合Kickstart或Preseed文件,实现全自动安装,无需人工干预。
-
集中管理:所有启动镜像和安装文件都存放在服务器上,易于更新和维护。
-
硬件诊断:可以网络启动内存测试、病毒扫描等工具,方便维护。
搭建PXE服务器的核心组件
在开始之前,我们需要了解PXE启动流程中的几个关键角色:
DHCP服务器:为客户端分配IP地址,并告知其TFTP服务器的位置和启动文件名。
TFTP服务器:一个简单的文件传输协议服务器,用于向客户端提供引导文件(如Bootloader、内核等)。
HTTP/FTP/NFS服务器:用于存放大型的操作系统安装文件(如ISO镜像内容)。
PXE引导程序:如 pxelinux.0 (SYSLINUX项目) 或 grubx64.efi (GRUB2),它是客户端首先加载并执行的程序。
实战开始:搭建你的PXE服务器
我们以 CentOS 8/Stream 或 Ubuntu 20.04+ 为例。其他Linux发行版步骤类似。
第一步:安装必要的软件包
首先,更新系统并安装所有必需的组件。
对于CentOS/RHEL及其衍生版:
sudo dnf update -y
sudo dnf install -y dhcp-server tftp-server vsftpd syslinux-tftpboot xinetd
对于Ubuntu/Debian及其衍生版:
sudo apt update && sudo apt upgrade -y
sudo apt install -y isc-dhcp-server tftpd-hpa inetutils-inetd syslinux-common pxelinux vsftpd
第二步:配置DHCP服务器
PXE的核心是DHCP,它需要告诉客户端下一步去哪里。
编辑DHCP配置文件:
CentOS: /etc/dhcp/dhcpd.conf
Ubuntu: /etc/dhcp/dhcpd.conf
清空原文件,替换为以下配置(请根据你的网络环境修改参数):
# /etc/dhcp/dhcpd.conf
authoritative;
# 你的局域网网段和子网掩码
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200; # 分配的IP范围
option routers 192.168.1.1; # 网关地址
option subnet-mask 255.255.255.0;
option domain-name-servers 8.8.8.8, 1.1.1.1; # DNS服务器
default-lease-time 600;
max-lease-time 7200;
# PXE关键配置:指定TFTP服务器地址和启动文件名
next-server 192.168.1.10; # 你的PXE服务器IP地址
filename "pxelinux.0"; # 用于传统BIOS启动
# 如果同时需要支持UEFI,可以添加以下一行(二选一或使用更高级的菜单)
# filename "uefi/shimx64.efi"; 或 "uefi/grubx64.efi";
}
启动并启用DHCP服务:
sudo systemctl enable –now dhcpd
# 检查状态,确保没有错误
sudo systemctl status dhcpd
第三步:配置TFTP服务器
TFTP服务器用于提供初始的引导文件。
CentOS:
默认TFTP根目录是 /var/lib/tftpboot。确保 tftp 服务通过 xinetd 运行。
编辑 /etc/xinetd.d/tftp,将 disable = yes 改为 disable = no。
Ubuntu:
默认TFTP根目录是 /srv/tftp。编辑 /etc/default/tftpd-hpa,确保配置正确:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="–secure"
创建PXE引导文件结构:
我们将使用SYSLINUX的PXELINUX作为BIOS客户端的引导程序。
# 对于CentOS
TFTP_ROOT=/var/lib/tftpboot
# 对于Ubuntu
TFTP_ROOT=/srv/tftp
# 进入TFTP根目录
cd $TFTP_ROOT
# 复制PXELINUX引导文件
cp /usr/share/syslinux/pxelinux.0 .
cp /usr/share/syslinux/vesamenu.c32 .
cp /usr/share/syslinux/ldlinux.c32 .
cp /usr/share/syslinux/libcom32.c32 .
cp /usr/share/syslinux/libutil.c32 .
# 创建必要的目录结构
mkdir -p pxelinux.cfg
mkdir -p images/centos8
mkdir -p images/ubuntu2004
创建PXE引导菜单:
创建一个默认的启动菜单配置文件。
sudo vi $TFTP_ROOT/pxelinux.cfg/default
菜单内容示例:
DEFAULT vesamenu.c32
PROMPT 0
TIMEOUT 60
MENU TITLE PXE Server Main Menu
LABEL local
MENU LABEL Boot from ^Local Drive
LOCALBOOT 0
LABEL centos8
MENU LABEL Install ^CentOS 8 Stream
KERNEL images/centos8/vmlinuz
APPEND initrd=images/centos8/initrd.img inst.repo=http://192.168.1.10/centos8 inst.ks=http://192.168.1.10/ks.cfg
LABEL ubuntu2004
MENU LABEL Install ^Ubuntu 20.04 LTS
KERNEL images/ubuntu2004/linux
APPEND initrd=images/ubuntu2004/initrd.gz auto=true url=http://192.168.1.10/ubuntu2004/preseed.cfg quiet —
LABEL memtest
MENU LABEL Run ^Memtest86+
KERNEL images/memtest86+.bin
启动TFTP服务:
# CentOS
sudo systemctl enable –now xinetd
# Ubuntu
sudo systemctl enable –now tftpd-hpa
第四步:准备操作系统安装文件
我们需要将操作系统的ISO镜像内容提取到HTTP/FTP服务器能访问的目录。
挂载并复制CentOS 8文件:
# 创建挂载点和目标目录
sudo mkdir -p /mnt/iso /var/ftp/centos8
# 假设你的CentOS-8-Stream-ISO文件在 /tmp/ 下
sudo mount -o loop /tmp/CentOS-Stream-ISO-x86_64-latest.iso /mnt/iso
sudo cp -r /mnt/iso/* /var/ftp/centos8/
sudo umount /mnt/iso
# 将内核和初始化RAM磁盘复制到TFTP目录
sudo cp /var/ftp/centos8/images/pxeboot/vmlinuz $TFTP_ROOT/images/centos8/
sudo cp /var/ftp/centos8/images/pxeboot/initrd.img $TFTP_ROOT/images/centos8/
挂载并复制Ubuntu 20.04文件:
sudo mkdir -p /var/ftp/ubuntu2004
sudo mount -o loop /tmp/ubuntu-20.04.3-live-server-amd64.iso /mnt/iso
sudo cp -r /mnt/iso/* /var/ftp/ubuntu2004/
sudo umount /mnt/iso
# 复制内核和initrd
sudo cp /var/ftp/ubuntu2004/casper/vmlinuz $TFTP_ROOT/images/ubuntu2004/linux
sudo cp /var/ftp/ubuntu2004/casper/initrd $TFTP_ROOT/images/ubuntu2004/initrd.gz
启动HTTP/FTP服务:
我们这里使用VSFTPD。
sudo systemctl enable –now vsftpd
注意:在菜单的 APPEND 行中,我们使用了 inst.repo=http://… 和 url=http://…,这意味着你还需要一个HTTP服务器(如nginx或apache)来提供安装文件和自动应答文件。配置HTTP服务器的步骤与此类似,只需将文件放到Web根目录(如 /var/www/html/)下即可。
第五步:配置防火墙(如有)
确保防火墙允许相关服务通过。
对于 firewalld (CentOS):
sudo firewall-cmd –permanent –add-service=dhcp
sudo firewall-cmd –permanent –add-service=tftp
sudo firewall-cmd –permanent –add-service=ftp
sudo firewall-cmd –permanent –add-service=http
sudo firewall-cmd –reload
对于 ufw (Ubuntu):
sudo ufw allow 69/udp
sudo ufw allow 21/tcp
sudo ufw allow 80/tcp
sudo ufw allow 67/udp
测试你的PXE服务器
现在,激动人心的时刻到了!
找一台支持PXE启动的电脑。
在BIOS/UEFI设置中,将启动顺序设置为 "Network Boot" 或 "LAN" 优先。
启动电脑,它应该会自动从DHCP服务器获取IP,然后连接到你的TFTP服务器。
如果一切配置正确,你将看到我们创建的 "PXE Server Main Menu"!
进阶:实现无人值守安装
要实现完全自动化,你需要为每个操作系统创建自动应答文件:
-
CentOS/RHEL:使用 Kickstart (ks.cfg)。
-
Ubuntu/Debian:使用 Preseed (preseed.cfg)。
将这些文件放在HTTP服务器上,并在PXE菜单的 APPEND 行中指定其路径(如上面示例中的 inst.ks= 和 url= 参数)。
故障排除
-
客户端无法获取IP:检查DHCP服务是否正常运行,网络是否连通,DHCP配置中的网段是否正确。
-
获取IP后提示 "TFTP Open timeout":检查TFTP服务是否启动,防火墙是否放行,pxelinux.0 文件是否在正确的TFTP根目录下。
-
无法加载内核或initrd:检查TFTP目录中的文件路径是否与菜单中配置的完全一致,注意大小写。
-
找不到安装源:检查HTTP/FTP服务是否正常,客户端能否ping通服务器,安装文件路径是否正确。
结语
恭喜你!你已经成功搭建了一个功能齐全的PXE服务器。虽然初始配置有些复杂,但它带来的长期效率和自动化收益是巨大的。从此,系统安装和部署工作将变得轻松而优雅。
希望这篇指南对你有帮助!如有任何问题,欢迎在评论区留言讨论。



