先认识两台机器整个部署过程涉及两台机器角色 它是谁 它有什么PXE 服务器 我们搭建的那台 CentOS 7IP 固定为 192.168.145.21 上面跑了三个服务DHCP、TFTP、HTTP还存着 CentOS 的 ISO 安装镜像和一份 ks.cfg 应答文件客户机 需要被安装系统的那台空白机器 什么都没有——没有系统、没有 IP。只有一块网卡支持从网络启动1.2 PXE 服务器上的三个服务分别干什么PXE 服务器本质上是把一张 CentOS 安装光盘ISO通过网络喂给客户机。这个过程中用到了三个服务服务 端口 它提供给客户机的东西 类比DHCP UDP 67 分配给客户机的 IP 地址 告诉客户机引导文件在 TFTP 那里 前台告诉你工位在哪、去哪领资料TFTP UDP 69 启动内核 vmlinuz 初始化内存盘 initrd.img PXE 引导程序 pxelinux.0 传达室你领走第一个包裹HTTP TCP 80 完整安装镜像ISO 里的全部 RPM 包 无人值守应答文件 ks.cfg 仓库你后续大量物资都从这拿DHCP 和 TFTP 只负责启动阶段传的文件很小内核几十 MB。HTTP 负责安装阶段传的文件很大几 GB 的 RPM 包。1.3 客户机从开机到装完的完整过程以下是客户机从一片空白到安装完成的全部对话过程。每一步都标注了谁跟谁说话、“说了什么”第 1 步客户机向 DHCP 要一个 IP客户机开机BIOS 选择网络启动。客户机的网卡在局域网里广播一条消息“有人在吗我是 00:0c:29:16:b6:37请给我一个 IP 地址和启动文件”PXE 服务器上的 DHCP 服务 收到后回复“给你 IP 192.168.145.100你要的引导文件叫 pxelinux.0它在 TFTP 服务器 192.168.145.21 上。”至此客户机有了自己的 IP还知道了下一步该找谁、要什么文件。第 2 步客户机通过 TFTP 下载引导程序和内核客户机拿着 DHCP 给的信息向 PXE 服务器的 TFTP 服务发起请求依次下载三个文件文件 是什么pxelinux.0 引导程序约 27KB。它负责在屏幕上显示Install PXEKickstart菜单然后启动后面的内核vmlinuz Linux 内核约 6MB。这就是最终要装到客户机上的 CentOS 内核initrd.img 初始化内存盘约 40MB。内核启动时需要的一个临时小文件系统里面装着驱动网卡驱动、硬盘驱动等和安装引导工具这三个文件下载完成后pxelinux.0 把控制权交给 vmlinuz内核并把 PXE 菜单里 append 行上写的所有参数一起传给内核。第 3 步内核启动dracut 解析内核参数内核 vmlinuz 在客户机内存中启动后第一个运行的程序叫 dracut。dracut 的工作是在这个临时的小系统里把网卡驱动起来连上网然后去下载真正的安装程序。dracut 会读取 PXE 菜单 append 行上的参数。其中有两条最关键inst.repohttp://192.168.145.21/pub/kshttp://192.168.145.21/ks/ks.cfginst.repo → dracut 自己用。它告诉 dracut“安装源在 HTTP 服务器 192.168.145.21 的 /pub/ 目录下去那里下载 LiveOS/squashfs.img。”ks → dracut 先记下来不自己用留给后面的 Anaconda。dracut 根据 inst.repo 的指示通过 HTTP 下载 LiveOS/squashfs.img约 400MB。这个文件叫 stage2 镜像里面就是 Anaconda 安装程序本体。第 4 步Anaconda 启动解析 ks.cfgstage2 下载完成后AnacondaCentOS 的安装程序启动。Anaconda 读取 dracut 留给它的 ks 参数通过 HTTP 向 http://192.168.145.21/ks/ks.cfg 发起请求下载应答文件。ks.cfg 里写了安装源在哪url --urlhttp://192.168.145.21/pub/— 从这里下载所有 RPM 包要清除哪块磁盘clearpart— 对 nvme0n1 操作怎么分区part /boot、logvol /…root 密码是什么rootpw --plaintext 1装哪些软件%packages 段落装完要不要重启rebootAnaconda 逐行执行 ks.cfg 里的指令清磁盘 → 分区 → 从 HTTP 下载 RPM 包 → 安装 → 设置 root 密码 → 重启第 5 步重启安装完成Anaconda 执行完所有步骤后客户机自动重启。此时客户机的硬盘上已经有了一套完整的 CentOS 7 系统root 密码是 1root 可以直接登录。1.4 最容易踩的坑inst.repo 和 ks.cfg 里的 url --url 不是一回事很多人认为只要 ks.cfg 里写了 url --urlhttp://…dracut 就知道从哪下载 stage2。这是错的。原因很简单——看时间顺序第 3 步dracut 需要 inst.repo 来找安装源下载 stage2↑此时 Anaconda 还没启动ks.cfg 文件还没被读取↑第 4 步Anaconda 启动后才解析 ks.cfg 里的 url --urldracut 阶段Anaconda 不存在。内核参数是唯一的信息来源。所以必须在 PXE 菜单的 append 行写上 inst.repo。Anaconda 阶段Anaconda 已经启动了它会解析 ks.cfg这时候 url --url 才生效。参数 谁读 什么时候读 用来干什么 写在哪inst.repo dracut 内核刚启动时第 3 步 下载 stage2 安装程序镜像 LiveOS/squashfs.img PXE 菜单 append 行ks Anaconda 安装程序启动后第 4 步 获取 ks.cfg 应答文件 PXE 菜单 append 行url --url Anaconda ks.cfg 被解析后第 4 步内部 获取 RPM 安装包 ks.cfg 文件内两者都必须写各管各的阶段不可互相替代。第二部分搭建步骤环境项目 值PXE 服务器 IP 192.168.145.21网段 192.168.145.0/24 (VMware NAT)操作系统 CentOS 7.9.2009ISO 路径 /home/pxe/iso/CentOS-7-x86_64-DVD-2009.iso步骤 1关闭防火墙和 SELinux这一步在干什么CentOS 默认开启的防火墙和 SELinux 会拦截外来网络请求。PXE 服务器需要对外提供 DHCP、TFTP、HTTP 三个服务客户机会主动连接这些端口。如果不关客户机的 DHCP 请求、TFTP 下载、HTTP 访问都可能被拦截导致 PXE 启动流程在第一步就失败。影响谁PXE 服务器自身的安全策略。systemctl stop firewalldsystemctl disable firewalldsetenforce 0sed -i ‘s/SELINUXenforcing/SELINUXdisabled/g’ /etc/selinux/config步骤 2挂载 ISO 并配置本地 yum 源这一步在干什么ISO 文件就像一个压缩包只有挂载之后里面的文件才能被系统访问。挂载后 ISO 的内容出现在 /mnt/cdrom 目录下CentOS 安装光盘里的所有 RPM 包都在这里。然后配置 yum 源告诉 yum安装软件的时候从这个本地目录找不要上网找。因为这台 PXE 服务器可能连不上外网如果不禁用 base/extras/updates 三个联网源yum 会反复尝试连接外网镜像站然后超时导致后续安装 DHCP/TFTP/HTTP 时每步都卡很久。影响谁PXE 服务器自己装软件后面步骤 3 需要 yum 安装 dhcp、tftp-server、syslinux、httpd。注意yum repo 的 [development] 这个名字不能乱改——如果用 system-config-kickstart GUI 工具它硬编码了只认这个 repo 名。