Wie lassen sich ISC-DHCPd-Lease-Dateien richtig sichern?

Wie lassen sich ISC-DHCPd-Lease-Dateien richtig sichern?

Entsprechenddiese Antwort, DHCPd-Lease-Dateien werden stündlich gelöscht. Ziel ist es, die Lease-Datei kontinuierlich zu sichern, damit nie ein Lease verloren geht. Dies wird dadurch erschwert, dass unklar ist, ob der Stundentimer auf der Systemzeit (z. B. wird die Datei um 1 Uhr, 2 Uhr, 3 Uhr usw. neu geschrieben) oder auf der Prozesszeit (Servicestart + 1 Stunde, Servicestart + 2 Stunden usw.) basiert. Angenommen, die Lease-Datei wird genau um 3 Uhr gelöscht und um 2:58:55 Uhr wird ein Lease gewährt; der Dienst, der die Lease-Datei sichert, müsste schnell ausgeführt werden, bevor die Datei bereinigt wird.

Der DHCPd-Prozess erstellt seine eigene Sicherungskopie der Datei in /var/lib/dhcpd/dhcpd.leases~. Die beste Lösung scheint dann zu sein, ein Skript zu erstellen, das diese Datei jede Stunde an einem anderen Ort sichert. Wenn der DHCPd-Prozess jedoch neu gestartet wird und der Timer relativ zum Prozess ist, könnte es sein, dass die Stundenmarkierung der Sicherungsaufgaben übereinstimmt, was dazu führen könnte, dass ein Prozess liest, während der andere schreibt, und das könnte die Datei beschädigen (je nachdem, wie es gemacht wird). Die Sicherungsaufgabe müsste also wissen, wann DHCPd startet. Das wird kompliziert.

Was ist die „richtige“ Methode zum Sichern der DHCPd-Lease-Datei, sodass keine Leases verloren gehen?

Antwort1

AusDHCP-Quellen:

      if (snprintf (backfname, sizeof backfname, "%s~", path_dhcpd_db)            >= sizeof backfname)

[...]

      if (unlink (backfname) < 0 && errno != ENOENT) { 

[...]

      if (link(path_dhcpd_db, backfname) < 0) { 

Die vorherige Sicherungsdatei wird gelöscht. Anschließend wird die aktuelle Lease-Datei mit einem abschließenden . als Sicherung fest verknüpft ~.

Unter Linux mit deminotify(7)Ereigniseinrichtung, ein Hardlink wird als Erstellungsereignis angesehen.

inotifywaitIch würde vorschlagen, (aus inotify-toolsdem Paket) zu verwenden, um zu signalisieren, wann ein solches Ereignis eingetreten ist. Man sollte erwarten, dass das Erscheinen /var/lib/dhcpd/dhcpd.leases~davon dann direkt zur Sicherung bereit ist (es ist ein Hardlink zum Original). Da die Datei jedes Mal eine andere Datei (anderer Inode) sein wird, sollte das Verzeichnis überwacht werden, um eine ordnungsgemäße Erkennung zu gewährleisten. Beispielsweise --includekann die Option verwendet werden, um die Shell-Verarbeitung zu vereinfachen (keine Verarbeitung, selbst die gelesene Zeile wird in einer Dummy-Variable verworfen):

inotifywait -m -e create --include dhcpd.leases~ /var/lib/dhcpd | while read dummy; do
    do_backup /var/lib/dhcpd/dhcpd.leases~
done

Wenn der Befehl nicht aktuell genug ist, wird er --includein diesem Fall möglicherweise nicht verstanden. Der Test muss in der Ereignisschleife durchgeführt werden:

inotifywait -m -e create /var/lib/dhcpd | while read -r dir event filename; do
    if [ "$filename" = dhcpd.leases~ ]; then
        do_backup /var/lib/dhcpd/dhcpd.leases~
    fi
done

Alternativ incronkann das Paket (zumindest auf CentOS 8 Stream verfügbar) mit einemEintragähnlich zu:

/var/lib/dhcpd IN_CREATE,recursive=false if_correct_file_do_backup $#

Beispielsweise if_correct_file_do_backupkann eine Shell prüfen, ob dies der beabsichtigte Dateiname ist:

#!/bin/sh

if [ "$1" = dhcpd.leases~ ]; then
    do_backup /var/lib/dhcpd/dhcpd.leases~
fi

verwandte Informationen