btrfs 是否有有效的方法来比较快照?

btrfs 是否有有效的方法来比较快照?

虽然不同的已安装快照可以工作,但在很多情况下听起来它可能会非常慢。

btrfs 是否有用于区分快照的特定功能?(我在文档中找不到任何相关内容)

答案1

btrfs send, 哪个出现在Linux 3.6中(2012),“在两个子卷快照之间生成变化流。” 您只需添加标志即可使用它来生成快速元数据比较 --no-data

btrfs send --no-data -p /snapshots/parent /snapshots/child

通常情况下,你会放弃--no-data标志并将输出导入btrfs receive, 去做增量备份。例如,如果/snapshots/parent已经存在于/backup/snapshots/parentbtrfs send则只会将这些更改传输到/backup文件系统:

btrfs send -p /snapshots/parent /snapshots/child | btrfs receive /backup/snapshots

答案2

我正在运行 Debian 稳定版,但没有btrfs send,所以我寻找使用 的解决方案btrfs subvolume find-new

更新: btrfs send曾是在 Linux 3.6 中添加,于 2012 年发布,并于 2015 年纳入 Debian 稳定版。

如果你有快照 1 和快照 2,并且想知道快照 2 中发生了什么变化(自快照 1 制作以来),你可以使用下面的脚本,该脚本提供

btrfs-diff oldsnapshot/ newsnapshot/

这将列出自 oldsnapshot/ 以来在 newsnapshot/ 中更改的所有文件。

#!/bin/bash
usage() { echo $@ >2; echo "Usage: $0 <older-snapshot> <newer-snapshot>" >2; exit 1; }

[ $# -eq 2 ] || usage "Incorrect invocation";
SNAPSHOT_OLD=$1;
SNAPSHOT_NEW=$2;

[ -d $SNAPSHOT_OLD ] || usage "$SNAPSHOT_OLD does not exist";
[ -d $SNAPSHOT_NEW ] || usage "$SNAPSHOT_NEW does not exist";

OLD_TRANSID=`btrfs subvolume find-new "$SNAPSHOT_OLD" 9999999`
OLD_TRANSID=${OLD_TRANSID#transid marker was }
[ -n "$OLD_TRANSID" -a "$OLD_TRANSID" -gt 0 ] || usage "Failed to find generation for $SNAPSHOT_NEW"

btrfs subvolume find-new "$SNAPSHOT_NEW" $OLD_TRANSID | sed '$d' | cut -f17- -d' ' | sort | uniq

解释:btrfs subvolume find-new发现文件已更改快照的特定“代”。它还报告当前的代数。

注意事项

例如,对子卷案例进行每日快照:

mkdir test && cd test
btrfs subvolume create live
date >live/foo1
date >live/bar1
btrfs subvolume snapshot live/ snap1
date >live/foo2  # new file
date >>live/bar1 # modify file
rm live/foo1     # delete file
btrfs subvolume snapshot live/ snap2
date >live/foo3  # new file
mv live/bar{1,2} # rename file
rm live/foo2     # delete file

snap1 和 snap2 之间有什么变化?

$ btrfs-diff snap1/ snap2/
bar1
foo2

这样我们就可以看到新的文件,看到修改过的文件,但未报告删除情况。这是因为该命令报告的是存在的文件,而不是现在不存在的文件。

snap2 和实时子卷之间有什么变化?

$ btrfs-diff snap2/ live/
foo3

重命名的文件未报告. 其数据没有改变。

现在如果我们将数据添加到重命名的文件

date >>live/bar2
btrfs-diff snap2/ live/
bar2
foo3

好的,说得通。但是让我们创建一个新文件

date >live/lala
btrfs-diff snap2/ live/
bar2
foo3

呃!拉拉在哪儿?。如果您添加另一个文件,lala则会出现。所以这种行为有点奇怪。这可能就是为什么 wiki 说:

寻找新方法有一些严重的局限性,因此对于发送/接收之类的操作来说并不实用。

但是,奇怪的是,当您将活动子卷与之前的状态进行比较时,而不是在比较(只读)快照时。因此,除非您还想识别已删除的文件,否则这仍然很有用。

答案3

目前的解决方案:

btrfs send --no-data  -p SHAPSHOT_OLD  SHAPSHOT_NEW  |  btrfs receive --dump  |  grep ^update_extent

答案4

备份实用程序btrbkhttps://github.com/digint/btrbk) 也有一个diff(以及还有一个extents diff)子命令。

相关内容