¿Cuál es la forma correcta de realizar una copia de seguridad de los archivos de arrendamiento ISC DHCPd?

¿Cuál es la forma correcta de realizar una copia de seguridad de los archivos de arrendamiento ISC DHCPd?

De acuerdo aesta respuesta, los archivos de concesión DHCPd se borran cada hora. El objetivo es realizar una copia de seguridad del archivo de arrendamientos de forma continua, para que nunca se pierda un contrato de arrendamiento. Esto se hace difícil ya que no está claro si el cronómetro se basa en la hora del sistema (por ejemplo, el archivo se reescribe a la 1 am, 2 am, 3 am, etc.) o en el tiempo del proceso (service_start + 1h, service_start + 2h, etc.). Digamos que el archivo de arrendamientos se borra exactamente a las 3 a.m. y se otorga un arrendamiento a las 2:58:55; el servicio que realiza una copia de seguridad del archivo de arrendamiento deberá ejecutarse rápidamente antes de limpiar el archivo.

El proceso DHCPd realiza su propia copia de seguridad del archivo en /var/lib/dhcpd/dhcpd.leases~. Entonces, la mejor opción parece ser crear un script que haga una copia de seguridad de este archivo en otra ubicación cada hora. Pero si se reinicia el proceso DHCPd y el temporizador es relativo al proceso, sería posible que la marca de hora en las tareas de respaldo se alinee, lo que podría terminar en que un proceso lea mientras el otro escribe, y eso podría dañar el archivo ( dependiendo de cómo se haga). Por lo tanto, la tarea de copia de seguridad necesitaría algún conocimiento de cuándo se inicia DHCPd. Esto se está complicando.

¿Cuál es la forma "correcta" de hacer una copia de seguridad del archivo de concesiones DHCPd, para que no se pierdan concesiones?

Respuesta1

Defuentes DHCP:

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

[...]

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

[...]

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

El archivo de copia de seguridad anterior se elimina, luego el archivo de arrendamiento actual se vincula como copia de seguridad con un archivo final ~.

En Linux, con elnotificar(7)instalación de eventos, un vínculo físico se considera un evento de creación.

Sugeriría usar inotifywait(desde inotify-toolsel paquete) para indicar cuándo ocurrió tal evento. Uno debería esperar que su aparición /var/lib/dhcpd/dhcpd.leases~esté directamente lista para realizar una copia de seguridad (es un enlace físico al original). Como el archivo será un archivo diferente (inodo diferente) cada vez, es el directorio el que se debe observar para una detección adecuada y, por ejemplo, la --includeopción se puede usar para simplificar el procesamiento del shell (sin procesamiento, incluso la línea leída se descarta en un variable ficticia):

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

Si el comando no es lo suficientemente reciente, es posible que no lo comprenda; --includeen tal caso, la prueba debe realizarse en el bucle de eventos:

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

Alternativamente, el incronpaquete (disponible al menos en CentOS 8 Stream) podría usarse con unentradaSimilar a:

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

siendo if_correct_file_do_backup, por ejemplo, un shell que comprueba que este era el nombre de archivo deseado:

#!/bin/sh

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

información relacionada