![如何通过比较两个BTRFS子卷来发现文件属性变化?](https://linux22.com/image/199377/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%E6%AF%94%E8%BE%83%E4%B8%A4%E4%B8%AABTRFS%E5%AD%90%E5%8D%B7%E6%9D%A5%E5%8F%91%E7%8E%B0%E6%96%87%E4%BB%B6%E5%B1%9E%E6%80%A7%E5%8F%98%E5%8C%96%EF%BC%9F.png)
由于在某些对硬盘至关重要的文件夹(如数据库文件夹)上禁用 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"