Arch Linux dhcpd 不會在啟動時啟動 - 找不到子網聲明
我想在 Arch Linux 上執行 DHCP 伺服器,但我遇到了問題。我在啟動 dhcpd 時遇到問題。
sudo systemctl start dhcpd@eth0.service
當我登錄後手動執行時,它會開始正常。我正在執行最新版本的 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/dhcpd4@.service`) 並啟用它`systemctl enable dhcpd4@eth0.service`:
[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 dhcpd4@eth0.service`時,一切都執行良好,沒有問題。 我做了很多Google搜尋,但沒有找到解決這個問題的方法。我已經嘗試將文件( 和 )調整`dhcpd.conf`為`dhcpd4@.service`硬`wired.network`編碼介面,添加額外的 DHCP 聲明,改變 Unit Want 等等等;但似乎沒有任何效果。
我找到了問題的答案!問題是啟動過程正在嘗試在網路啟動/配置時啟動 DHCP 服務,因此 DHCP 找不到要綁定的工作介面。這就是為什麼當我手動執行啟動 dhcpd 服務並且在啟動時無法正常工作時它總是有效的原因。
我從這篇文章中找到了答案的線索:dhcp on arch linux - rasp-pi。使用者在單元文件中使用了重新啟動聲明,這使得服務每 6 秒重試一次,直到服務啟動。- 這個臨時解決方案也對我有用。
我在特殊目標頁面上的 systemd 網站上進行了探勘,並在網路啟動後找到了這個執行服務的連結。根據此頁面的建議,我進行了以下調整:
- 在 dhcpd4@.service 單元文件中,我刪除了
Before=...
,更改After
為After=network-online.target
並更改Wants
為Wants=network-online.target
- 我還啟用了
systemd-networkd-wait-online.service
開機啟動。它現在可以在啟動時使用!但是,推薦頁面確實說啟用
systemd-networkd-wait-online.service
確實會減慢您的啟動時間,並且可以減少 90 秒(如果我沒看錯的話)。雖然我只注意到在我的情況下啟動時間增加了大約 1 或 2 秒。
您是否試圖將 dhcpd 限制為僅 eth0?如果沒有,您可以簡單地使用標準的 systemd 服務文件
dhcpd4.service
。如果你是,也許嘗試改變
After=network-pre.target Before=network.target
到
After=network.target
這也在標準 dhcpd4.service中指定。似乎 dhcpd 需要一個活動介面 - 如果它之前
network.target
啟動則無法保證。