在主流Linux发行版中,DHCP服务器的默认启动脚本通常是/etc/init.d/dhcpd(对应SysVinit)或dhcpd.service(对应systemd),实际生效路径取决于你的系统版本和服务管理方式。
很多朋友在配置DHCP服务时,第一反应是去找配置文件,却忽略了启动脚本才是服务能否跑起来的“总开关”,今天咱们就把这个开关的底细翻个底朝天,顺便聊聊你怎么摆弄它。
dhcp服务器默认启动脚本是什么?先分清你的系统环境
不同年代、不同发行版的Linux,管理服务的方式完全不同,弄错启动脚本的类型,后面所有命令都会白搭。
systemd 时代的默认脚本:dhcpd.service
目前主流发行版(CentOS 7+、Ubuntu 16.04+、Debian 8+)都使用systemd作为init系统,在systemd环境下,DHCP服务器的默认启动脚本不再是一堆shell命令,而是一个服务单元文件,路径通常在:
/usr/lib/systemd/system/dhcpd.service(红帽系)/lib/systemd/system/dhcpd.service(Debian系)/etc/systemd/system/dhcpd.service(用户自定义覆盖)
这个文件里定义了ExecStart参数,也就是实际执行哪个二进制程序、带什么参数,以CentOS 7上的isc-dhcp-server为例,默认启动脚本内容大致是:
[Unit]
Description=DHCPv4 Server Daemon
After=network.target
[Service]
Type=notify
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd
注意那个-f参数,意思是前台运行,如果你用systemctl start dhcpd启动,服务会一直挂在前台,由systemd负责监听和管理,这是现代服务管理的标准做法。
旧式 SysVinit 的 /etc/init.d/dhcpd
如果你维护的还是CentOS 6、Ubuntu 14.04这类老系统,那默认启动脚本就是/etc/init.d/dhcpd,这是一个标准的shell脚本,支持start、stop、restart、status等参数,脚本内部会加载/etc/sysconfig/dhcpd(红帽系)或/etc/default/isc-dhcp-server(Debian系)这样的配置文件来确定监听哪个网卡。
老脚本的启动方式很简单:
service dhcpd start
或者直接:
/etc/init.d/dhcpd start
各发行版的细微差别
| 发行版 | 服务名称 | 默认配置文件 | 额外选项文件 |
|---|---|---|---|
| CentOS/RHEL 7+ | dhcpd | /etc/dhcp/dhcpd.conf | /etc/sysconfig/dhcpd |
| Ubuntu 18.04+ | isc-dhcp-server | /etc/dhcp/dhcpd.conf | /etc/default/isc-dhcp-server |
| Debian 10+ | isc-dhcp-server | /etc/dhcp/dhcpd.conf | /etc/default/isc-dhcp-server |
| CentOS 6 | dhcpd | /etc/dhcp/dhcpd.conf | /etc/sysconfig/dhcpd |
行业共识认为,无论是哪种发行版,配置文件的位置几乎都是/etc/dhcp/dhcpd.conf,但启动脚本的路径和管理工具差异很大,centos7 dhcp服务器配置文件位置在CentOS 7上就是标准路径,这一点多年未变。
如何查看和确认当前系统的DHCP启动脚本
你不需要死记硬背路径,用几条命令就能摸清当前环境到底用的是哪一套。
使用 systemctl 判断服务状态
先执行:
systemctl status dhcpd
如果返回中包含Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; preset: disabled),说明系统用的是systemd服务单元。Loaded后的第一个路径就是默认启动脚本的完整位置。
如果系统提示Unit dhcpd.service not found,那八成是SysVinit环境,或者你安装的服务名不叫dhcpd,在Ubuntu上试试:
systemctl status isc-dhcp-server
查看脚本内容与依赖关系
对于systemd服务,用cat直接看文件内容:
cat /usr/lib/systemd/system/dhcpd.service
重点关注ExecStart那一行,它能告诉你服务默认用哪个配置、跑在哪个用户下,对于SysVinit脚本,可以执行:
head -50 /etc/init.d/dhcpd
脚本开头的注释块通常会写明依赖关系、chkconfig配置等信息,这些是调整启动顺序的重要依据。
手工执行启动脚本的正确姿势
不建议直接运行/usr/sbin/dhcpd来启动服务,因为这样会绕过systemd的资源限制和日志管理,正确做法是:
- systemd环境:
systemctl start dhcpd - SysVinit环境:
service dhcpd start
如果你非要手工跑二进制,最好带上-f参数保持前台运行,方便调试:
dhcpd -f -d -cf /etc/dhcp/dhcpd.conf
-d会把日志打到终端上,非常适合排查启动报错。
修改DHCP启动脚本或设置开机自启的实操步骤
默认脚本一般不用改,但你可能会遇到这样的需求:换端口、换配置目录、绑定特定网卡,甚至写一段自定义的前置检查,这时候就得动启动脚本了。
基于 systemd 配置开机自启
大多数情况下你只需要两条命令:
systemctl enable dhcpd
systemctl start dhcpd
enable会在/etc/systemd/system/multi-user.target.wants/下创建一个符号链接,指向默认脚本,如果你不想修改原始的.service

