De acordo comesta resposta, os arquivos de concessão DHCPd são apagados a cada hora. O objetivo é fazer backup do arquivo de arrendamento continuamente, para que nunca haja perda de um arrendamento. Isto é dificultado porque não está claro se o cronômetro é baseado na hora do sistema (por exemplo, o arquivo é reescrito à 1h, 2h, 3h, etc.) ou no tempo do processo (service_start + 1h, service_start + 2h, etc). Digamos que o arquivo de arrendamento seja limpo exatamente às 3h e o arrendamento seja concedido às 2h58min55s; o serviço que faz backup do arquivo de concessão precisaria ser executado rapidamente antes que o arquivo fosse limpo.
O processo DHCPd faz seu próprio backup do arquivo para /var/lib/dhcpd/dhcpd.leases~
. A melhor aposta parece ser criar um script que faça backup desse arquivo em outro local a cada hora. Mas se o processo DHCPd for reiniciado e o cronômetro for relativo ao processo, seria possível alinhar a marca da hora nas tarefas de backup, o que pode terminar na leitura de um processo enquanto o outro grava, e isso pode danificar o arquivo ( dependendo de como isso é feito). Portanto, a tarefa de backup precisaria de algum conhecimento de quando o DHCPd é iniciado. Isso está ficando complicado.
Qual é a maneira 'correta' de fazer backup do arquivo de concessões DHCPd, para que nenhuma concessão seja perdida?
Responder1
DeFontes 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) {
O arquivo de backup anterior é excluído e, em seguida, o arquivo de concessão atual é vinculado como backup com uma extensão ~
.
No Linux, com oinoificar(7)instalação de eventos, um hardlink é visto como um evento de criação.
Eu sugeriria usar inotifywait
(do inotify-tools
pacote) para sinalizar quando tal evento aconteceu. Deve-se esperar /var/lib/dhcpd/dhcpd.leases~
que a aparição esteja diretamente pronta para backup (é um hardlink para o original). Como o arquivo será um arquivo diferente (inode diferente) a cada vez, é o diretório que deve ser observado para detecção adequada e, por exemplo, a --include
opção pode ser usada para simplificar o processamento do shell (sem processamento, até mesmo a linha de leitura é descartada em um variável fictícia):
inotifywait -m -e create --include dhcpd.leases~ /var/lib/dhcpd | while read dummy; do
do_backup /var/lib/dhcpd/dhcpd.leases~
done
Se o comando não for recente o suficiente, pode não ser compreendido. --include
Nesse caso, o teste deve ser feito no loop 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, o incron
pacote (disponível pelo menos no CentOS 8 Stream), poderia ser usado com umentradaigual a:
/var/lib/dhcpd IN_CREATE,recursive=false if_correct_file_do_backup $#
sendo if_correct_file_do_backup
, por exemplo, um shell verificando se este era o nome de arquivo pretendido:
#!/bin/sh
if [ "$1" = dhcpd.leases~ ]; then
do_backup /var/lib/dhcpd/dhcpd.leases~
fi