CentOS 7.9 自动化批量装机实战:基于 PXE + Kickstart(VMware 完整版)
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.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中的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 服务器)已配置静态 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 服务器 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/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.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/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. 测试裸机批量装机
服务器端已就绪,开启裸机测试:
- 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 '密码' 重新生成 |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)