Как правильно выполнить резервное копирование файлов аренды ISC DHCPd?

Как правильно выполнить резервное копирование файлов аренды ISC DHCPd?

В соответствии сэтот ответ, файлы аренды DHCPd очищаются каждый час. Цель состоит в том, чтобы постоянно создавать резервные копии файла аренды, чтобы ни одна аренда не была потеряна. Это осложняется тем, что неясно, основан ли часовой таймер на системном времени (например, файл перезаписывается в 1, 2, 3 и т. д.) или на времени процесса (service_start + 1 ч, service_start + 2 ч и т. д.). Допустим, файл аренды очищается ровно в 3 часа ночи, а аренда предоставляется в 2:58:55; служба, которая создает резервную копию файла аренды, должна будет запуститься быстро, прежде чем файл будет очищен.

Процесс DHCPd создает собственную резервную копию файла в /var/lib/dhcpd/dhcpd.leases~. Лучшим вариантом тогда, по-видимому, будет создание скрипта, который будет создавать резервную копию этого файла в другом месте каждый час. Но если процесс DHCPd перезапускается и таймер относительен к процессу, то возможно совпадение часовых меток в задачах резервного копирования, что может привести к тому, что один процесс будет читать, а другой — писать, и это может испортить файл (в зависимости от того, как это делается). Поэтому для задачи резервного копирования потребуются некоторые знания о том, когда запускается DHCPd. Это становится сложным.

Каков «правильный» способ резервного копирования файла аренды DHCPd, чтобы не потерять ни одну аренду?

решение1

ОтИсточники 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) { 

Предыдущий файл резервной копии удаляется, затем текущий файл аренды жестко связывается как резервная копия с конечным расширением ~.

В Linux сinotify(7)возможность создания события, жесткая ссылка рассматривается как событие создания.

Я бы предложил использовать inotifywait(из inotify-toolsпакета) для сигнализации о том, что произошло такое событие. Следует ожидать появления, которое /var/lib/dhcpd/dhcpd.leases~затем будет напрямую готово к резервному копированию (это жесткая ссылка на оригинал). Поскольку файл будет каждый раз другим файлом (другим inode), это каталог, за которым следует следить для правильного обнаружения, и, например, этот --includeпараметр можно использовать для упрощения обработки оболочки (никакой обработки, даже прочитанная строка отбрасывается в фиктивной переменной):

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

Если команда не достаточно свежая, она может быть не понята --include, в таком случае тест необходимо выполнить в цикле событий:

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

В качестве альтернативы incronпакет (доступный по крайней мере в CentOS 8 Stream) можно использовать свходпохожий на:

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

например if_correct_file_do_backup, если оболочка проверяет, что это предполагаемое имя файла:

#!/bin/sh

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

Связанный контент