CentOS 7.9 自动化批量装机实战:基于 PXE + Kickstart(VMware 完整版)

📌 实验目的
通过在 VMware Workstation 平台模拟真实裸机批量安装操作系统,实现在大规模真实场景下批量自动化安装操作系统的应用需求,极大提升运维效率。
🔧 本文环境参数:PXE 服务器 IP 10.6.16.152 | 网段 10.6.16.0/24 | 网关 10.6.16.2


📑 目录

  1. 避坑指南:VMware 网络环境准备
  2. Step 1. 安装核心服务
  3. Step 2. 配置 DHCP 服务
  4. Step 3. 配置 TFTP 服务及引导文件
  5. Step 4. 配置 HTTP 服务
  6. Step 5. 编写 Kickstart 自动应答文件
  7. Step 6. 环境安全配置与服务启动
  8. Step 7. 检查服务状态
  9. Step 8. 测试裸机批量装机
  10. 常见问题排查

🔍 一、整体流程(自上而下)

客户端主机(待装机)  
       ↓  
    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.10 filename="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 中的 dracutanaconda 会去 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 服务冲突,导致裸机无法获取正确的引导文件。在开始配置之前,请严格按照以下步骤调整:

  1. 打开 VMware Workstation。
  2. 点击顶部菜单栏 “编辑 (Edit)”“虚拟网络编辑器 (Virtual Network Editor)”
  3. 点击右下角 “更改设置 (Change Settings)” 获取管理员权限。
  4. 选中当前虚拟机使用的网络(通常是 VMnet8 NAT 模式)。
  5. 取消勾选 “使用本地 DHCP 服务将 IP 地址分配给虚拟机”。
  6. 点击 “确定” 保存。

✅ 确保你的模板机(PXE 服务器)已配置静态 IP 10.6.16.152,且能正常访问网络。


2. Step 1. 安装核心服务

在 PXE 服务器上安装所需底层服务:DHCP(分配 IP)、TFTP(传输引导文件)、HTTP(传输系统镜像和应答文件)、Syslinux(提供引导程序)。

[root@localhost ~]# yum install -y dhcp tftp-server httpd syslinux

3. Step 2. 配置 DHCP 服务

编辑 DHCP 配置文件,指定 IP 范围、网关、DNS,并指明 PXE 引导文件及 TFTP 服务器地址。

[root@localhost ~]# vim /etc/dhcp/dhcpd.conf
# 定义子网、子网掩码
subnet 10.6.16.0 netmask 255.255.255.0 {
  range 10.6.16.200 10.6.16.250;      # 分配给裸机的 IP 范围
  option routers 10.6.16.2;            # 网关
  option domain-name-servers 114.114.114.114; # DNS
  default-lease-time 21600;
  max-lease-time 43200;
  
  # PXE 核心配置
  next-server 10.6.16.152;             # TFTP 服务器 IP (PXE服务器IP)
  filename "pxelinux.0";               # PXE 引导文件名称
}

💡 提示range 范围不要和 PXE 服务器 IP 10.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/loop0      4.4G  4.4G     0  100% /mnt/cdrom

4.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/default
default vesamenu.c32
timeout 60
display boot.msg

menu title CentOS 7.9 PXE Installation

label linux
  menu label ^Install CentOS 7.9 (Automated)
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.repo=http://10.6.16.152/centos7 inst.ks=http://10.6.16.152/ks/ks.cfg

⚠️ 注意inst.ksinst.repo 的 IP 必须为你的 PXE 服务器 IP 10.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/fstab

6. Step 5. 编写 Kickstart 自动应答文件

Kickstart 是实现"无人值守"安装的核心。

[root@localhost ~]# vim /var/www/html/ks/ks.cfg
#version=DEVEL

# 系统认证配置:启用影子密码 + 密码加密算法 SHA512
auth --enableshadow --passalgo=sha512

# 网络安装源(必须指向你的HTTP仓库)
url --url="http://10.6.16.152/centos7"

# 安装模式(生产环境建议改为 text 更稳定)
text

# 首次启动不运行初始化向导
firstboot --disable

# 只使用指定硬盘 sda
ignoredisk --only-use=sda

# 键盘布局
keyboard --vckeymap=us --xlayouts='us'

# 系统语言
lang zh_CN.UTF-8

# 网络配置 DHCP自动获取 + 网卡开机自启
network --bootproto=dhcp --device=ens33 --onboot=yes --ipv6=auto

# root 密码(已加密,请用 openssl passwd -6 '你的密码' 生成替换)
# openssl passwd -6 '123456'
rootpw --iscrypted $6$YourHashHere

# 启用时间同步
services --enabled="chronyd"

# 时区:上海(东八区)
timezone Asia/Shanghai --isUtc

# 安装GRUB引导程序到MBR
bootloader --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 --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

# 安装完自动重启
reboot

# 安装后脚本:动态设置主机名
%post
IP=$(ip -4 addr 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
systemctl enable sshd 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/config

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

[root@localhost ~]# systemctl start dhcpd tftp httpd
[root@localhost ~]# systemctl enable dhcpd tftp httpd

8. 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. 测试裸机批量装机

服务器端已就绪,开启裸机测试:

  1. VMware 中 “文件”“新建虚拟机”“自定义(高级)”
  2. 安装系统选择 “稍后安装操作系统”(关键!模拟无系统裸机)
  3. 系统选 Linux → CentOS 7 64位
  4. 内存建议 ≥ 2GB(防止内存不足报错)
  5. 网络选 NAT(与 PXE 服务器同 VMnet8)
  6. 创建新虚拟磁盘(20G 即可)
  7. 点击 “开启此虚拟机”

🎉 正常情况:虚拟机开机后自动获取 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 '密码' 重新生成

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