如何通过比较两个BTRFS子卷来发现文件属性变化?

如何通过比较两个BTRFS子卷来发现文件属性变化?

由于在某些对硬盘至关重要的文件夹(如数据库文件夹)上禁用 CoW,我还需要备份该信息。然而,从 v5.10 开始,btrfs send/receive仍然忽略此信息。递归地检查每个文件lsattr -R是非常低效的。

依赖BTRFS的备份系统如何处理这个问题?我们能否有效地发现给定子卷之间的属性变化?

答案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"

相关内容