第一部分:PXE远程安装服务基础

1.1 什么是PXE?

PXE(Preboot eXecution Environment) 是Intel推出的一种网络引导标准,它允许计算机从网络接口启动,而不依赖本地存储设备(如硬盘、光盘、U盘)。PXE集成在网卡的固件中,通过DHCP获取IP地址,然后从TFTP服务器下载引导程序,进而启动安装程序。

1.2 PXE的核心组件

一个完整的PXE环境需要以下服务协同工作:

组件 作用 常用软件
DHCP服务器 为PXE客户端分配IP地址,并告知TFTP服务器的位置(next-server)和启动文件名(filename) dhcpddnsmasq
TFTP服务器 传输小巧的引导文件,如pxelinux.0、内核vmlinuz、初始化镜像initrd.img tftp-serverdnsmasq
HTTP/FTP/NFS服务器 提供操作系统安装源(即ISO镜像中的文件),可以是HTTP、FTP或NFS协议 httpdvsftpdnfs-utils
Kickstart文件 自动化安装配置文件,定义分区、软件包、网络等设置 文本文件,可通过工具生成

1.3 PXE工作流程

PXE网络安装的完整流程如下:

  1. 客户端启动:客户端开启PXE引导(BIOS/UEFI中设置网络启动优先)。

  2. DHCP请求:客户端广播DHCPDISCOVER,请求IP和引导信息。

  3. DHCP响应:DHCP服务器返回IP地址、next-server(TFTP服务器IP)和filename(引导文件名,如pxelinux.0)。

  4. 下载引导程序:客户端通过TFTP从next-server下载指定的引导文件(如pxelinux.0)。

  5. 加载配置pxelinux.0根据客户端MAC地址或IP范围,从TFTP服务器下载对应的配置文件(通常位于pxelinux.cfg/目录下)。

  6. 下载内核和initrd:根据配置文件指示,客户端通过TFTP下载Linux内核(vmlinuz)和初始内存盘(initrd.img)。

  7. 启动安装程序:内核启动,挂载initrd,加载必要的驱动,然后根据启动参数获取Kickstart文件和安装源。

  8. 自动安装:安装程序根据Kickstart文件自动执行分区、软件包安装、配置等操作,完成系统部署。


第二部分:部署PXE远程安装服务器

环境规划:

  • PXE服务器:Rocky Linux 8.6,IP地址 192.168.1.10/24

  • 网络:192.168.1.0/24,客户端从该网段启动

  • 安装源:Rocky Linux 8.6 DVD ISO镜像

2.1 准备安装源

挂载ISO镜像,准备通过HTTP发布(HTTP相比TFTP更快,适合大文件传输)。

bash

# 创建挂载点
mkdir -p /mnt/rocky8

# 挂载ISO(如果使用物理光驱,设备可能是/dev/cdrom)
mount -o loop /path/to/Rocky-8.6-x86_64-dvd1.iso /mnt/rocky8

# 安装HTTP服务器
dnf install -y httpd

