Backup

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

  • April 8, 2022

根據this answer,DHCPd租約文件每小時清除一次。目標是連續備份租約文件,因此永遠不會失去租約。這很困難,因為不清楚小時計時器是基於系統時間(例如,文件在凌晨 1 點、凌晨 2 點、凌晨 3 點等重寫)還是處理時間(service_start + 1h、service_start + 2h 等)。假設租約文件在凌晨 3 點清空,租約在 2:58:55 授予;備份租約文件的服務需要在清理文件之前快速執行。

DHCPd 程序將自己的文件備份到/var/lib/dhcpd/dhcpd.leases~. 最好的選擇似乎是製作一個腳本,每小時將此文件備份到另一個位置。但是,如果重新啟動 DHCPd 程序並且計時器與程序相關,則備份任務上的小時標記可能會對齊,這可能會導致一個程序讀取而另一個程序寫入,這可能會破壞文件 (取決於它是如何完成的)。因此,備份任務需要了解 DHCPd 何時啟動。這變得越來越複雜。

備份 DHCPd 租約文件的“正確”方法是什麼,因此不會失去任何租約?

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

引用自:https://serverfault.com/questions/1098172