公司动态
CentOS 7.9 自动化批量装机实战:基于 PXE + Kickstart(VMware 完整版)
CentOS 7.9 自动化批量装机实战基于 PXE KickstartVMware 完整版 实验目的通过在 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-server192.168.108.10filenamepxelinux.0客户端不知道 TFTP 在哪、该下载哪个文件——DHCP 告诉它TFTP传“启动引导小文件”pxelinux.0引导程序vmlinuz内核initrd.img初始内存盘TFTP 轻量、无认证、UDP 协议适合快速传几百KB~几MB的引导文件但不能传大文件如 ISOHTTP/NFS/FTP传“安装大文件”CentOS ISO 镜像4GBks.cfgKickstart 自动应答文件HTTP 最常用稳定、支持断点续传、易调试用于后续安装过程中的软件包下载和配置读取✅ 图中(传vmlinuz)、(传ISO/ks.cfg)是对数据流向的标注非常准确4️⃣加载内核 → 自动读取 kickstart.cfg客户端通过 TFTP 下载pxelinux.0→ 启动后加载vmlinuzinitrd.img内核启动后initrd中的dracut或anaconda会去HTTP 地址读取ks.cfgks.cfg就是你的“安装脚本”告诉系统分区怎么分clearpart --allroot 密码设多少加密哈希装哪些软件包%packages安装完是否重启reboot5️⃣全自动完成从下载内核 → 加载内存盘 → 读 KS 文件 → 分区 → 安装 RPM 包 → 配置网络/用户 → 生成 GRUB → 重启全程无人干预实现“一键批量装机”。⚠️ 三、图中关键细节提醒避坑重点细节说明“同一局域网”DHCP 是广播协议跨 VLAN/路由器需配置 DHCP Relay初学者务必保证客户端与服务器在同一网段如 VMnet8 关闭 VMware DHCP 后手动配静态 IP。pxelinux.0是入口所有 PXE 流程始于这个文件它相当于一个“微型 bootloader”由 Syslinux 提供。initrd的作用初始内存盘包含驱动如网卡、磁盘、安装程序anaconda让内核能“活起来”并联网下载后续资源KS 文件路径必须可访问inst.kshttp://192.168.108.10/ks/ks.cfg—— 客户端要能通过 HTTP 访问到这个 URL否则安装中断为何不用 FTP/NFSHTTP 最简单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提供引导程序。[rootlocalhost ~]# yum install -y dhcp tftp-server httpd syslinux3. Step 2. 配置 DHCP 服务编辑 DHCP 配置文件指定 IP 范围、网关、DNS并指明 PXE 引导文件及 TFTP 服务器地址。[rootlocalhost ~]# 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)filenamepxelinux.0;# PXE 引导文件名称}提示range范围不要和 PXE 服务器 IP10.6.16.152冲突建议预留固定 IP 段给服务器使用。4. Step 3. 配置 TFTP 服务及引导文件TFTP 默认根目录为/var/lib/tftpboot/需将引导所需文件放入该目录。4.1 复制引导程序[rootlocalhost ~]# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/4.2 挂载 CentOS 7.9 光盘[rootlocalhost ~]# mkdir -p /mnt/cdrom[rootlocalhost ~]# mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt/cdrom[rootlocalhost ~]# df -h /mnt/cdrom文件系统 容量 已用 可用 已用% 挂载点 /dev/loop04.4G4.4G0100% /mnt/cdrom4.3 复制内核、镜像及菜单文件# 复制内核和镜像文件到 tftp 根目录[rootlocalhost ~]# cp /mnt/cdrom/images/pxeboot/vmlinuz /var/lib/tftpboot/[rootlocalhost ~]# cp /mnt/cdrom/images/pxeboot/initrd.img /var/lib/tftpboot/# 复制菜单背景文件和引导菜单模块可选美化界面[rootlocalhost ~]# cp /mnt/cdrom/isolinux/vesamenu.c32 /var/lib/tftpboot/[rootlocalhost ~]# cp /mnt/cdrom/isolinux/boot.msg /var/lib/tftpboot/4.4 创建 PXE 引导菜单配置文件[rootlocalhost ~]# mkdir /var/lib/tftpboot/pxelinux.cfg[rootlocalhost ~]# 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 appendinitrdinitrd.imginst.repohttp://10.6.16.152/centos7inst.kshttp://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 文件目录[rootlocalhost ~]# mkdir -p /var/www/html/centos7[rootlocalhost ~]# mkdir -p /var/www/html/ks# 挂载光驱到 web 目录[rootlocalhost ~]# mount /dev/cdrom /var/www/html/centos7/mount: /dev/sr0 写保护将以只读方式挂载5.2 配置永久挂载写入/etc/fstab防止重启后失效[rootlocalhost ~]# echo /dev/cdrom /var/www/html/centos7 iso9660 defaults 0 0 /etc/fstab6. Step 5. 编写 Kickstart 自动应答文件Kickstart 是实现无人值守安装的核心。[rootlocalhost ~]# vim /var/www/html/ks/ks.cfg#versionDEVEL# 系统认证配置启用影子密码 密码加密算法 SHA512auth--enableshadow--passalgosha512# 网络安装源必须指向你的HTTP仓库url--urlhttp://10.6.16.152/centos7# 安装模式生产环境建议改为 text 更稳定text# 首次启动不运行初始化向导firstboot--disable# 只使用指定硬盘 sdaignoredisk --only-usesda# 键盘布局keyboard--vckeymapus--xlayoutsus# 系统语言lang zh_CN.UTF-8# 网络配置 DHCP自动获取 网卡开机自启network--bootprotodhcp--deviceens33--onbootyes--ipv6auto# root 密码已加密明文请用 rootpw --plaintext 123456 生成替换生产环境不推荐# rootpw --plaintext 123456rootpw--iscrypted$6$YourHashHere# 启用时间同步services--enabledchronyd# 时区上海东八区timezone Asia/Shanghai--isUtc# 安装GRUB引导程序到MBRbootloader--appendcrashkernelauto--locationmbr --boot-drivesda# 清空所有磁盘分区必须无人值守核心clearpart--all--initlabel# 自动分区使用LVM格式autopart--typelvm# 安装的软件包组%packages ^infrastructure-server-environment base core development file-server java-platform chrony kexec-tools %end# 内核崩溃转储配置%addon com_redhat_kdump--enable--reserve-mbauto%end# 密码策略%anaconda pwpolicy root--minlen6--minquality1--notstrict--nochanges--notemptypwpolicy user--minlen6--minquality1--notstrict--nochanges--emptyokpwpolicy luks--minlen6--minquality1--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-hostnamenode-${THIRD}-${FOURTH}echo127.0.0.1 node-${THIRD}-${FOURTH}/etc/hosts systemctlenablesshd chronyd %end优化点说明graphical改为textPXE 批量安装时无 GPU 驱动兼容问题速度更快、失败率更低。新增%post段根据 IP 动态命名主机避免批量装机后主机名冲突。7. Step 6. 环境安全配置与服务启动7.1 关闭防火墙与 SELinux# 关闭防火墙[rootlocalhost ~]# systemctl stop firewalld[rootlocalhost ~]# systemctl disable firewalld# 关闭 SELinux[rootlocalhost ~]# setenforce 0[rootlocalhost ~]# sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config7.2 启动服务并设置开机自启[rootlocalhost ~]# systemctl start dhcpd tftp httpd[rootlocalhost ~]# systemctl enable dhcpd tftp httpd8. Step 7. 检查服务状态使用curl测试 HTTP 服务是否正常提供系统镜像源[rootlocalhost ~]# curl -I http://10.6.16.152/centos7/同时验证 ks 文件可访问[rootlocalhost ~]# 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 receivedDHCP 配置错误或 VMware DHCP 未关闭检查dhcpd.conf确认 VMware DHCP 已关TFTP open timeoutTFTP 服务未启动或防火墙拦截systemctl status tftp关闭 firewalld安装过程中报Unable to read package metadataHTTP 源不可访问或.treeinfo缺失curl测试 URL确认镜像完整挂载安装完进系统主机名全是localhostks.cfg 未配置动态命名补充%post段主机名脚本密码错误无法登录加密哈希值不正确用openssl passwd -6 密码重新生成