使用PXE和Kickstart自动批量部署CentOS7.9 操作系统的方法

一、环境整体架构

服务端系统:CentOS7.9

服务端固定IP:10.11.11.128/24

部署功能:PXE网络启动 + DHCP自动分配IP + HTTP系统源 + Kickstart全自动无人值守安装

客户端效果:开机PXE启动 → 10秒倒计时自动装机 → 自动分区LVM → 自动装系统 → 自动重启 → 开机DHCP自动获取IP

注意点:中文乱码、包组报错、时区报错、磁盘LVM未定义分区、图形界面卡住、无法全自动交互弹窗

二、服务端所需服务

四个核心服务:

  • dhcpd:给客户端分配IP、PXE引导地址
  • tftp-server:传输PXE引导文件(vmlinuz、initrd、菜单)
  • httpd:提供系统安装源 + ks.cfg脚本
  • syslinux:提供pxe引导菜单文件

基本准备:

# 关闭selinux、防火墙
setenforce 0
sed -i ‘s/^SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config
systemctl stop firewalld && systemctl disable firewalld

# 挂载yum镜像
前提:虚拟机已经挂载 CentOS7.9 DVD ISO,物理机插入 CentOS7.9 光盘;`/dev/sr0`就是光驱设备,/dev/cdrom 是 sr0 软链接
# 创建目录
mkdir -p /mnt/cdrom
# 只读挂载sr0
mount -o ro /dev/sr0 /mnt/cdrom
校验挂载:
df -h
ls /mnt/cdrom # 能看到 Packages、repodata 就是成功
cd /etc/yum.repos.d
# 备份全部repo
mkdir bak
mv *.repo bak
vi /etc/yum.repos.d/local.repo
写入以下内容:
[local-cdrom]
name=CentOS7.9 Local DVD
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7
清理缓存,生成 yum 缓存
yum clean all
yum makecache
#列出本地源包
yum list
#根据所需是否开机自动挂载
vi /etc/fstab
增加
/dev/sr0 /mnt/cdrom iso9660 ro,noauto 0 0
此时yum源已配好

#安装组件
yum install -y dhcp tftp-server xinetd syslinux httpd

DHCP配置
编辑vi /etc/dhcp/dhcpd.conf,内容如下:
subnet 10.11.11.0 netmask 255.255.255.0 {
range 10.11.11.150 10.11.11.200;
option routers 10.11.11.1;
option domain-name-servers 223.5.5.5;
next-server 10.11.11.128; # TFTP/PXE服务器本机IP
filename “pxelinux.0”; # legacy引导文件
}

然后通过命令启动dhcpd服务,设置开启自启:
systemctl start dhcpd
systemctl enable dhcpd

TFTP(xinetd 托管):
编辑vi http://etc/xinetd.d/tftp,内容如下:
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot
per_source = 11
cps = 100 2
flags = IPv4
}

# 拷贝引导文件
mkdir -p /var/lib/tftpboot/pxelinux.cfg
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /usr/share/syslinux/menu.c32 /var/lib/tftpboot/
cp /usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot/

# 挂载CentOS ISO,复制内核
已经将sr0的镜像文件挂载到/mnt/cdrom,
cp /mnt/cdrom/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/

systemctl start xinetd
systemctl enable xinetd

检验文件ls /var/lib/tftpboot/
# 应该看到 vmlinuz initrd.img pxelinux.0 vesamenu.c32