# 创建软链接,使ISO内容可通过HTTP访问
mkdir -p /var/www/html/rocky8
ln -s /mnt/rocky8/* /var/www/html/rocky8/

# 启动httpd
systemctl enable --now httpd

# 防火墙放行HTTP
firewall-cmd --permanent --add-service=http
firewall-cmd --reload

# 测试访问:在浏览器或curl访问 http://192.168.1.10/rocky8/ 应能看到文件列表

2.2 安装配置DHCP服务器

使用dhcp-server包提供DHCP服务,关键是为PXE客户端指定next-serverfilename

bash

dnf install -y dhcp-server

编辑/etc/dhcp/dhcpd.conf

bash

# 全局设置
option domain-name "example.com";
option domain-name-servers 8.8.8.8;
default-lease-time 600;
max-lease-time 7200;
authoritative;

# 子网声明
subnet 192.168.1.0 netmask 255.255.255.0 {
    range 192.168.1.100 192.168.1.200;
    option routers 192.168.1.1;
    option broadcast-address 192.168.1.255;
    
    # PXE特定配置
    next-server 192.168.1.10;           # TFTP服务器IP
    filename "pxelinux.0";               # 引导文件名
}

启动DHCP服务并放行防火墙:

bash

systemctl enable --now dhcpd
firewall-cmd --permanent --add-service=dhcp
firewall-cmd --reload

2.3 安装配置TFTP服务器

TFTP用于传输小文件,如引导程序和内核。

bash

dnf install -y tftp-server

TFTP由xinetd或systemd管理。在Rocky Linux 8中,通常使用systemd的socket激活方式:

bash

systemctl enable --now tftp.socket
# 确认服务监听69端口
netstat -ulnp | grep :69

TFTP的根目录默认为/var/lib/tftpboot/。我们需要将PXE引导文件复制到此目录。

2.4 准备PXE引导文件

安装syslinux包,它提供了pxelinux.0等引导文件:

bash

dnf install -y syslinux

复制引导文件到TFTP根目录:

bash

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/    # 可选,用于菜单
cp /usr/share/syslinux/ldlinux.c32 /var/lib/tftpboot/ # 必需,库文件

从安装源复制内核和initrd到TFTP目录:

bash

cp /mnt/rocky8/images/pxeboot/vmlinuz /var/lib/tftpboot/
cp /mnt/rocky8/images/pxeboot/initrd.img /var/lib/tftpboot/

2.5 创建PXE引导配置文件

PXE引导程序pxelinux.0会查找配置文件,路径规则为:

  1. 基于客户端MAC地址:/var/lib/tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd

  2. 基于IP地址十六进制:/var/lib/tftpboot/pxelinux.cfg/C0A80164(对应192.168.1.100)

  3. 默认文件:/var/lib/tftpboot/pxelinux.cfg/default

我们创建默认配置:

bash

mkdir -p /var/lib/tftpboot/pxelinux.cfg
vim /var/lib/tftpboot/pxelinux.cfg/default

内容如下:

bash

default menu.c32
prompt 0
timeout 100

menu title PXE Boot Menu for Rocky Linux 8.6

label 1
    menu label ^1) Install Rocky Linux 8.6 (Automated with Kickstart)
    kernel vmlinuz
    append initrd=initrd.img inst.repo=http://192.168.1.10/rocky8 inst.ks=http://192.168.1.10/ks.cfg

label 2
    menu label ^2) Install Rocky Linux 8.6 (Manual)
    kernel vmlinuz
    append initrd=initrd.img inst.repo=http://192.168.1.10/rocky8

label 3
    menu label ^3) Boot from local drive
    localboot 0

配置解释

  • default menu.c32:使用菜单界面

  • prompt 0:不提示,直接进入菜单

  • timeout 100:10秒后自动启动默认项(10 * 1/10秒)

  • append行中的参数:inst.repo指定安装源位置,inst.ks指定Kickstart文件位置(下一部分实现)

2.6 验证PXE服务

在开始自动化配置之前,先验证手动安装是否能正常进行。

  1. 准备一台测试机:在虚拟机中新建一台机器,网络设为与PXE服务器同一网段,启动顺序设为网络优先。

  2. 启动测试机:应看到DHCP获取IP,然后下载pxelinux.0,出现引导菜单。

  3. 选择手动安装项:应能进入正常的Anaconda安装界面,证明PXE基础环境搭建成功。


第三部分:实现Kickstart无人值守安装

手动安装已经成功,接下来通过Kickstart实现全自动化。

3.1 什么是Kickstart?

Kickstart是一种自动安装配置文件,其中包含了安装过程中所有问题的答案:语言、键盘、时区、分区、网络、软件包选择、root密码、用户创建等。安装程序会根据Kickstart文件自动执行,无需人工干预。

3.2 生成Kickstart应答文件

有多种方式生成ks.cfg文件:

  1. 手动编写:适合专家,参考语法。

  2. 使用system-config-kickstart工具:图形化工具,生成基本配置。

  3. 参考现有系统的anaconda-ks.cfg:每次手动安装后,系统会在/root/anaconda-ks.cfg生成一个Kickstart文件,可作为模板。

我们以Rocky Linux 8为例,创建适合批量安装的Kickstart文件。

bash

vim /var/www/html/ks.cfg   # 放在HTTP根目录,与前面配置一致

内容示例:

bash

# version=RHEL8
# 使用CDROM作为安装源(但我们会用url覆盖)
# 实际上url参数在PXE命令行中已指定,这里可以省略
# 但为了清晰,也可保留

# 语言和键盘
lang en_US.UTF-8
keyboard us

# 时区
timezone Asia/Shanghai --isUtc

# root密码(加密形式,可用openssl passwd -6生成)
rootpw --iscrypted $6$randomsalt$encrypted_password_here

# 用户
user --name=admin --groups=wheel --iscrypted --password=$6$randomsalt$another_encrypted_password

# 防火墙
firewall --enabled --service=ssh

# SELinux
selinux --enforcing

# 网络配置(DHCP)
network --bootproto=dhcp --device=link --activate

# 服务
services --enabled=sshd,NetworkManager

# 安装源(可省略,因为命令行已指定)
# url --url="http://192.168.1.10/rocky8"

# 分区方案
zerombr                     # 清除所有分区表
clearpart --all --initlabel # 清除所有分区
autopart --type=lvm         # 自动分区,使用LVM

# 或者手动定义分区(更可控)
# part /boot --fstype=xfs --size=1024
# part pv.01 --size=4096 --grow
# volgroup vg_sys pv.01
# logvol swap --vgname=vg_sys --size=2048 --name=lv_swap
# logvol / --vgname=vg_sys --size=8192 --name=lv_root
# logvol /home --vgname=vg_sys --size=2048 --name=lv_home

# 软件包选择
%packages
@^minimal-environment      # 环境组:最小安装
@standard
vim
bash-completion
net-tools
wget
curl
%end

# 安装后执行的脚本
%post
# 配置SSH允许root登录(可选)
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
systemctl restart sshd

# 设置主机名(可根据IP动态设置,这里简化)
echo "pxe-client" > /etc/hostname

# 注册到资产管理(示例)
curl http://192.168.1.10/register.php?mac=$(ip link | grep ether | awk '{print $2}')
%end

# 重启
reboot

3.3 修改PXE引导参数

确保我们在default配置文件的append行中已经添加了inst.ks=http://192.168.1.10/ks.cfg

bash

append initrd=initrd.img inst.repo=http://192.168.1.10/rocky8 inst.ks=http://192.168.1.10/ks.cfg

3.4 验证Kickstart文件语法

虽然Kickstart没有官方的验证工具,但可以检查一些基本错误:

  • 确保加密密码格式正确(可用openssl passwd -6生成SHA512密码)。

  • 确保分区大小合理,不要超过磁盘容量。

  • 确保软件包组名称正确(dnf group list查看可用组)。

3.5 启动测试客户端

现在,将测试机设置为PXE启动,开机后应自动进入菜单,等待超时或自动选择第一项(取决于菜单设置),然后开始自动化安装。

观察过程

  • 客户端获取IP

  • 下载vmlinuz/initrd

  • 启动安装程序

  • 显示“Starting installer, one moment...”后进入自动模式

  • 可能短暂黑屏,随后看到分区、软件包安装进度

  • 安装完成后自动重启

成功标志:重启后进入新安装的系统,root密码和配置与Kickstart一致。

3.6 常见Kickstart问题排查

问题 可能原因 解决方案
安装卡在“starting installer” Kickstart文件获取失败 检查inst.ks URL是否正确,HTTP服务是否可访问;查看日志/tmp/anaconda.log(在安装环境中按Ctrl+Alt+F2切换终端)
分区失败 磁盘大小不足或分区定义冲突 检查磁盘容量,调整分区大小;使用autopart简化
找不到安装源 inst.repo参数错误或HTTP不可达 在安装终端测试curl http://192.168.1.10/rocky8
root密码错误无法登录 密码加密格式错误 使用openssl passwd -6重新生成并替换
网络配置未生效 Kickstart中network配置被覆盖 在%post脚本中再次配置网络或检查NetworkManager状态
软件包安装失败 软件包名称错误或组不存在 检查组名,可使用@core等基本组;在%packages中使用-排除包

第四部分:进阶与优化

4.1 使用DHCP基于MAC地址分配不同配置

通过DHCP的classmatch语句,可以为不同客户端分配不同的启动文件,实现差异化安装(如不同型号服务器安装不同系统)。

bash

class "pxeclients" {
    match if substring (option dhcp-client-identifier, 0, 3) = 01:aa:bb;
    filename "pxelinux.0";
    next-server 192.168.1.10;
}

host webserver {
    hardware ethernet 00:1e:4f:c8:9a:2b;
    fixed-address 192.168.1.50;
    filename "pxelinux-http.0";  # 特殊引导文件
}

4.2 使用PXE菜单实现多版本选择

可以在pxelinux.cfg/default中定义多个label,每个label对应不同的系统版本或配置,用户可在启动时选择。

bash

label centos7
    menu label ^CentOS 7.9
    kernel centos7/vmlinuz
    append initrd=centos7/initrd.img inst.repo=http://192.168.1.10/centos7 inst.ks=http://192.168.1.10/ks-centos7.cfg

label rocky8
    menu label ^Rocky Linux 8.6
    kernel rocky8/vmlinuz
    append initrd=rocky8/initrd.img inst.repo=http://192.168.1.10/rocky8 inst.ks=http://192.168.1.10/ks-rocky8.cfg

需要在TFTP目录下创建对应的子目录并放置内核文件。

4.3 使用Cobbler实现更高级的批量部署

Cobbler是一个PXE的高级封装工具,提供了Web界面、API、模板等功能,大大简化了批量装机管理。但理解PXE底层原理是使用Cobbler的基础。

4.4 日志收集与监控

%post脚本中,可以将安装日志发送到中央服务器,方便追踪每台机器的安装情况。

bash

%post
curl -F "mac=$(ip link show | grep ether | awk '{print $2}')" -F "log=$(cat /root/install.log)" http://192.168.1.10/log_receiver.php
%end

第五部分:PXE与Kickstart最佳实践

  1. 规划好IP地址和主机名:在Kickstart中可以使用网络启动时获得的IP,通过脚本动态生成主机名,避免全部相同。

  2. 使用版本控制管理Kickstart文件:将ks.cfg放入Git,记录变更历史,方便回滚。

  3. 测试先行:先在一台测试机上验证Kickstart文件,确认无误后再批量部署。

  4. 安全考虑

    • 限制DHCP分配范围,避免非授权设备获取IP。

    • 如果PXE服务器暴露在内网,应考虑网络隔离。

    • Kickstart文件中避免明文密码,使用加密形式。

  5. 准备备用安装源:在inst.repo中可以指定多个源,用逗号分隔,实现高可用。

  6. 记录每台机器的MAC地址和配置:在DHCP中为重要机器保留固定IP,方便管理。

  7. 定期清理TFTP缓存:如果更新了内核或引导文件,确保旧文件被删除,避免混淆

Logo

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

更多推荐