根據這個答案、 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