btrfs 有比较快照的有效方法吗?

Cat*_*kul 30 filesystems diff btrfs

虽然差异安装的快照会起作用,但在许多情况下听起来可能会非常慢。

是否有用于差异快照的 btrfs 特定功能?(我无法在文档中找到任何内容)

amc*_*abb 13

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

btrfs send --no-data -p /snapshots/parent /snapshots/child
Run Code Online (Sandbox Code Playgroud)

通常,您会删除--no-data标志并将输出通过管道btrfs receive传输到 中,以进行增量备份。例如,如果/snapshots/parent已经存在于/backup/snapshots/parentbtrfs send则只会将这些更改流式传输到/backup文件系统:

btrfs send -p /snapshots/parent /snapshots/child | btrfs receive /backup/snapshots
Run Code Online (Sandbox Code Playgroud)

  • 有关解析此输出的示例应用程序,请参阅:https://github.com/sysnux/btrfs-snapshots-diff(不是我的) (5认同)

art*_*bot 11

我运行Debian稳定这确实没有btrfs send,所以我用看着一个解决方案btrfs subvolume find-new

更新: btrfs send添加到 Linux 3.6 中,该版本于 2012 年发布,并于 2015 年包含在 Debian 稳定版中。

如果你有快照 1 和快照 2 并且你想知道在后面的快照 2 中发生了什么变化,因为快照 1 是你可以使用下面的脚本,它提供

btrfs-diff oldsnapshot/ newsnapshot/
Run Code Online (Sandbox Code Playgroud)

它将列出自 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
Run Code Online (Sandbox Code Playgroud)

解释一下: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
Run Code Online (Sandbox Code Playgroud)

snap1 和 snap2 之间有什么变化?

$ btrfs-diff snap1/ snap2/
bar1
foo2
Run Code Online (Sandbox Code Playgroud)

所以我们可以看到新建的文件,看到修改后的文件,但是不报删除。这是因为该命令报告存在的文件,而不是现在不存在的文件。

snap2 和 live subvolume 之间有什么变化?

$ btrfs-diff snap2/ live/
foo3
Run Code Online (Sandbox Code Playgroud)

不报告重命名的文件。它的数据没有改变。

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

date >>live/bar2
btrfs-diff snap2/ live/
bar2
foo3
Run Code Online (Sandbox Code Playgroud)

好的,有道理。但是让我们创建一个新文件

date >live/lala
btrfs-diff snap2/ live/
bar2
foo3
Run Code Online (Sandbox Code Playgroud)

诶!拉拉在哪里?. 如果添加另一个文件, 会lala出现。所以这种行为有点奇怪。这可能是维基说的原因:

find-new 方法有一些严重的限制,因此对于发送/接收之类的东西并不真正可用。

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


小智 7

目前的解决方案:

btrfs send --no-data  -p SHAPSHOT_OLD  SHAPSHOT_NEW  |  btrfs receive --dump  |  grep ^update_extent
Run Code Online (Sandbox Code Playgroud)


Att*_*igh 5

这是由快照便利工具支持的snapper

sudo snapper -c config diff 445..446

当然,这需要您snapper用于快照。

可以使用snapper list -a. 不幸的是,在撰写本文时 snapper 不支持单个配置的列表快照,尽管可以从子卷名称中找到这些数字。