编写 PXE 启动菜单
2026/7/19 2:56:54 网站建设 项目流程

这一步在干什么:pxelinux.0 加载后会读取 pxelinux.cfg/default 来决定显示什么菜单、用哪个内核启动、传什么参数。这个文件的 append 行是整个 PXE 流程中最关键的一行——内核和 dracut 收到的所有指令都在这里。

逐行说明:

配置行 含义
default linux 默认选中 label linux 菜单项,超时后自动执行
timeout 60 菜单等待 6 秒,无操作则自动启动
kernel vmlinuz 告诉 pxelinux.0:用 TFTP 目录下的 vmlinuz 作为内核
append initrd=initrd.img … 传给内核的参数,每个都用空格分隔
append 行上每个参数的作用(结合原理第 3/4 步):

参数 谁读 作用
initrd=initrd.img Linux 内核 指定初始化内存盘文件
inst.repo=http://192.168.145.21/pub/ dracut 去哪下载 stage2 安装程序镜像。不能省略
ks=http://192.168.145.21/ks/ks.cfg Anaconda 应答文件的位置
ksdevice=eth0 dracut 用哪块网卡下载
net.ifnames=0 biosdevname=0 内核 强制网卡命名为 eth0 而非 ens33/enp0s3
影响谁:客户机——pxelinux.0 读取这个菜单,决定加载哪个内核、传什么参数。参数里 inst.repo= 和 ks= 缺一不可。

cat > /var/lib/tftpboot/pxelinux.cfg/default << ‘EOF’
default linux
timeout 60
display boot.msg

label linux
menu label ^Install PXE+Kickstart_RedHat7
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.145.21/pub/ ks=http://192.168.145.21/ks/ks.cfg ksdevice=eth0 net.ifnames=0 biosdevname=0
EOF
inst.repo= 不能省略! 它是 dracut 阶段获取 stage2 镜像的唯一来源。ks.cfg 里的 url --url= 只在 Anaconda 阶段生效。

步骤 10:全面验证
这一步在干什么:搭建完成后做一次完整检查,逐项确认每个服务都在运行、每个文件都在正确的位置、HTTP 安装源和 ks.cfg 都能正常访问。三项检查分别对应客户机 PXE 流程的三个阶段:

验证项 对应原理阶段 通过标准
DHCP 服务 running 第 1 步:客户机获取 IP systemctl is-active dhcpd → active
TFTP 端口 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
第三部分:生产环境部署清单
从测试环境搬到生产环境,需要修改以下三处配置。

清单 1:DHCP 配置 — /etc/dhcp/dhcpd.conf
subnet 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; # ★ 生产网关 IP
default-lease-time 21600;
max-lease-time 43200;
next-server 192.168.145.21; # ★ PXE 服务器 IP
filename “/pxelinux.0”;
}
参数 作用 怎么改
subnet … netmask … 声明网段 改成生产网络的网段,必须和 PXE 服务器 IP 在同一网段
range … 可分配的 IP 范围 范围大小 = 同时 PXE 启动的最大台数。生产建议 200-500 个
option routers 客户机网关 改成生产网络的网关 IP
next-server TFTP 服务器地址 必须和 PXE 服务器 IP 一致
filename 引导文件名 固定 /pxelinux.0,不用改
清单 2:PXE 启动菜单 — /var/lib/tftpboot/pxelinux.cfg/default
default linux
timeout 60 # ★ 菜单等待秒数, 批量部署改成 1
display boot.msg

label linux
menu label ^Install PXE+Kickstart_RedHat7
kernel vmlinuz
append initrd=initrd.img inst.repo=http://192.168.145.21/pub/ ks=http://192.168.145.21/ks/ks.cfg ksdevice=eth0 net.ifnames=0 biosdevname=0

★ 把 IP 换成 PXE 服务器 IP ★ 同上

