PXE 高效批量网络装机

PXE 是由 intel 开发的网络引导技术,工作在 Client/Server 模式,允许计算机通过网络从远程服务器下载引导镜像并加载操作系统,无需依赖本地存储设备(硬盘、U盘、光驱等)。它是数据中心批量部署、无盘工作站和系统救援的核心技术之一。

PXE 是一种标准化的预启动环境规范,作为"Wired for Management"框架的一部分,允许客户端在启动阶段通过网络获取操作系统镜像和配置信息。它依赖于网卡内置的 PXE 固件(BOOTROM 芯片)和网络协议栈,使裸机就能够在无本地系统的情况下完成网络引导。

PXE 工作原理和流程

PXE 引导过程遵循严格的“网络启动链”流程,分为五个核心阶段,依赖三大核心协议(DHCP、TFTP、IP)和关键引导文件。

完整引导流程

客户端开机 → BIOS自检 → 网络启动 → DHCP发现 → TFTP下载引导文件 → 加载内核与initrd → 安装/启动系统
  • 阶段一:客户端初始化
    1. 客户机设置为网络启动优先
    2. 网卡 PXE 固件激活,初始化网络协议栈
    3. 发送 DHCP Discover广播包,请求 IP 地址和引导信息
  • 阶段二:DHCP 配置获取
    1. DHCP 服务器响应 DHCP Offer,包含客户端 IP 地址、子网掩码、网关、DNS、TFTP 服务器 IP 地址(引导服务器)、引导文件名(如 pxelinux.0)
    2. 客户端发送 DHCP Request确认,服务器返回 DHCP ACK完成配置
  • 阶段三:TFTP 引导文件下载
    1. 客户端向 TFTP 服务器请求下载引导文件
    2. 下载核心引导程序:pxelinux.0
    3. 引导程序加载 TFTP 服务器上的配置文件
  • 阶段四:内核与初始化镜像加载
    1. 引导程序解析配置文件,获取内核(vmlinuz)和初始化内存盘(initrd.img)路径
    2. 通过 TFTP 或 HTTP 下载内核与 initrd(HTTP 更适合大文件,速度更快)
    3. 引导程序将内核加载到内存,传递内核参数(如 ks=…指定 Kickstart 文件)
  • 阶段五:系统安装 / 启动
    1. 内核启动,执行 initrd 中的初始化脚本
    2. 从 HTTP/NFS/FTP 服务器加载完整系统镜像
    3. 结合 Kickstart/Preseed 文件自动完成分区、包安装、配置等步骤
    4. 安装完成后重启,进入本地系统

openEuler PXE 服务搭建

前提与环境配置

  1. 客户端与 PXE 服务器处于同一局域网、
  2. 准备 openEuler系统镜像
  3. 关闭防火墙 / SELinux
  4. 核心服务:DHCP(IP 分配 + 引导信息)、TFTP(小引导文件传输)、HTTP(系统镜像 + 安装文件传输)
# 关闭firewalld防火墙,禁止开机自启
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭SELinux(重启失效,生产环境可配置规则而非直接关闭)
setenforce 0
# 永久关闭SELinux(可选,需重启生效)
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

安装 PXE 必备软件包

dnf install -y dhcp-server tftp-server httpd syslinux

配置 DHCP 服务器(分配 IP + 传递引导信息)

openEuler 的 DHCP 配置文件路径为/etc/dhcp/dhcpd.conf

# 备份默认配置
mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
# 编辑新配置文件
vim /etc/dhcp/dhcpd.conf

写入

# 全局配置
default-lease-time 600;        # 默认租约时间(秒)
max-lease-time 7200;           # 最大租约时间(秒)
option domain-name "local";    # 局域网域名(自定义)
option domain-name-servers 223.5.5.5, 8.8.8.8;  # DNS服务器

# 子网配置(必须与PXE服务器自身网段一致)
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.150 192.168.1.200;  # 客户端IP地址池(避免与局域网现有IP冲突)
  option routers 192.168.1.1;         # 局域网网关(替换为自身实际网关)
  next-server 192.168.1.100;          # Option 66:TFTP服务器IP(即PXE服务器自身静态IP)
  filename "pxelinux.0";              # Option 67:PXE核心引导文件名(Legacy BIOS模式固定)
}

