我想要在 Arch Linux 上运行 DHCP 服务器,但我遇到了问题。我在启动 dhcpd 时遇到问题。当我登录后手动运行时,它将正常启动。sudo systemctl start [email protected]
我正在运行最新版本的 Arch Linux (4.7.0-1),并且我按照 Arch 网络 wiki 进行了此设置。
我的设置
- dhcpcd 已禁用
我使用systemd-networkd来做静态ip(已启用),配置是(
/etc/systemd/network/wired.network
):[Match] Name=eth0 [Network] Address=10.0.0.2/24 Gateway=10.0.0.1
我的
/etc/dhcpd.conf
很简单:option domain-name-servers 10.0.0.2; option subnet-mask 255.255.255.0; option routers 10.0.0.0.1; subnet 10.0.0.0 netmask 255.255.255.0 { range 10.0.0.5 10.0.0.50; }
我创建了我的 systemd 服务文件 ( ) 并使用以下命令启用它:
/etc/systemd/system/[email protected]
systemctl enable [email protected]
[Unit] Description=IPv4 DHCP server on %I Wants=network.target After=network-pre.target Before=network.target [Service] Type=forking PIDFile=/run/dhcpd4.pid ExecStart=/usr/bin/dhcpd -4 -q -pf /run/dhcpd4.pid %I KillSignal=SIGINT [Install] WantedBy=multi-user.target
当我重新启动时,我在启动时收到一条错误消息(当我运行时journalctl -xe
):
No subnet declaration for eth0 (no IPv4 addresses).
** Ignoring requests on eth0....
然后当我运行时一切都运行良好没有问题。systemctl start [email protected]
我已经进行了大量的谷歌搜索,但没有找到解决这个问题的方法。我尝试将文件(dhcpd.conf
、[email protected]
和wired.network
)调整为硬编码接口、添加额外的 DHCP 声明、更改单元需求等;但似乎没有任何作用。
答案1
您是否尝试将 dhcpd 限制为仅 eth0?如果没有,您可以简单地使用标准的 systemd 服务文件dhcpd4.service
。
如果是的话,也许可以尝试改变
After=network-pre.target
Before=network.target
到
After=network.target
这也规定在标准 dhcpd4.service。看来 dhcpd 需要一个活动接口 - 如果启动则无法保证前 network.target
。
答案2
我找到了问题的答案!问题在于,启动过程在网络启动/配置时尝试启动 DHCP 服务,因此 DHCP 无法找到要绑定的工作接口。这就是为什么当我手动运行启动 dhcpd 服务时它总是有效但在启动时不起作用的原因。
我从这篇文章中找到了答案的线索:arch linux 上的 dhcp - rasp-pi。用户在单元文件中使用了重新启动声明,这使得服务每 6 秒重试一次,直到服务启动。 - 这个临时解决方案也对我有用。
我在 systemd 网站上进行了挖掘特殊目标页面并找到此链接网络通后运行服务。根据本页的建议,我做了以下调整:
- 在里面[电子邮件受保护]单元文件我删除了
Before=...
,更改After
为After=network-online.target
并更改Wants
为Wants=network-online.target
- 我还启用了
systemd-networkd-wait-online.service
开机启动。
现在它可以在启动时运行!然而,建议页面确实说启用systemd-networkd-wait-online.service
确实会减慢启动时间,并且可以缩短 90 秒(如果我没看错的话)。尽管我只注意到在我的情况下启动时间增加了大约 1 或 2 秒。