文件,可以用覆盖目录:
mkdir -p /etc/systemd/system/dhcpd.service.d
cat > /etc/systemd/system/dhcpd.service.d/custom.conf <<'EOF'
[Service]
ExecStart=
ExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd -lf /var/lib/dhcpd/dhcpd.leases
EOF
注意第一行ExecStart=是用来清空原命令的,这是systemd的“正确覆盖”姿势,修改完后执行:
systemctl daemon-reload
systemctl restart dhcpd
使用 chkconfig 管理 SysVinit 脚本
老系统上,用chkconfig添加或移除开机启动:
chkconfig --add dhcpd
chkconfig --level 2345 dhcpd on
如果想自定义脚本内容,直接编辑/etc/init.d/dhcpd,然后重启服务即可,这种脚本的优点是写起来自由,缺点是不同发行版之间差异巨大,换机器后经常要重写。
常见错误:dhcp服务启动失败怎么办
很多人在执行systemctl start dhcpd后,看到Job for dhcpd.service failed就慌了,别急,先看日志:
journalctl -u dhcpd -n 50 --no-pager
常见原因有这么几个:
- 配置文件语法错误:
dhcpd.conf里括号不匹配、IP段写错,用dhcpd -t -cf /etc/dhcp/dhcpd.conf做语法检查,通过会输出Configuration file OK。 - 监听网卡未指定:如果
/etc/sysconfig/dhcpd中的DHCPDARGS为空,服务可能起不来,明确指定网卡,比如DHCPDARGS=eth0。 - 端口被占用:默认端口67,可以用
ss -ulpn | grep :67看看是否有别的进程占着。 - 权限问题:
/var/lib/dhcpd/dhcpd.leases文件不存在或不可写,创建并给予正确权限:
touch /var/lib/dhcpd/dhcpd.leases
chown dhcpd:dhcpd /var/lib/dhcpd/dhcpd.leases
- 配置了多个子网但子网掩码不对:这属于配置逻辑错误,服务能起来但分配不了地址,用
dhcpd -f -d在前台模式跑一下,看它打印的地址池信息。
从启动脚本到真实配置:DHCP服务器常见的启动参数陷阱
你以为改好启动脚本就万事大吉?不少服务起不来的根源在于启动参数和配置文件不匹配,下面这三个坑,我踩过你也可能踩。
指定了错误的作用域
dhcpd.conf里定义的是“全局+子网”的结构,如果你的网卡IP是168.10.1/24,但配置文件里写的subnet是168.20.0,那服务启动时根本不会监听这个网段,启动脚本中的-cf参数指向的配置文件必须和实际网络环境对应,排查方法很简单:

ip addr show
先看网卡的真实IP,再打开配置文件核对subnet声明。
租约文件路径不一致
默认启动脚本里通常没有显式指定-lf参数,这时dhcpd会使用编译时默认的路径,比如/var/lib/dhcpd/dhcpd.leases,但如果你在systemd服务文件里加了-lf指定到别处,而该路径没有正确创建,服务一样会拒绝启动,行业里有个常见做法:把租约文件放到临时目录(/tmp)来测试,生产环境千万别这么干。
日志输出方式影响判断
SysVinit脚本默认会把日志写入/var/log/messages或/var/log/syslog,而systemd环境则完全交给journald,很多人在老系统上看/var/log/messages没发现错误,就以为服务正常,其实服务可能根本没起来,建议排查时统一使用journalctl -u dhcpd(systemd)或service dhcpd status(SysVinit)来获取当前状态。
Q&A:关于dhcp服务器默认启动脚本的常见疑问
问:我想写自己的启动脚本,怎么确保不干扰系统自带的dhcpd?
答:建议不要替换系统自带的dhcpd.service,而是另起一个服务名,比如dhcpd-custom.service,把你的脚本放到/etc/systemd/system/目录下,修改ExecStart,然后分别enable两个服务,只要确保端口和配置文件不冲突,就能共存。
问:重启机器后DHCP服务没有自动起来,可能是什么原因?
答:先执行systemctl is-enabled dhcpd查看是否已设为开机自启,如果显示disabled,执行systemctl enable dhcpd,如果显示enabled但依旧没启动,检查/etc/systemd/system/multi-user.target.wants/下的符号链接是否存在,以及服务是否因为依赖的network.target启动时间过晚而排队超时,还有一个容易被忽略的点:DHCP服务需要静态IP,如果你的网卡用的是DHCP分配的地址,服务会在网络没准备好之前启动,导致失败,把网卡配置为静态IP后再试。
问:CentOS 7和Ubuntu 20.04的dhcp启动脚本能通用吗?
答:不能,CentOS 7使用dhcpd.service,Ubuntu 20.04使用的是isc-dhcp-server.service,服务名都不同,虽然两者底层都是ISC DHCP程序,但systemd单元文件的ExecStart参数、配置文件路径、选项文件位置都有差异,如果你在写跨发行版的自动化脚本,建议先检测系统发行版再选择对应的服务管理命令,最简单的方式是使用systemctl配合通配符:systemctl list-units | grep -i dhcp,找到实际服务名后再操作,直接复制启动脚本的做法,在现代化系统上已经不可取了。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/749197.html