启动 DHCP 服务并设置开机自启

# 启动dhcpd服务
systemctl start dhcpd
# 设置开机自启
systemctl enable dhcpd
# 检查服务状态(显示active(running)即为正常)
systemctl status dhcpd

配置 TFTP 服务器(传输引导文件 / 内核 / 初始化镜像)

TFTP 是轻量级 UDP 协议,适合传输小文件,PXE 中用于传递pxelinux.0引导程序、Linux 内核(vmlinuz)和初始化内存盘(initrd.img)。openEuler 的 TFTP 服务默认由xinetd超级守护进程管理。

编辑 TFTP 服务配置文件

配置文件路径/etc/xinetd.d/tftp,修改为开启状态:

vim /etc/xinetd.d/tftp

将关键参数disable = yes改为disable = no,其他保持默认:

service tftp
{
        socket_type     = dgram
        protocol        = udp
        wait            = yes
        user            = root
        server          = /usr/sbin/in.tftpd
        server_args     = -s /var/lib/tftpboot  # TFTP根目录(固定路径,无需修改)
        disable         = no  # 核心:改为no,开启TFTP服务
        per_source      = 11
        cps             = 100 2
        flags           = IPv4
}

创建 TFTP 目录结构并复制引导文件

TFTP 根目录为/var/lib/tftpboot(与配置文件中server_args一致),需创建启动菜单配置目录,并复制 syslinux 的 PXE 引导文件:

# 创建TFTP核心目录(pxelinux.cfg用于存放启动菜单配置)
mkdir -p /var/lib/tftpboot/pxelinux.cfg
# 复制PXE核心引导程序pxelinux.0
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# 复制菜单支持文件(实现图形化启动菜单,缺一不可)
cp /usr/share/syslinux/{menu.c32,vesamenu.c32,ldlinux.c32} /var/lib/tftpboot/

挂载 openEuler 镜像并复制内核 /initrd

