DHCP: Fehler beim Systemstart/Update (pid-File anlegen)

Der DHCP-Daemon versucht beim Start sein PID-File in das Verzeichnis /run/dhcp-server zu legen. Bei Ubuntu wird genau dieses Verzeichnis beim Reboot oder bei Updates immer wieder gelöscht. Das Resultat ist, dass systemctl status isc-dhcp-server dann zwar bestätigt, dass der Dienst läuft, aber kein pid-File anlegen konnte. Auch Webmin zeigt dann nur noch den Button ‘Server starten’ und ein Anwenden von Änderungen ist nicht mehr möglich.

Man könnte die Konfiguration in /etc/default/isc-dhcp-server anpassen, jedoch führt das nicht zum Erfolg, da die Einstellung im Start-Skript hardcoded ist und die Konfiguration gar nicht gelesen wird. Die einfachste und sicherste Änderung ist, das pid-File in /run zu legen, da dieses Verzeichnis immer vorhanden ist und auch die Rechte schon passend gesetzt sind.

Das anzupassende Config-File ist /lib/systemd/system/isc-dhcp-server.service für IP-V4 und /lib/systemd/system/isc-dhcp-server6.service für IP-V6. Da hier nur IP V4 aktiv ist, stelle ich nur die Anpassungen für diesen Teil dar.

sudo -i
nano /lib/systemd/system/isc-dhcp-server.service


[Unit] 
Description=ISC DHCP IPv4 server 
Documentation=man:dhcpd(8) 
Wants=network-online.target 
After=network-online.target 
After=time-sync.target 
ConditionPathExists=/etc/default/isc-dhcp-server 
ConditionPathExists=|/etc/ltsp/dhcpd.conf 
ConditionPathExists=|/etc/dhcp/dhcpd.conf 

[Service] 
EnvironmentFile=/etc/default/isc-dhcp-server 
RuntimeDirectory=dhcp-server 
# The leases files need to be root:dhcpd even when dropping privileges 
ExecStart=/bin/sh -ec '\ 
   CONFIG_FILE=/etc/dhcp/dhcpd.conf; \ 
   if [ -f /etc/ltsp/dhcpd.conf ]; then CONFIG_FILE=/etc/ltsp/dhcpd.conf; fi; \ 
   [ -e /var/lib/dhcp/dhcpd.leases ] || touch /var/lib/dhcp/dhcpd.leases; \ 
   chown root:dhcpd /var/lib/dhcp /var/lib/dhcp/dhcpd.leases; \ 
   chmod 775 /var/lib/dhcp ; chmod 664 /var/lib/dhcp/dhcpd.leases; \ 
   exec dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcpd.pid -cf $CONFIG_FILE $INTERFACES' 

[Install] 
WantedBy=multi-user.target

Mit sudo -i wechselt man in den root-Kontext und ruft dann mit nano die Konfigurationsdatei auf. Die grün hervorgehobene Zeile muss angepasst werden, da sie über den Parameter -pf den Pfad zum pid-File festlegt.
Es gibt zwar die Variable $DHCPD_PID, die die Einstellung aus /etc/default/isc-dhcp-server lesen würde, es funktioniert nur nicht ….

Wenn die Datei angepasst und gespeichert wurde, müssen noch folgende Befehle eingegeben werden:

systemctl daemon-reload
systemctl restart isc-dhcp-server
systemctl status isc-dhcp-server

systemctl status sollte jetzt zeigen, dass der DHCP-Server aktiv ist und auch den neuen Pfad zum pid-File bestätigen.

root@dhcp3:/lib/systemd/system# systemctl status isc-dhcp-server  
● isc-dhcp-server.service - ISC DHCP IPv4 server 
    Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled; vendor preset: enabled) 
    Active: active (running) since Fri 2020-11-06 09:35:09 CET; 59min ago 
      Docs: man:dhcpd(8) 
  Main PID: 631 (dhcpd) 
     Tasks: 4 (limit: 4620) 
    Memory: 7.6M 
    CGroup: /system.slice/isc-dhcp-server.service 
            └─631 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcpd.pid -cf /etc/dhcp/dhcpd.conf

Der dargestellte Workaround funktioniert bisher sicher und ohne Fehler.

Es bleibt die Anpassung des Pfades zum PID-File in den Webmin-Einstellungen zum DHCP-Server.