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


21

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

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


尽管有可能找出更改了哪些块以及更改了哪些块,但是如果您确实要比较文件系统(目录),则需要考虑以后撤消更改的情况。例如,如果您有A包含的文件a,请写入b其快照,然后再将其更改为a,则该文件实际上并没有真正更改。
Cristian Ciupitu 2012年

看起来这将完全类似于源代码修订控制,在这种情况下,此类事情总是会执行,除非我遗漏了一些东西。
Catskul 2012年

在btrfs文件系统上运行诸如rsync之类的东西的另一个问题是,除非使用了noatime挂载选项,否则读取所有文件以检查它们是否已更改将有效地对其进行修改,即使未实际修改任何文件,下一个快照也会很大。 。参见lwn.net/Articles/499293进行讨论。
Luca Citi

Answers:


11

听起来您正在寻找btrfs send / receive,它将在Linux 3.6中出现。该send命令创建一个包含两个快照之间差异的日志文件,并且该receive命令应用来自文件的更改。请注意,发送/接收使用自定义文件格式,因此该文件看起来不会像diff或tar。


真好!那正是我想要的。
Catskul

2
有关解析此输出的示例应用程序,请参见:github.com/sysnux/btrfs-snapshots-diff(不是我本人)
Att Righ

10

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

如果您拥有快照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

eh!啦啦在哪里?。如果添加另一个文件,lala则会出现。因此,这种行为有点奇怪。这可能是维基说:

发现新方法有一些严重的局限性,因此实际上不适用于发送/接收之类的东西。

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


嘿,我稍微扩展了您的工具。该工具将向您显示快照中发生的所有更改的流(它也可以选择单个链接)github.com/talwrii/btrlog
Att Righ

1

快照便捷工具支持此功能snapper

sudo snapper -c config diff 445..446

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.