ISC DHCPd リース ファイルをバックアップする適切な方法は何ですか?

ISC DHCPd リース ファイルをバックアップする適切な方法は何ですか?

によるとこの答えDHCPd リース ファイルは 1 時間ごとに消去されます。目標は、リース ファイルを継続的にバックアップして、リースが失われないようにすることです。これは、時間タイマーがシステム時間 (たとえば、ファイルは午前 1 時、午前 2 時、午前 3 時などに書き換えられる) に基づくのか、プロセス時間 (service_start + 1 時間、service_start + 2 時間など) に基づくのかが不明なため、困難になります。たとえば、リース ファイルが午前 3 時に消去され、リースが 2:58:55 に付与されるとします。ファイルが消去される前に、リース ファイルをバックアップするサービスをすばやく実行する必要があります。

DHCPd プロセスは、ファイルの独自のバックアップを に作成します/var/lib/dhcpd/dhcpd.leases~。そのため、このファイルを 1 時間ごとに別の場所にバックアップするスクリプトを作成するのが最善策と思われます。ただし、DHCPd プロセスが再起動され、タイマーがプロセスに相対的である場合、バックアップ タスクの時刻マークが揃う可能性があり、その結果、1 つのプロセスが読み取り中に他のプロセスが書き込みを行う可能性があり、ファイルが破損する可能性があります (実行方法によって異なります)。そのため、バックアップ タスクでは、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

関連情報