![btrfs 是否有有效的方法来比较快照?](https://linux22.com/image/587611/btrfs%20%E6%98%AF%E5%90%A6%E6%9C%89%E6%9C%89%E6%95%88%E7%9A%84%E6%96%B9%E6%B3%95%E6%9D%A5%E6%AF%94%E8%BE%83%E5%BF%AB%E7%85%A7%EF%BC%9F.png)
虽然不同的已安装快照可以工作,但在很多情况下听起来它可能会非常慢。
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/parent
,btrfs 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
备份实用程序btrbk
(https://github.com/digint/btrbk) 也有一个diff
(以及还有一个extents diff
)子命令。