CentOS 7.9 自动化批量装机实战:基于 PXE + Kickstart(VMware 完整版)
📌 实验目的
通过在 VMware Workstation 平台模拟真实裸机批量安装操作系统,实现在大规模真实场景下批量自动化安装操作系统的应用需求,极大提升运维效率。
🔧 本文环境参数:PXE 服务器 IP10.6.16.152| 网段10.6.16.0/24| 网关10.6.16.2
📑 目录
- 避坑指南:VMware 网络环境准备
- Step 1. 安装核心服务
- Step 2. 配置 DHCP 服务
- Step 3. 配置 TFTP 服务及引导文件
- Step 4. 配置 HTTP 服务
- Step 5. 编写 Kickstart 自动应答文件
- Step 6. 环境安全配置与服务启动
- Step 7. 检查服务状态
- Step 8. 测试裸机批量装机
- 常见问题排查
🔍 一、整体流程(自上而下)
客户端主机(待装机) ↓ PXE 网卡启动 ↓ PXEServer(同一局域网) │ ├─ DHCP:分配IP + 告诉客户端“TFTP在哪、启动文件叫啥” ├─ TFTP:传小文件(vmlinuz, initrd.img, pxelinux.0) └─ HTTP/NFS/FTP:传大文件(ISO镜像 + ks.cfg) ↓ 加载内核 → 自动读取 kickstart.cfg ↓ 全自动:分区 → 安装 → 配置 → 重启🧩 二、各组件作用详解
1️⃣客户端主机(待装机)
- 是一台无操作系统、无硬盘数据的裸机(或已清空硬盘的机器)。
- 开机时 BIOS/UEFI 检测到网卡支持 PXE → 进入PXE Boot阶段(不是从硬盘/光盘启动!)。
2️⃣PXE 网卡启动
- 网卡固件(ROM)发出DHCP Discover 广播包,请求 IP 和引导信息。
- ⚠️ 关键前提:客户端与 PXE 服务器必须在同一广播域(即同一子网),否则 DHCP 请求收不到。
3️⃣PXE 服务端(核心!三服务协同)
| 服务 | 作用 | 传输什么? | 为什么需要它? |
|---|---|---|---|
| DHCP | 分配 IP + 指路 | next-server=192.168.108.10filename="pxelinux.0" | 客户端不知道 TFTP 在哪、该下载哪个文件——DHCP 告诉它! |
| TFTP | 传“启动引导小文件” | pxelinux.0(引导程序)vmlinuz(内核)initrd.img(初始内存盘) | TFTP 轻量、无认证、UDP 协议,适合快速传几百KB~几MB的引导文件;但不能传大文件(如 ISO) |
| HTTP/NFS/FTP | 传“安装大文件” | CentOS ISO 镜像(4GB+)ks.cfg(Kickstart 自动应答文件) | HTTP 最常用(稳定、支持断点续传、易调试),用于后续安装过程中的软件包下载和配置读取 |
✅ 图中
(传vmlinuz)、(传ISO/ks.cfg)是对数据流向的标注,非常准确!
4️⃣加载内核 → 自动读取 kickstart.cfg
- 客户端通过 TFTP 下载
pxelinux.0→ 启动后加载vmlinuz+initrd.img - 内核启动后,
initrd中的dracut或anaconda会去HTTP 地址读取ks.cfg ks.cfg就是你的“安装脚本”,告诉系统:- 分区怎么分(
clearpart --all) - root 密码设多少(加密哈希)
- 装哪些软件包(
%packages) - 安装完是否重启(
reboot)
- 分区怎么分(
5️⃣全自动完成
- 从下载内核 → 加载内存盘 → 读 KS 文件 → 分区 → 安装 RPM 包 → 配置网络/用户 → 生成 GRUB → 重启
- 全程无人干预,实现“一键批量装机”。
⚠️ 三、图中关键细节提醒(避坑重点)
| 细节 | 说明 |
|---|---|
| “同一局域网” | DHCP 是广播协议,跨 VLAN/路由器需配置 DHCP Relay,初学者务必保证客户端与服务器在同一网段(如 VMnet8 关闭 VMware DHCP 后手动配静态 IP)。 |
pxelinux.0是入口 | 所有 PXE 流程始于这个文件,它相当于一个“微型 bootloader”,由 Syslinux 提供。 |
initrd的作用 | 初始内存盘包含驱动(如网卡、磁盘)、安装程序(anaconda),让内核能“活起来”并联网下载后续资源 |
| KS 文件路径必须可访问 | inst.ks=http://192.168.108.10/ks/ks.cfg—— 客户端要能通过 HTTP 访问到这个 URL,否则安装中断! |
| 为何不用 FTP/NFS? | HTTP 最简单:httpd易部署、日志清晰、浏览器可直接测试;NFS/FTP 需额外权限配置,新手易出错。 |
1. 避坑指南:VMware 网络环境准备
⚠️重要提醒
在 VMware Workstation 中做 PXE 实验,最大的坑是 VMware 自带的 DHCP 服务会与你搭建的 DHCP 服务冲突,导致裸机无法获取正确的引导文件。在开始配置之前,请严格按照以下步骤调整:
- 打开 VMware Workstation。
- 点击顶部菜单栏“编辑 (Edit)”→“虚拟网络编辑器 (Virtual Network Editor)”。
- 点击右下角“更改设置 (Change Settings)”获取管理员权限。
- 选中当前虚拟机使用的网络(通常是VMnet8 NAT 模式)。
- 取消勾选“使用本地 DHCP 服务将 IP 地址分配给虚拟机”。
- 点击 “确定” 保存。
✅ 确保你的模板机(PXE 服务器)已配置静态 IP10.6.16.152,且能正常访问网络。
2. Step 1. 安装核心服务
在 PXE 服务器上安装所需底层服务:DHCP(分配 IP)、TFTP(传输引导文件)、HTTP(传输系统镜像和应答文件)、Syslinux(提供引导程序)。
[root@localhost ~]# yum install -y dhcp tftp-server httpd syslinux3. Step 2. 配置 DHCP 服务
编辑 DHCP 配置文件,指定 IP 范围、网关、DNS,并指明 PXE 引导文件及 TFTP 服务器地址。
[root@localhost ~]# vim /etc/dhcp/dhcpd.conf# 定义子网、子网掩码subnet10.6.16.0 netmask255.255.255.0{range10.6.16.20010.6.16.250;# 分配给裸机的 IP 范围option routers10.6.16.2;# 网关option domain-name-servers114.114.114.114;# DNSdefault-lease-time21600;max-lease-time43200;# PXE 核心配置next-server10.6.16.152;# TFTP 服务器 IP (PXE服务器IP)filename"pxelinux.0";# PXE 引导文件名称}💡提示:
range范围不要和 PXE 服务器 IP10.6.16.152冲突,建议预留固定 IP 段给服务器使用。
4. Step 3. 配置 TFTP 服务及引导文件
TFTP 默认根目录为/var/lib/tftpboot/,需将引导所需文件放入该目录。
4.1 复制引导程序
[root@localhost ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/4.2 挂载 CentOS 7.9 光盘
[root@localhost ~]# mkdir -p /mnt/cdrom[root@localhost ~]# mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom[root@localhost ~]# df -h /mnt/cdrom文件系统 容量 已用 可用 已用% 挂载点 /dev/loop04.4G4.4G0100% /mnt/cdrom4.3 复制内核、镜像及菜单文件
# 复制内核和镜像文件到 tftp 根目录[root@localhost ~]# cp /mnt/cdrom/images/pxeboot/vmlinuz /var/lib/tftpboot/[root@localhost ~]# cp /mnt/cdrom/images/pxeboot/initrd.img /var/lib/tftpboot/# 复制菜单背景文件和引导菜单模块(可选,美化界面)[root@localhost ~]# cp /mnt/cdrom/isolinux/vesamenu.c32 /var/lib/tftpboot/[root@localhost ~]# cp /mnt/cdrom/isolinux/boot.msg /var/lib/tftpboot/4.4 创建 PXE 引导菜单配置文件
[root@localhost ~]# mkdir /var/lib/tftpboot/pxelinux.cfg[root@localhost ~]# vim /var/lib/tftpboot/pxelinux.cfg/defaultdefault vesamenu.c32timeout60display boot.msg menu title CentOS7.9PXE Installation label linux menu label ^Install CentOS7.9(Automated)menu default kernel vmlinuz appendinitrd=initrd.imginst.repo=http://10.6.16.152/centos7inst.ks=http://10.6.16.152/ks/ks.cfg⚠️注意:
inst.ks和inst.repo的 IP 必须为你的 PXE 服务器 IP10.6.16.152。
5. Step 4. 配置 HTTP 服务
利用 Apache (httpd) 对外提供操作系统安装包资源和自动应答文件。
5.1 创建目录并挂载镜像
# 创建系统镜像目录和 ks 文件目录[root@localhost ~]# mkdir -p /var/www/html/centos7[root@localhost ~]# mkdir -p /var/www/html/ks# 挂载光驱到 web 目录[root@localhost ~]# mount /dev/cdrom /var/www/html/centos7/mount: /dev/sr0 写保护,将以只读方式挂载5.2 配置永久挂载
写入/etc/fstab防止重启后失效:
[root@localhost ~]# echo "/dev/cdrom /var/www/html/centos7 iso9660 defaults 0 0" >> /etc/fstab6. Step 5. 编写 Kickstart 自动应答文件
Kickstart 是实现"无人值守"安装的核心。
[root@localhost ~]# vim /var/www/html/ks/ks.cfg#version=DEVEL# 系统认证配置:启用影子密码 + 密码加密算法 SHA512auth--enableshadow--passalgo=sha512# 网络安装源(必须指向你的HTTP仓库)url--url="http://10.6.16.152/centos7"# 安装模式(生产环境建议改为 text 更稳定)text# 首次启动不运行初始化向导firstboot--disable# 只使用指定硬盘 sdaignoredisk --only-use=sda# 键盘布局keyboard--vckeymap=us--xlayouts='us'# 系统语言lang zh_CN.UTF-8# 网络配置 DHCP自动获取 + 网卡开机自启network--bootproto=dhcp--device=ens33--onboot=yes--ipv6=auto# root 密码(已加密,明文请用 rootpw --plaintext 123456 生成替换,生产环境不推荐)# rootpw --plaintext 123456rootpw--iscrypted$6$YourHashHere# 启用时间同步services--enabled="chronyd"# 时区:上海(东八区)timezone Asia/Shanghai--isUtc# 安装GRUB引导程序到MBRbootloader--append="crashkernel=auto"--location=mbr --boot-drive=sda# 清空所有磁盘分区(必须!无人值守核心)clearpart--all--initlabel# 自动分区,使用LVM格式autopart--type=lvm# 安装的软件包组%packages @^infrastructure-server-environment @base @core @development @file-server @java-platform chrony kexec-tools %end# 内核崩溃转储配置%addon com_redhat_kdump--enable--reserve-mb='auto'%end# 密码策略%anaconda pwpolicy root--minlen=6--minquality=1--notstrict--nochanges--notemptypwpolicy user--minlen=6--minquality=1--notstrict--nochanges--emptyokpwpolicy luks--minlen=6--minquality=1--notstrict--nochanges--notempty%end# 安装完自动重启reboot# 安装后脚本:动态设置主机名%postIP=$(ip-4addr show ens33|grep-oP'(?<=inet\s)\d+(\.\d+){3}'|head-1)THIRD=$(echo$IP|cut-d.-f3)FOURTH=$(echo$IP|cut-d.-f4)hostnamectl set-hostname"node-${THIRD}-${FOURTH}"echo"127.0.0.1 node-${THIRD}-${FOURTH}">>/etc/hosts systemctlenablesshd chronyd %end💡优化点说明:
graphical改为text:PXE 批量安装时无 GPU 驱动兼容问题,速度更快、失败率更低。- 新增
%post段:根据 IP 动态命名主机,避免批量装机后主机名冲突。
7. Step 6. 环境安全配置与服务启动
7.1 关闭防火墙与 SELinux
# 关闭防火墙[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# systemctl disable firewalld# 关闭 SELinux[root@localhost ~]# setenforce 0[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config7.2 启动服务并设置开机自启
[root@localhost ~]# systemctl start dhcpd tftp httpd[root@localhost ~]# systemctl enable dhcpd tftp httpd8. Step 7. 检查服务状态
使用curl测试 HTTP 服务是否正常提供系统镜像源:
[root@localhost ~]# curl -I http://10.6.16.152/centos7/同时验证 ks 文件可访问:
[root@localhost ~]# curl -I http://10.6.16.152/ks/ks.cfg✅ 返回
HTTP/1.1 200 OK即表示配置成功。
9. Step 8. 测试裸机批量装机
服务器端已就绪,开启裸机测试:
- VMware 中“文件”→“新建虚拟机”→“自定义(高级)”
- 安装系统选择“稍后安装操作系统”(关键!模拟无系统裸机)
- 系统选Linux → CentOS 7 64位
- 内存建议≥ 2GB(防止内存不足报错)
- 网络选NAT(与 PXE 服务器同 VMnet8)
- 创建新虚拟磁盘(20G 即可)
- 点击“开启此虚拟机”
🎉 正常情况:虚拟机开机后自动获取 IP → 加载 PXE 菜单 → 6秒倒计时后自动进入安装流程 → 安装完毕自动重启 → 进入系统。
10. 常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
卡在PXE-E53: No boot filename received | DHCP 配置错误或 VMware DHCP 未关闭 | 检查dhcpd.conf,确认 VMware DHCP 已关 |
TFTP open timeout | TFTP 服务未启动或防火墙拦截 | systemctl status tftp,关闭 firewalld |
安装过程中报Unable to read package metadata | HTTP 源不可访问或.treeinfo缺失 | curl测试 URL,确认镜像完整挂载 |
安装完进系统主机名全是localhost | ks.cfg 未配置动态命名 | 补充%post段主机名脚本 |
| 密码错误无法登录 | 加密哈希值不正确 | 用openssl passwd -6 '密码'重新生成 |