Несмотря на то, что различие смонтированных снимков будет работать, похоже, что во многих случаях оно может быть ужасно медленным.
Существуют ли специальные функции btrfs для создания снимков? (Я не смог найти ни одного в документах)
Несмотря на то, что различие смонтированных снимков будет работать, похоже, что во многих случаях оно может быть ужасно медленным.
Существуют ли специальные функции btrfs для создания снимков? (Я не смог найти ни одного в документах)
Ответы:
Похоже, вы ищете btrfs send / receive , который появится в Linux 3.6. Команда send
создает файл журнала различий между двумя снимками, и receive
команда применяет изменения из файла. Обратите внимание, что send / receive использует собственный формат файла, поэтому файл не будет выглядеть точно так же, как, скажем, diff или tar.
Я использую стабильную версию Debian, которой нет btrfs send
, поэтому я искал решение, используя btrfs subvolume find-new
.
Если у вас есть snapshot1 и snapshot2, и вы хотите знать, что изменилось в последнем, snapshot 2, так как snapshot1 был сделан, вы можете использовать приведенный ниже скрипт, который предоставляет
btrfs-diff oldsnapshot/ newsnapshot/
который перечислит все файлы, измененные в newsnapshot / начиная с oldsnapshot /.
#!/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
появится. Так что это поведение немного странно. Наверное, поэтому вики говорит:
Подход find-new имеет некоторые серьезные ограничения и, следовательно, на самом деле не годится для чего-то вроде отправки / получения.
Однако, странность возникает, когда вы сравниваете живой подобъем с предыдущим состоянием, а не когда вы сравниваете (только для чтения) снимки. Так что это может быть полезно, если вы не хотите также идентифицировать удаленные файлы.
Это поддерживается вспомогательным инструментом для создания снимков snapper
.
sudo snapper -c config diff 445..446
Конечно, это требует от вас использовать snapper
для ваших снимков.
Этот идентификатор снимка можно найти с помощью snapper list -a
. К сожалению, на момент написания snapper не поддерживал снимки списка для одной конфигурации, хотя эти числа можно найти по именам подразделов.
A
содержащий егоa
, запишитеb
его снимок и затем измените его обратно наa
, файл на самом деле не изменился вообще.