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

PXE启动流程示意图

什么是PXE?为什么需要它?

PXE(Pre-boot Execution Environment)读作“Pixie”,它允许客户端计算机在没有硬盘、光驱或U盘的情况下,直接从网络启动。

核心优势

  • 高效部署:同时为多台机器安装系统,极大提升运维效率。

  • 无人值守:结合Kickstart或Preseed文件,实现全自动安装,无需人工干预。

  • 集中管理:所有启动镜像和安装文件都存放在服务器上,易于更新和维护。

  • 硬件诊断:可以网络启动内存测试、病毒扫描等工具,方便维护。

搭建PXE服务器的核心组件

在开始之前,我们需要了解PXE启动流程中的几个关键角色:

  1. DHCP服务器:为客户端分配IP地址,并告知其TFTP服务器的位置和启动文件名。

  2. TFTP服务器:一个简单的文件传输协议服务器,用于向客户端提供引导文件(如Bootloader、内核等)。

  3. HTTP/FTP/NFS服务器:用于存放大型的操作系统安装文件(如ISO镜像内容)。

  4. 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,它需要告诉客户端下一步去哪里。

  1. 编辑DHCP配置文件

    CentOS: /etc/dhcp/dhcpd.conf
    Ubuntu: /etc/dhcp/dhcpd.conf
  2. 清空原文件,替换为以下配置(请根据你的网络环境修改参数):

# /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";
}
  1. 启动并启用DHCP服务

sudo systemctl enable --now dhcpd
# 检查状态,确保没有错误
sudo systemctl status dhcpd

第三步:配置TFTP服务器

TFTP服务器用于提供初始的引导文件。

  1. CentOS:
    默认TFTP根目录是 /var/lib/tftpboot。确保 tftp 服务通过 xinetd 运行。
    编辑 /etc/xinetd.d/tftp,将 disable = yes 改为 disable = no

  2. Ubuntu:
    默认TFTP根目录是 /srv/tftp。编辑 /etc/default/tftpd-hpa,确保配置正确:

    TFTP_USERNAME="tftp"
    TFTP_DIRECTORY="/srv/tftp"
    TFTP_ADDRESS=":69"
    TFTP_OPTIONS="--secure"
  3. 创建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
  1. 创建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
  1. 启动TFTP服务

# CentOS
sudo systemctl enable --now xinetd
# Ubuntu
sudo systemctl enable --now tftpd-hpa

第四步:准备操作系统安装文件

我们需要将操作系统的ISO镜像内容提取到HTTP/FTP服务器能访问的目录。

  1. 挂载并复制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/
  1. 挂载并复制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
  1. 启动HTTP/FTP服务
    我们这里使用VSFTPD。

sudo systemctl enable --now vsftpd

注意:在菜单的 APPEND 行中,我们使用了 inst.repo=http://... 和 url=http://...,这意味着你还需要一个HTTP服务器(如nginxapache)来提供安装文件和自动应答文件。配置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服务器

现在,激动人心的时刻到了!

  1. 找一台支持PXE启动的电脑。

  2. 在BIOS/UEFI设置中,将启动顺序设置为 "Network Boot" 或 "LAN" 优先。

  3. 启动电脑,它应该会自动从DHCP服务器获取IP,然后连接到你的TFTP服务器。

  4. 如果一切配置正确,你将看到我们创建的 "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服务器。虽然初始配置有些复杂,但它带来的长期效率和自动化收益是巨大的。从此,系统安装和部署工作将变得轻松而优雅。

希望这篇指南对你有帮助!如有任何问题,欢迎在评论区留言讨论。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