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.