PXE高效批量网络装机
是Intel推出的一种网络引导标准,它允许计算机从网络接口启动,而不依赖本地存储设备(如硬盘、光盘、U盘)。PXE集成在网卡的固件中,通过DHCP获取IP地址,然后从TFTP服务器下载引导程序,进而启动安装程序。Kickstart是一种自动安装配置文件,其中包含了安装过程中所有问题的答案:语言、键盘、时区、分区、网络、软件包选择、root密码、用户创建等。安装程序会根据Kickstart文件自动执
第一部分: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) | dhcpd、dnsmasq |
| TFTP服务器 | 传输小巧的引导文件,如pxelinux.0、内核vmlinuz、初始化镜像initrd.img | tftp-server、dnsmasq |
| HTTP/FTP/NFS服务器 | 提供操作系统安装源(即ISO镜像中的文件),可以是HTTP、FTP或NFS协议 | httpd、vsftpd、nfs-utils |
| Kickstart文件 | 自动化安装配置文件,定义分区、软件包、网络等设置 | 文本文件,可通过工具生成 |
1.3 PXE工作流程
PXE网络安装的完整流程如下:
-
客户端启动:客户端开启PXE引导(BIOS/UEFI中设置网络启动优先)。
-
DHCP请求:客户端广播DHCPDISCOVER,请求IP和引导信息。
-
DHCP响应:DHCP服务器返回IP地址、
next-server(TFTP服务器IP)和filename(引导文件名,如pxelinux.0)。 -
下载引导程序:客户端通过TFTP从
next-server下载指定的引导文件(如pxelinux.0)。 -
加载配置:
pxelinux.0根据客户端MAC地址或IP范围,从TFTP服务器下载对应的配置文件(通常位于pxelinux.cfg/目录下)。 -
下载内核和initrd:根据配置文件指示,客户端通过TFTP下载Linux内核(
vmlinuz)和初始内存盘(initrd.img)。 -
启动安装程序:内核启动,挂载initrd,加载必要的驱动,然后根据启动参数获取Kickstart文件和安装源。
-
自动安装:安装程序根据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-server和filename。
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会查找配置文件,路径规则为:
-
基于客户端MAC地址:
/var/lib/tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd -
基于IP地址十六进制:
/var/lib/tftpboot/pxelinux.cfg/C0A80164(对应192.168.1.100) -
默认文件:
/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服务
在开始自动化配置之前,先验证手动安装是否能正常进行。
-
准备一台测试机:在虚拟机中新建一台机器,网络设为与PXE服务器同一网段,启动顺序设为网络优先。
-
启动测试机:应看到DHCP获取IP,然后下载
pxelinux.0,出现引导菜单。 -
选择手动安装项:应能进入正常的Anaconda安装界面,证明PXE基础环境搭建成功。
第三部分:实现Kickstart无人值守安装
手动安装已经成功,接下来通过Kickstart实现全自动化。
3.1 什么是Kickstart?
Kickstart是一种自动安装配置文件,其中包含了安装过程中所有问题的答案:语言、键盘、时区、分区、网络、软件包选择、root密码、用户创建等。安装程序会根据Kickstart文件自动执行,无需人工干预。
3.2 生成Kickstart应答文件
有多种方式生成ks.cfg文件:
-
手动编写:适合专家,参考语法。
-
使用system-config-kickstart工具:图形化工具,生成基本配置。
-
参考现有系统的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的class和match语句,可以为不同客户端分配不同的启动文件,实现差异化安装(如不同型号服务器安装不同系统)。
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最佳实践
-
规划好IP地址和主机名:在Kickstart中可以使用网络启动时获得的IP,通过脚本动态生成主机名,避免全部相同。
-
使用版本控制管理Kickstart文件:将ks.cfg放入Git,记录变更历史,方便回滚。
-
测试先行:先在一台测试机上验证Kickstart文件,确认无误后再批量部署。
-
安全考虑:
-
限制DHCP分配范围,避免非授权设备获取IP。
-
如果PXE服务器暴露在内网,应考虑网络隔离。
-
Kickstart文件中避免明文密码,使用加密形式。
-
-
准备备用安装源:在
inst.repo中可以指定多个源,用逗号分隔,实现高可用。 -
记录每台机器的MAC地址和配置:在DHCP中为重要机器保留固定IP,方便管理。
-
定期清理TFTP缓存:如果更新了内核或引导文件,确保旧文件被删除,避免混淆
更多推荐
所有评论(0)