Raspberry Pi OS で isc-dhcp-server がシステム起動時に起動されない
ことの発端
Raspberry Pi OS で isc-dhcp-server がシステム起動時に起動されない現象に遭遇しました。起動後に手動で systemctl start すると正常に起動できます。
エラーは以下の通り。
No subnet declaration for eth0 (no IPv4 addresses).
起動後に手動だと起動するという状況から推測と以下サイトの情報から、dhcpcd でeth0の固定IPアドレスの設定をする前に、isc-dhcp-server 起動しようとしているためエラーになっていると推測しました。
raspbian 10で isc-dhcp-serverが再機動時に起動失敗する – ywataseの日記
isc-dhcp-server 用の systemd の設定ファイルがない?
isc-dhcp-server の起動ファイルに設定を追加しようとしたのですが、/usr/systemd/system にも /etc/systemd/system にもisc-dhcp-server.services が存在しません。
isc-dhcp-server を systemctl で enable すると以下のメッセージが表示されます。
# systemctl enable isc-dhcp-server
isc-dhcp-server.service is not a native service, redirecting to systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable isc-dhcp-server
どうやら普通のサービスとはちょっと異なるようです。そこでドロップインファイル を使ってオプションを追加します。
/etc/systemd/system/isc-dhcp-server.service.d/10-additional.conf
※参考にしたサイトでは最初からドロップインファイルを作成してました。
設定追加
参考サイトでは起動に失敗したら時間を遅らせて再起動するというアプローチで解決していましたが、 dhcpcd の後に isc-dhcp-server を起動するように指定したら良いのではないかと考え、設定してみました。
[Unit]
After=dhcpcd.service
設定を確認します。
# systemctl daemon-reload
# systemctl list-dependencies --after isc-dhcp-server
isc-dhcp-server.service
● ├─dhcpcd.service
● ├─slapd.service
● ├─system.slice
● ├─systemd-journald.socket
● ├─basic.target
~略~
dhcpcd の後になってますので、これで再起動してみましたが、まだ同じエラーがでます。journalctl を見ても、dhcpcd よりも前に isc-dhcp-server が起動しています。
結局、強引な解決方法
isc-dhcp-server の起動を後ろにずらすことがどうしてもできないため、参考サイトと同じようにサービス起動に失敗したら15秒待ってから再度起動する設定を入れます。
/etc/systemd/system/isc-dhcp-server.service.d/10-additional.conf
[Service]
Restart=on-failure
RestartSec=15s
これで起動はするようになりましたが、スッキリしません。
特に2台あるラズパイ4の両方でisc-dhcp-serverを動かしていますが、この症状がでるのは1台のラズパイのみなのです。もう少し調べてみます。