備份 ISC DHCPd 租用文件的正確方法是什麼?

備份 ISC DHCPd 租用文件的正確方法是什麼?

根據這個答案、 DHCPd 租約文件每小時清除一次。目標是連續備份租約文件,因此永遠不會丟失租約。這變得很困難,因為不清楚小時計時器是否基於系統時間(例如,檔案在凌晨 1 點、凌晨 2 點、凌晨 3 點等重寫)或處理時間(service_start + 1h、service_start + 2h 等)。假設租約文件在凌晨 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選項可用於簡化 shell 處理(不進行處理,甚至讀取的行也會在虛擬變量):

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,一個 shell 檢查這是預期的檔案名稱:

#!/bin/sh

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

相關內容