参数 作用 怎么改
timeout 菜单等待秒数后自动启动 批量部署改 1(1秒自动进安装,不等人);调试阶段改 600(10分钟,留时间排查)
inst.repo= dracut 下载 stage2 的地址 IP 换成 PXE 服务器实际 IP,路径 /pub/ 不变
ks= Anaconda 下载 ks.cfg 的地址 IP 同上,路径 /ks/ks.cfg 不变
ksdevice=eth0 强制用 eth0 网卡 如果有双网卡且不是 eth0,改成实际卡名,或者删掉让系统自动选择
net.ifnames=0 biosdevname=0 强制网卡命名为 eth0 生产物理机如果有多网卡建议保留此参数,保证一致性
清单 3:Kickstart 脚本 — /root/gen_kscfg.sh
脚本顶部有 ★ 标记的全是生产需要改的参数,这里挑最重要的列出来:

参数 作用 测试环境值 生产环境应改成
KS_HTTP_SERVER PXE 服务器 IP(用于 url --url= 下载 RPM 包) 192.168.145.21 生产 PXE 服务器的实际 IP
KS_DISK 目标磁盘设备名 nvme0n1 先装一台测试机进 shell 敲 lsblk 确认(物理机多数是 sda)
KS_PART_ROOT / 根分区大小 (MB) 10240 生产至少 50G (51200),按实际需求
KS_ROOTPW root 密码(明文) 1 生产必须用强密码,或用 KS_ROOTPW_ENCRYPTED 填加密后的密码
KS_HOSTNAME 主机名 localhost.localdomain 建议留空或用前缀(如 node-),配合 DHCP/DNS
KS_FIREWALL 防火墙 disabled 生产改 enabled
KS_SELINUX SELinux disabled 生产改 enforcing
KS_X11 图形界面 --defaultdesktop=GNOME 服务器留空(文本模式即可)
KS_PACKAGES 要装的软件包 见默认值 加 openssh-clients、ntp、监控 agent、公司要求的包
KS_POST_SCRIPT 装完后执行的脚本 空 注入 SSH 公钥、配 DNS、加监控、初始化脚本等
生产部署前自检清单

1. 确认 PXE 服务器 IP

ip a | grep inet

2. DHCP 配置的网段和 IP 池是否正确

grep -E “subnet|range|routers” /etc/dhcp/dhcpd.conf

3. PXE 菜单里两个 URL 的 IP 是否正确

grep “inst.repo|ks=” /var/lib/tftpboot/pxelinux.cfg/default

4. gen_kscfg.sh 里的 KS_HTTP_SERVER 是否正确

grep “^KS_HTTP_SERVER” /root/gen_kscfg.sh

5. 三个服务都在跑

systemctl is-active dhcpd httpd xinetd

6. ks.cfg 可以从 HTTP 访问

curl -sf http://127.0.0.1/ks/ks.cfg > /dev/null && echo “ks OK” || echo “ks FAIL”
第四部分:问题解决
问题 1:dracut-initqueue timeout → /dev/root does not exist
现象(dracut 紧急 shell):

dracut-initqueue[730]: Warning: dracut-initqueue timeout
dracut-initqueue[730]: Warning: Could not boot.
dracut-initqueue[730]: Warning: /dev/root does not exist
原因:PXE 菜单缺少 inst.repo=

dracut 加载完内核和 initrd 后,需要从网络下载 LiveOS/squashfs.img(stage2 安装程序镜像)。没有 inst.repo= 它就不知道该去哪获取,反复超时后放弃。

解决:检查 /var/lib/tftpboot/pxelinux.cfg/default 的 append 行:

append initrd=initrd.img inst.repo=http://192.168.145.21/pub/ ks=http://…
验证方法:在 dracut 紧急 shell 中执行:

ip a # 检查客户端是否拿到 IP
ping -c 2 192.168.145.21 # 检查到 PXE 服务器的连通性
curl -I http://192.168.145.21/pub/ # 检查 HTTP 安装源是否可达
如果三个都正常但还报这个错,就是缺 inst.repo=。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询