# 1. 创建镜像挂载目录和HTTP镜像存储目录
mkdir -p /mnt/openEuler_iso  # 镜像临时挂载目录
mkdir -p /var/www/html/openEuler2203  # HTTP服务器的openEuler镜像目录
# 2. 挂载openEuler镜像(这里用的是虚拟机配置中选择的ISO镜像文件)
mount /dev/cdrom /mnt/openEuler_iso
# 3. 复制内核和initrd到TFTP根目录(PXE核心启动文件)
cp /mnt/openEuler_iso/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
# 4. 复制完整镜像文件到HTTP目录(供客户端安装时拉取,HTTP比TFTP快10倍以上)
cp -r /mnt/openEuler_iso/* /var/www/html/openEuler2203/
# 5. 取消挂载(可选,复制完成后即可取消)
umount /mnt/openEuler_iso

启动 TFTP 相关服务

# 启动xinetd(TFTP的管理进程)
systemctl start xinetd
# 设置开机自启
systemctl enable xinetd
# 检查状态(active(running)即为正常)
systemctl status xinetd

配置 HTTP 服务器(提供系统安装源)

HTTP 是文件传输协议,负责向客户端提供完整的 openEuler 安装源、Kickstart 无人值守脚本,相比 TFTP(UDP 无连接),HTTP(TCP 面向连接)传输大文件更稳定、速度更快,是生产环境首选。

启动 HTTP 服务并设置开机自启

# 启动httpd服务
systemctl start httpd
# 设置开机自启
systemctl enable httpd
# 检查状态(active(running)即为正常)
systemctl status httpd

验证 HTTP 安装源可访问

在 PXE 服务器本地执行 curl 命令,验证镜像文件是否可正常访问:

curl http://192.168.1.100/openEuler2203/repodata/repomd.xml

若输出 XML 格式的内容,说明 HTTP 安装源配置正常;若报错,检查文件复制是否完整、httpd 服务是否正常。

配置 PXE 启动菜单(定义客户端启动选项)

启动菜单配置文件存放在 TFTP 的pxelinux.cfg目录下,默认文件名default(客户端会自动加载该文件),用于定义 “安装 openEuler”“救援模式”“本地硬盘启动” 等选项,让客户端开机后显示图形化选择菜单。

编辑启动菜单配置文件

vim /var/lib/tftpboot/pxelinux.cfg/default

写入核心配置

default auto              # 默认加载图形化菜单组件
prompt 0                  # 关闭手动输入提示(0为关闭,1为开启)
timeout 300               # 菜单超时时间(单位:1/10秒,300=30秒,超时自动选择默认项)
MENU TITLE openEuler PXE Boot Menu  # 菜单标题(自定义)
ONTIMEOUT openEuler2203_install     # 超时默认执行“安装openEuler”选项

LABEL auto
  MENU LABEL Install openEuler 22.03 LTS SP3  # 菜单显示名称
  KERNEL vmlinuz                              # 指向TFTP根目录的内核文件
  # 内核参数:指定initrd、HTTP安装源、Kickstart无人值守脚本路径
  APPEND initrd=initrd.img inst.repo=http://192.168.1.100/openEuler2203 inst.ks=http://192.168.1.100/ks.cfg

参数说明:

  • inst.repo:客户端安装源路径,指向 HTTP 服务器的 openEuler 镜像目录,必须与实际 IP 一致
  • inst.ks:Kickstart 无人值守脚本路径,指向 HTTP 服务器的 ks.cfg 文件,实现自动化安装;
  • 所有文件路径(vmlinuz、initrd.img)均为TFTP 根目录相对路径,无需写绝对路径。

配置 Kickstart 无人值守脚本(实现自动化安装)

openEuler 基于 RHEL 系,原生支持Kickstart(KS) 无人值守技术,通过 ks.cfg 脚本定义分区方案、root 密码、安装源、网络配置、软件包选择等,客户端 PXE 启动后会自动加载该脚本,全程无需人工干预,实现批量装机。

创建 KS 脚本文件(存放于 HTTP 根目录)

KS 文件需放在 HTTP 可访问路径,让客户端能通过网络拉取,本次放在/var/www/html/(HTTP 根目录):

vim /var/www/html/ks.cfg

写入 openEuler 适配的 KS 核心配置

#version=RHEL9  # 脚本版本,openEuler 22.03兼容
ignoredisk --only-use=sda  # 仅使用第一块硬盘(sda),避免多硬盘识别问题
autopart --type=lvm        # 自动分区,使用LVM(openEuler默认推荐)
bootloader --location=mbr  # 引导程序安装在MBR(Legacy BIOS模式固定)
clearpart --all --initlabel  # 清除硬盘所有分区,重新初始化卷标

# 网络配置:DHCP自动获取(与PXE DHCP一致),开机自启
network --bootproto=dhcp --device=eth0 --onboot=on --noipv6

# root密码配置:密码为openEuler@123(已加密,可自行替换)
# 加密密码生成方法:在openEuler终端执行`grub-crypt --sha-512`,输入明文密码后生成
rootpw --iscrypted $6$rounds=656000$k8XaU0eQ$Y1eQ5z0P9X8Y7a6S5d4F3g2H1j0K9L8M7N6O5P4Q3R2S1T0/

# 安装源配置:指向HTTP服务器的openEuler镜像(与PXE菜单中一致)
url --url=http://192.168.1.100/openEuler2203

# 安装完成后操作:重启系统
reboot

# 时区配置:亚洲/上海(东八区)
timezone Asia/Shanghai --utc

# 关闭防火墙和SELinux(生产环境按需配置,此处为简化)
firewall --disabled
selinux --disabled

# 软件包组:最小化安装(仅安装核心系统,按需添加,如@Server带图形化)
%packages
@Minimal
%end

# 安装后脚本(可选,执行自定义命令)
%post
echo "openEuler PXE Auto Install Complete!" > /root/pxe_install.log
%end

验证 KS 脚本语法(可选,避免配置错误)

# 安装语法检查工具
dnf install -y pykickstart
# 验证ks.cfg脚本
ksvalidator /var/www/html/ks.cfg

若无任何输出,说明语法正常;若有报错,根据提示修改对应配置项。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