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.
inotifywait
Ich würde vorschlagen, (aus inotify-tools
dem 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 --include
kann 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 --include
in 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 incron
kann 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_backup
kann 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