2つのBTRFSサブボリュームを比較してファイル属性の変更を取得する方法は?

2つのBTRFSサブボリュームを比較してファイル属性の変更を取得する方法は?

ハードドライブにとって重要な特定のフォルダ(データベースフォルダなど)では、CoWが無効になっているため、その情報もバックアップする必要があります。ただし、v5.10以降、btrfs send/receiveこのメッセージはまだ無視されます。各ファイルを再帰的にスキャンすることはlsattr -R非常に非効率的です。

BTRFSを使用するバックアップシステムはこの問題をどのように処理しますか?特定のサブボリューム間の属性の変更を効率的に見つけることはできますか?

ベストアンサー1

私が考えることができる1つの可能なアプローチは、次のことを繰り返すことです。

btrfs send --no-data | btrfs receive --dump

utimes変更されたファイルのみを確認する: (参照属性の違いを見つける.sh)

changed_utime=$(btrfs send -q --no-data -p "$SNAPSHOT_OLD" "$SNAPSHOT_NEW" \
    | sudo btrfs receive --dump \
    | grep ^utimes \
    | awk '{print $2}' \
    | sort \
    | uniq)

>&2 echo "INFO: Examining $(echo "$changed_utime" | wc | awk '{print $1}') files"

while read -r _f; do
    file=$(echo $_f | cut -d'/' -f3-)
    [[ -z $file ]] && continue
    _old=$SNAPSHOT_OLD/$file
    _new=$SNAPSHOT_NEW/$file
    [ \( -d "$_old" -o -f "$_old" \) -a ! -L "$_old" ] || continue
    [ \( -d "$_new" -o -f "$_new" \) -a ! -L "$_new" ] || continue
    old_attr=$(lsattr -d $_old | awk '{print $1}')
    new_attr=$(lsattr -d $_new | awk '{print $1}')
    [[ "$old_attr" != "$new_attr" ]] && echo "$old_attr    $new_attr    $file"
done <<< "$changed_utime"

おすすめ記事