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

Mein ursprünglicher Ansatz war die manuelle Änderung des Konfigurationsfiles, allerdings wird das schnell ein Fass ohne Boden und es ist günstiger und weit weniger fehleranfällig den eigentlichen Bock zu suchen.
Letztlich beruht der ‘Fehler’ unter Ubuntu darauf, dass der IP V6-Daemon nicht konfiguriert, aber auch nicht deaktiviert ist. Ein einfaches Deaktivieren des IP V6-Daemons mittels

sudo systemctl disable isc-dhcp-server6

bebebt das Problem und das Verzeichnis /run/dhcp-server bleibt korrekt erhalten

(Vielen Dank an Wolfgang Scherer für den Hinweis!)

 

Hier nun trotzdem noch die Anleitung zum Editieren der Konfigurationsdatei:

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.