拷贝镜像文件:
mkdir -p /var/www/html/centos7
cp -r /mnt/cdrom/* /var/www/html/centos7/

三、配置文件

  1. PXE菜单配置文件(/var/lib/tftpboot/pxelinux.cfg/default)

功能:英文菜单、10秒超时自动装机、强制文本模式彻底杜绝弹窗、加载ks全自动脚本

DEFAULT menu.c32
MENU TITLE CentOS7 PXE Install Menu
TIMEOUT 100
ONTIMEOUT centos7-autoLABEL centos7-auto
MENU LABEL Install CentOS7 Auto(Kickstart)
KERNEL vmlinuz
APPEND initrd=initrd.img inst.repo=http://10.11.11.128/centos7 inst.ks=http://10.11.11.128/ks.cfg inst.text ip=dhcpLABEL local
MENU LABEL Boot Local Harddisk
LOCALBOOT 0

参数说明:

  • TIMEOUT 100 = 10秒倒计时(单位1秒)
  • ONTIMEOUT:超时自动执行自动装机
  • text:强制文本安装,彻底禁止图形界面弹窗
  • ks:指定全自动脚本地址
  1. ks.cfg(/var/www/html/ks.cfg)

包括:时区、用户警告、LVM分区、包组、磁盘分区

分区方案:100G硬盘专属

  • /boot 500M
  • swap 8G
  • /home 10G
  • /opt 10G
  • /usr 10G
  • /var 10G
  • /data 20G
  • 剩余全部空间给 / 根分区

其中加密root密码可以这么查看:
python -c ‘import crypt; print(crypt.crypt(“123456”, “$6$”))’
执行后出现的即是123456的加密密码

# Kickstart for CentOS7自动版
lang en_US.UTF-8
keyboard us
timezone Asia/Shanghai –isUtc# 网卡开机自启、DHCP自动获取IP
network –bootproto=dhcp –device=ens33 –onboot=on –ipv6=auto –activate#加密root密码
rootpw –iscrypted $6$xxxxxxxxxx

# 关闭防火墙、关闭selinux
firewall –disabled
selinux –disabled

install
url –url=http://10.11.11.128/centos7
bootloader –location=mbr –driveorder=sda –append=”crashkernel=auto”

# 强制清空sda所有磁盘分区
clearpart –all –initlabel –drives=sda

# 独立boot分区
part /boot –fstype=xfs –size=500 –ondisk=sda

# 自动创建LVM物理卷(解决 sda2 未定义报错)
part pv.01 –fstype=”lvmpv” –size=1 –grow –ondisk=sda
volgroup centos pv.01

# 精准LVM分区规划
logvol swap –vgname=centos –size=8192 –name=swap
logvol /home –vgname=centos –size=10240 –name=home
logvol /opt –vgname=centos –size=10240 –name=opt
logvol /usr –vgname=centos –size=10240 –name=usr
logvol /var –vgname=centos –size=10240 –name=var
logvol /data –vgname=centos –size=20480 –name=data
logvol / –vgname=centos –size=1 –grow –name=root

# CentOS7 官方正确最小化包组
%packages
@^minimal
vim
net-tools
wget
%end

# 安装完成自动重启
reboot

%post
echo “PXE Auto Install Finished Successfully” > /root/install.log
%end

四、注意点

1:PXE中文菜单乱码

解决:全部改为英文菜单,彻底无乱码

2:ks.cfg包组报错

  • ❌ @minimal (CentOS6用法)
  • ❌ @minimal-install (CentOS8用法)
  • ✅ @^minimal (CentOS7唯一正确写法)

坑3:安装卡在图形界面、需要手动点磁盘

解决:PXE启动参数加 inst.text 强制文本模式 + ks指定–drives=sda强制清盘

坑4:LVM报错 undefined /dev/sda2

解决:使用 pv.01 动态LVM分区,官方标准写法

坑5:时区未设置、需要手动确认

解决:强制写入 timezone Asia/Shanghai –isUtc

五、客户端最终效果

  • 开机PXE启动 → 10秒倒计时自动进入装机
  • 全程无任何交互、无弹窗、无报错
  • 自动清空磁盘、自动创建全套LVM分区
  • 自动安装系统、自动重启
  • 开机网卡自动DHCP获取IP
  • root密码为自定义的加密密码

六、必用校验命令

校验ks语法有无错误:

ksvalidator /var/www/html/ks.cfg

无输出 = 100% 正确,可以直接装机

七、服务端查看DHCP客户端IP命令

# 查看所有已分配客户端IP/MAC
grep -E “lease|hardware ethernet” /var/lib/dhcpd/dhcpd.leases# 实时监控客户端DHCP上线
tail -f /var/log/messages | grep dhcpd

八、整套环境最终状态

✅ DHCP 正常分配IP

✅ TFTP 正常传输引导文件

✅ HTTP 正常读取系统源与ks脚本

✅ Kickstart 100%全自动无交互

✅ LVM分区完美执行

✅ 客户端开机自动DHCP获取IP

✅ 无乱码、无报错、无需人工干预