说明:
在 Linux 环境搭建 PXE 批量装机服务时,CentOS 7 因其稳定性成为运维首选系统。而dhcpd(ISC DHCP Server)作为 CentOS 默认的 DHCP 服务软件,是 PXE 流程中 "IP 分配 + 引导信息传递" 的核心。本文将以 CentOS 7 为例,带来从静态 IP 配置、软件安装、PXE 专属配置到服务验证的完整实操步骤,所有配置均可直接复刻,适合新手入门和运维人员收藏,后续可无缝衔接 TFTP 服务器搭建。
一、实操环境准备
1. 系统环境
- 操作系统:CentOS 7(最小化安装 / 桌面版均可,最小化更适合服务器场景)
- 权限要求:root 用户或 sudo 权限(所有操作需管理员权限)
2. 硬件与网络要求
- 服务器配置静态 IP(DHCP 服务器自身 IP 不可动态变更,否则客户端无法连接);
- 服务器与 PXE 客户端需在同一广播域(无路由时),确保 DHCP 广播包正常传递;
- 关闭防火墙(firewalld)和 SELinux(避免拦截 DHCP 端口或限制配置文件权限)。
二、核心实操步骤(CentOS 7 专属)
步骤 1:配置服务器静态 IP(关键前提,必做!)
DHCP 服务器必须使用静态 IP,否则 IP 变动会导致 PXE 客户端无法获取引导信息。CentOS 7 通过network-scripts配置静态 IP,步骤如下:
1.1 查看网卡名称
bash
ip addr # 或 ifconfig(需安装net-tools:yum install net-tools -y)
输出示例(网卡名称为ens33,以实际查询结果为准):
plaintext
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute ens33
1.2 编辑网卡配置文件
CentOS 7 网卡配置文件路径:/etc/sysconfig/network-scripts/ifcfg-[网卡名称]
bash
# 编辑ens33的配置文件(替换为你的网卡名称)
vim /etc/sysconfig/network-scripts/ifcfg-ens33
1.3 写入静态 IP 配置(替换为你的网段信息)
清空原有内容或修改关键参数,最终配置如下:
bash
TYPE=Ethernet
BOOTPROTO=static # 静态IP模式(默认dhcp,需改为static)
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33 # 网卡名称,与文件名一致
DEVICE=ens33 # 设备名称,与网卡名称一致
ONBOOT=yes # 开机自启网卡
# 静态IP核心配置(根据实际环境修改)
IPADDR=192.168.1.200 # DHCP服务器静态IP
NETMASK=255.255.255.0 # 子网掩码
GATEWAY=192.168.1.1 # 网关IP(与服务器同网段)
DNS1=8.8.8.8 # 主DNS
DNS2=114.114.114.114 # 备用DNS
1.4 重启网络服务并验证
bash
# 重启网络服务(CentOS 7专用命令)
systemctl restart network
# 验证静态IP是否生效
ip addr # 查看ens33网卡是否显示配置的IP(192.168.1.200)
ping 192.168.1.1 # 测试网关连通性
ping 8.8.8.8 # 测试外网连通性(确保能下载软件包)
步骤 2:关闭防火墙与 SELinux(避免拦截服务)
CentOS 7 默认开启 firewalld 和 SELinux,会拦截 DHCP 端口(UDP 67/68)或限制配置文件权限,建议直接关闭(生产环境可按需开放端口,新手优先关闭):
2.1 关闭 firewalld 防火墙
bash
# 停止防火墙服务
systemctl stop firewalld
# 禁止防火墙开机自启
systemctl disable firewalld
# 验证防火墙状态(输出inactive即为关闭)
systemctl status firewalld
2.2 关闭 SELinux(临时 + 永久)
bash
# 临时关闭(立即生效,重启后失效)
setenforce 0
# 永久关闭(修改配置文件,重启后生效)
vim /etc/selinux/config
# 将SELINUX=enforcing改为SELINUX=disabled
SELINUX=disabled
注:永久关闭 SELinux 需重启服务器生效,若暂时不重启,临时关闭已能满足实操需求。
步骤 3:安装 isc-dhcp-server(CentOS 7 包名:dhcp)
CentOS 7 中,ISC DHCP Server 的软件包名为dhcp,服务名为dhcpd,与 Ubuntu 的isc-dhcp-server略有差异,安装步骤如下:
3.1 安装 dhcp 服务
bash
yum install dhcp -y # -y自动确认安装,无需手动输入y
3.2 验证安装是否成功
bash
# 查看dhcp包安装状态
rpm -qa | grep dhcp
输出示例(显示dhcp-4.2.5-82.el7.centos.x86_64即为安装成功):

