编写 PXE 启动菜单

编写 PXE 启动菜单
这一步在干什么pxelinux.0 加载后会读取 pxelinux.cfg/default 来决定显示什么菜单、用哪个内核启动、传什么参数。这个文件的 append 行是整个 PXE 流程中最关键的一行——内核和 dracut 收到的所有指令都在这里。逐行说明配置行 含义default linux 默认选中 label linux 菜单项超时后自动执行timeout 60 菜单等待 6 秒无操作则自动启动kernel vmlinuz 告诉 pxelinux.0用 TFTP 目录下的 vmlinuz 作为内核append initrdinitrd.img … 传给内核的参数每个都用空格分隔append 行上每个参数的作用结合原理第 3/4 步参数 谁读 作用initrdinitrd.img Linux 内核 指定初始化内存盘文件inst.repohttp://192.168.145.21/pub/ dracut 去哪下载 stage2 安装程序镜像。不能省略kshttp://192.168.145.21/ks/ks.cfg Anaconda 应答文件的位置ksdeviceeth0 dracut 用哪块网卡下载net.ifnames0 biosdevname0 内核 强制网卡命名为 eth0 而非 ens33/enp0s3影响谁客户机——pxelinux.0 读取这个菜单决定加载哪个内核、传什么参数。参数里 inst.repo 和 ks 缺一不可。cat /var/lib/tftpboot/pxelinux.cfg/default ‘EOF’default linuxtimeout 60display boot.msglabel linuxmenu label ^Install PXEKickstart_RedHat7kernel vmlinuzappend initrdinitrd.img inst.repohttp://192.168.145.21/pub/ kshttp://192.168.145.21/ks/ks.cfg ksdeviceeth0 net.ifnames0 biosdevname0EOFinst.repo 不能省略 它是 dracut 阶段获取 stage2 镜像的唯一来源。ks.cfg 里的 url --url 只在 Anaconda 阶段生效。步骤 10全面验证这一步在干什么搭建完成后做一次完整检查逐项确认每个服务都在运行、每个文件都在正确的位置、HTTP 安装源和 ks.cfg 都能正常访问。三项检查分别对应客户机 PXE 流程的三个阶段验证项 对应原理阶段 通过标准DHCP 服务 running 第 1 步客户机获取 IP systemctl is-active dhcpd → activeTFTP 端口 69 监听 boot 文件存在 第 2 步客户机下载引导文件 pxelinux.0、vmlinuz、initrd.img 都在 /var/lib/tftpboot/HTTP pub 和 ks.cfg 返回 200 第 3/4 步dracut 下载 stage2 Anaconda 下载应答文件 curl 返回 HTTP 200验证服务systemctl is-active dhcpd echo “DHCP OK” || echo “DHCP FAIL”systemctl is-active httpd echo “HTTP OK” || echo “HTTP FAIL”systemctl is-active xinetd echo “TFTP OK” || echo “TFTP FAIL”netstat -ntulp | grep -q 69 echo “Port 69 OK” || echo “Port 69 FAIL”验证 HTTP 可访问curl -s -o /dev/null -w “pub: %{http_code}\n” http://127.0.0.1/pub/curl -s -o /dev/null -w “ks: %{http_code}\n” http://127.0.0.1/ks/ks.cfg验证 TFTP 文件ls /var/lib/tftpboot/pxelinux.0 /var/lib/tftpboot/vmlinuz /var/lib/tftpboot/initrd.img第三部分生产环境部署清单从测试环境搬到生产环境需要修改以下三处配置。清单 1DHCP 配置 — /etc/dhcp/dhcpd.confsubnet 192.168.145.0 netmask 255.255.255.0 { # ★ 改成生产网段range 192.168.145.100 192.168.145.199; # ★ 改 IP 池, 决定同时装多少台option subnet-mask 255.255.255.0; # ★ 子网掩码option routers 192.168.145.1; # ★ 生产网关 IPdefault-lease-time 21600;max-lease-time 43200;next-server 192.168.145.21; # ★ PXE 服务器 IPfilename “/pxelinux.0”;}参数 作用 怎么改subnet … netmask … 声明网段 改成生产网络的网段必须和 PXE 服务器 IP 在同一网段range … 可分配的 IP 范围 范围大小 同时 PXE 启动的最大台数。生产建议 200-500 个option routers 客户机网关 改成生产网络的网关 IPnext-server TFTP 服务器地址 必须和 PXE 服务器 IP 一致filename 引导文件名 固定 /pxelinux.0不用改清单 2PXE 启动菜单 — /var/lib/tftpboot/pxelinux.cfg/defaultdefault linuxtimeout 60 # ★ 菜单等待秒数, 批量部署改成 1display boot.msglabel linuxmenu label ^Install PXEKickstart_RedHat7kernel vmlinuzappend initrdinitrd.img inst.repohttp://192.168.145.21/pub/ kshttp://192.168.145.21/ks/ks.cfg ksdeviceeth0 net.ifnames0 biosdevname0★ 把 IP 换成 PXE 服务器 IP ★ 同上参数 作用 怎么改timeout 菜单等待秒数后自动启动 批量部署改 11秒自动进安装不等人调试阶段改 60010分钟留时间排查inst.repo dracut 下载 stage2 的地址 IP 换成 PXE 服务器实际 IP路径 /pub/ 不变ks Anaconda 下载 ks.cfg 的地址 IP 同上路径 /ks/ks.cfg 不变ksdeviceeth0 强制用 eth0 网卡 如果有双网卡且不是 eth0改成实际卡名或者删掉让系统自动选择net.ifnames0 biosdevname0 强制网卡命名为 eth0 生产物理机如果有多网卡建议保留此参数保证一致性清单 3Kickstart 脚本 — /root/gen_kscfg.sh脚本顶部有 ★ 标记的全是生产需要改的参数这里挑最重要的列出来参数 作用 测试环境值 生产环境应改成KS_HTTP_SERVER PXE 服务器 IP用于 url --url 下载 RPM 包 192.168.145.21 生产 PXE 服务器的实际 IPKS_DISK 目标磁盘设备名 nvme0n1 先装一台测试机进 shell 敲 lsblk 确认物理机多数是 sdaKS_PART_ROOT / 根分区大小 (MB) 10240 生产至少 50G (51200)按实际需求KS_ROOTPW root 密码明文 1 生产必须用强密码或用 KS_ROOTPW_ENCRYPTED 填加密后的密码KS_HOSTNAME 主机名 localhost.localdomain 建议留空或用前缀如 node-配合 DHCP/DNSKS_FIREWALL 防火墙 disabled 生产改 enabledKS_SELINUX SELinux disabled 生产改 enforcingKS_X11 图形界面 --defaultdesktopGNOME 服务器留空文本模式即可KS_PACKAGES 要装的软件包 见默认值 加 openssh-clients、ntp、监控 agent、公司要求的包KS_POST_SCRIPT 装完后执行的脚本 空 注入 SSH 公钥、配 DNS、加监控、初始化脚本等生产部署前自检清单1. 确认 PXE 服务器 IPip a | grep inet2. DHCP 配置的网段和 IP 池是否正确grep -E “subnet|range|routers” /etc/dhcp/dhcpd.conf3. PXE 菜单里两个 URL 的 IP 是否正确grep “inst.repo|ks” /var/lib/tftpboot/pxelinux.cfg/default4. gen_kscfg.sh 里的 KS_HTTP_SERVER 是否正确grep “^KS_HTTP_SERVER” /root/gen_kscfg.sh5. 三个服务都在跑systemctl is-active dhcpd httpd xinetd6. ks.cfg 可以从 HTTP 访问curl -sf http://127.0.0.1/ks/ks.cfg /dev/null echo “ks OK” || echo “ks FAIL”第四部分问题解决问题 1dracut-initqueue timeout → /dev/root does not exist现象dracut 紧急 shelldracut-initqueue[730]: Warning: dracut-initqueue timeoutdracut-initqueue[730]: Warning: Could not boot.dracut-initqueue[730]: Warning: /dev/root does not exist原因PXE 菜单缺少 inst.repodracut 加载完内核和 initrd 后需要从网络下载 LiveOS/squashfs.imgstage2 安装程序镜像。没有 inst.repo 它就不知道该去哪获取反复超时后放弃。解决检查 /var/lib/tftpboot/pxelinux.cfg/default 的 append 行append initrdinitrd.img inst.repohttp://192.168.145.21/pub/ kshttp://…验证方法在 dracut 紧急 shell 中执行ip a # 检查客户端是否拿到 IPping -c 2 192.168.145.21 # 检查到 PXE 服务器的连通性curl -I http://192.168.145.21/pub/ # 检查 HTTP 安装源是否可达如果三个都正常但还报这个错就是缺 inst.repo。