虽然散布已安装的快照可以工作,但听起来在许多情况下可能会非常慢。
是否有btrfs特定功能来区分快照?(我在文档中找不到任何内容)
虽然散布已安装的快照可以工作,但听起来在许多情况下可能会非常慢。
是否有btrfs特定功能来区分快照?(我在文档中找不到任何内容)
Answers:
听起来您正在寻找btrfs send / receive,它将在Linux 3.6中出现。该send
命令创建一个包含两个快照之间差异的日志文件,并且该receive
命令应用来自文件的更改。请注意,发送/接收使用自定义文件格式,因此该文件看起来不会像diff或tar。
我正在运行没有的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
则会出现。因此,这种行为有点奇怪。这可能是维基说:
发现新方法有一些严重的局限性,因此实际上不适用于发送/接收之类的东西。
但是,当您将实时子卷与以前的状态进行比较时(而不是在比较(只读)快照时),就会出现奇怪的情况。因此,这可能仍然有用,除非您还希望识别已删除的文件。
A
包含的文件a
,请写入b
其快照,然后再将其更改为a
,则该文件实际上并没有真正更改。