plaintext
dhcp-4.2.5-82.el7.centos.x86_64
dhcp-common-4.2.5-82.el7.centos.x86_64
步骤 4:配置 dhcpd(PXE 场景核心,重点!)
dhcpd 的核心配置文件是/etc/dhcp/dhcpd.conf,默认配置文件仅含注释和示例,建议先备份默认配置,再编写 PXE 专属配置。
4.1 备份默认配置文件
bash
cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak # 备份原始配置,便于回滚
4.2 编辑 PXE 专属 DHCP 配置文件
bash
vim /etc/dhcp/dhcpd.conf
清空文件原有内容,写入以下配置(根据实际环境修改括号内参数,关键参数已标注):
dhcp
# 1. 全局配置(所有子网通用,优先级低于子网配置)
ddns-update-style none; # 禁用DNS动态更新,避免网络冲突
default-lease-time 43200; # 默认IP租期:12小时(单位:秒)
max-lease-time 86400; # 最大IP租期:24小时(客户端可续租)
log-facility local7; # 日志输出到/var/log/messages,便于排查问题
# 2. 子网配置(PXE客户端所在网段,核心配置!)
subnet 192.168.1.0 netmask 255.255.255.0 {
# ---------------- DHCP地址池配置(批量装机的IP资源库)----------------
range 192.168.1.100 192.168.1.200; # 地址池范围:100个IP(适配50台设备同时装机)
option subnet-mask 255.255.255.0; # 客户端子网掩码
option routers 192.168.1.1; # 客户端网关(与DHCP服务器同网段)
option domain-name-servers 8.8.8.8, 114.114.114.114; # DNS服务器
# ---------------- 地址池保护:预留关键IP(避免被动态分配)----------------
deny duplicates; # 禁止分配重复IP,防止冲突
# 预留TFTP服务器IP(PXE核心依赖,必须设为静态IP)
host tftp-server {
hardware ethernet 00:0C:29:XX:XX:XX; # TFTP服务器的MAC地址(用ip link show查看)
fixed-address 192.168.1.201; # TFTP服务器的固定IP(排除在地址池外)
}
# ---------------- PXE场景特殊配置(灵魂参数,缺一不可!)----------------
next-server 192.168.1.201; # 关键:指定TFTP服务器IP(与上面的fixed-address一致)
filename "pxelinux.0"; # 关键:指定PXE引导文件名(BIOS模式用这个,UEFI用grubnetx64.efi)
}
4.3 关键参数说明(避坑核心)
| 参数 | 作用 | 必须注意的点 |
|---|---|---|
range |
定义动态 IP 分配范围 | 需根据最大装机数量规划(如 100 台设备,地址池至少预留 100 个 IP) |
option routers |
客户端网关 | 必须与 DHCP 服务器、PXE 客户端在同一网段,否则客户端无法连通 TFTP 服务器 |
host tftp-server |
IP 预留 | TFTP 服务器 IP 必须固定,且排除在地址池外,避免被动态分配导致 PXE 引导失败 |
next-server |
指向 TFTP 服务器 | 若 TFTP 与 DHCP 是同一台服务器,可省略(默认使用 DHCP 服务器 IP) |
filename |
PXE 引导文件名称 | BIOS 和 UEFI 模式文件名不同,不可混用(BIOS:pxelinux.0;UEFI:grubnetx64.efi) |
步骤 5:指定 dhcpd 监听网卡(CentOS 7 专属)
dhcpd 默认监听所有网卡,为避免无关网卡干扰,建议明确指定 PXE 客户端所在的网卡(如ens33):
5.1 编辑 dhcpd 服务配置文件
bash
vim /etc/sysconfig/dhcpd
5.2 添加监听网卡配置
在文件末尾添加以下内容(替换为你的网卡名称):
bash
DHCPDARGS="ens33" # 仅监听ens33网卡,其他网卡不响应DHCP请求
步骤 6:启动 dhcpd 服务并设置开机自启
6.1 启动 dhcpd 服务
bash
systemctl start dhcpd
6.2 设置开机自启(服务器重启后自动恢复服务)
bash
systemctl enable dhcpd
6.3 验证服务状态(关键!确认是否启动成功)
bash
systemctl status dhcpd
若输出中显示active (running),且无红色报错,说明服务启动成功:
plaintext
● dhcpd.service - DHCPv4 Server Daemon
Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2024-11-20 20:15:30 CST; 2min 10s ago
Docs: man:dhcpd(8)
man:dhcpd.conf(5)
Main PID: 1234 (dhcpd)
Status: "Dispatching packets..."
CGroup: /system.slice/dhcpd.service
└─1234 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid ens33

