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/parent,btrfs send则只会将这些更改流式传输到/backup文件系统:
btrfs send -p /snapshots/parent /snapshots/child | btrfs receive /backup/snapshots
Run Code Online (Sandbox Code Playgroud)
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)
这是由快照便利工具支持的snapper。
sudo snapper -c config diff 445..446
当然,这需要您snapper用于快照。
可以使用snapper list -a. 不幸的是,在撰写本文时 snapper 不支持单个配置的列表快照,尽管可以从子卷名称中找到这些数字。
| 归档时间: |
|
| 查看次数: |
10542 次 |
| 最近记录: |