三、PXE 场景验证:确保 DHCP 能传递引导信息
服务启动成功后,需通过 3 种方式验证,确保 DHCP 不仅能分配 IP,还能传递next-server和filename这两个 PXE 核心参数。
验证 1:检查配置文件语法(避免语法错误)
若服务启动失败,先检查配置文件语法是否正确:
bash
dhcpd -t -cf /etc/dhcp/dhcpd.conf
- 输出
Syntax: OK:语法正确; - 若有报错(如
missing semicolon):根据提示修改dhcpd.conf(常见错误:缺少分号、括号不匹配)。
验证 2:查看 dhcpd 日志(排查启动问题)
bash
grep dhcpd /var/log/messages

- 正常日志示例:
Listening on LPF/ens33/00:0c:29:xx:xx:xx/192.168.1.0/24(监听成功); - 异常日志:若显示
no subnet declaration,说明子网配置与网卡 IP 不在同一网段,需修改subnet字段。
验证 3:抓包验证 PXE 引导信息(进阶,确保配置生效)
使用tcpdump抓包,确认 DHCP 响应中包含next-server和filename参数,这是 PXE 引导的关键。
3.1 安装 tcpdump(抓包工具)
bash
yum install tcpdump -y
3.2 监听 DHCP 协议包(UDP 67/68 端口)
运行
bash
tcpdump -i ens33 port 67 or port 68 -vv # 仅监听ens33网卡的DHCP流量
3.3 启动 PXE 客户端,观察抓包结果
找一台同网段的空白客户端(或虚拟机),设置为 "网络启动" 并开机,此时抓包窗口会显示DHCP Offer响应,重点查看是否包含以下内容:
plaintext
next-server 192.168.1.201;
filename "pxelinux.0";
若能看到这两个参数,说明 PXE 专属配置已生效,DHCP 服务器能正常传递引导信息。
验证 4:客户端实际测试(最直接)
在 PXE 客户端开机后,通过以下方式确认:
- 客户端能获取到
192.168.1.100-200范围内的 IP; - 客户端可 ping 通 DHCP 服务器(
ping 192.168.1.200)和 TFTP 服务器(ping 192.168.1.201)。
四、CentOS 7 专属常见问题排查(避坑指南)
问题 1:dhcpd 启动失败,提示 "no subnet declaration for ens33"
- 原因:
dhcpd.conf中的subnet网段与 DHCP 服务器静态 IP 不在同一网段(如服务器 IP 是 192.168.1.200,子网配置写成 192.168.2.0); - 解决:修改
subnet 192.168.1.0 netmask 255.255.255.0,确保网段与服务器静态 IP 一致。
问题 2:客户端无法获取 IP,抓包看不到 DHCP Offer
-
原因 1:firewalld 未彻底关闭,拦截了 UDP 67/68 端口;
解决:重新执行关闭命令:
systemctl stop firewalld && systemctl disable firewalld -
原因 2:SELinux 未关闭,限制了 dhcpd 服务权限;
解决:临时关闭
setenforce 0,或永久关闭(修改
/etc/selinux/config后重启服务器);
-
原因 3:客户端与 DHCP 服务器不在同一网段,且无 DHCP 中继;
解决:将客户端和服务器放在同一网段,或配置 DHCP 中继(如路由器中继)。
问题 3:服务启动成功,但next-server参数不生效
-
原因:配置文件语法错误(如缺少分号、MAC 地址格式错误);
解决:用
dhcpd -t -cf /etc/dhcp/dhcpd.conf检查语法,根据提示修正(如 MAC 地址需为
xx:xx:xx:xx:xx:xx格式)。
五、总结
CentOS 7 部署 dhcpd 的核心是 "静态 IP 打底 + PXE 参数点睛 ":静态 IP 确保 DHCP 服务器地址稳定,next-server和filename参数是 PXE 引导的关键,地址池配置支撑批量装机需求。本文的配置文件可直接适配 PXE 场景,后续只需搭建 TFTP 服务器并放置pxelinux.0引导文件,即可完成 PXE 引导的 "第一关"。
下一篇将带来 TFTP 服务器的安装配置与引导文件准备,结合本文的 DHCP 服务,实现 PXE 客户端从 "获取 IP" 到 "下载引导文件" 的完整链路。