Есть ли у btrfs эффективный способ сравнения снимков?

21

Несмотря на то, что различие смонтированных снимков будет работать, похоже, что во многих случаях оно может быть ужасно медленным.

Существуют ли специальные функции btrfs для создания снимков? (Я не смог найти ни одного в документах)

Catskul
источник
Хотя может быть возможно выяснить, какие блоки были изменены и как, вам нужно рассмотреть случай, когда изменение было отменено позже, если вы действительно хотите сравнить файловые системы (каталоги). Например, если у вас есть файл, Aсодержащий его a, запишите bего снимок и затем измените его обратно на a, файл на самом деле не изменился вообще.
Кристиан Чиупиту
Кажется, что это было бы полностью аналогично контролю версий исходного кода, где подобные вещи делаются постоянно, если я что-то не упустил.
Catskul
Дополнительная проблема запуска чего-то вроде rsync в файловой системе btrfs заключается в том, что, если не была использована опция монтирования noatime, чтение всех файлов, чтобы проверить, изменились ли они, приведет к их эффективной модификации, а следующий снимок будет большим, даже если на самом деле не было изменено ни одного файла. , См. Lwn.net/Articles/499293 для обсуждения.
Luca Citi

Ответы:

11

Похоже, вы ищете btrfs send / receive , который появится в Linux 3.6. Команда sendсоздает файл журнала различий между двумя снимками, и receiveкоманда применяет изменения из файла. Обратите внимание, что send / receive использует собственный формат файла, поэтому файл не будет выглядеть точно так же, как, скажем, diff или tar.

amcnabb
источник
Ницца! Это именно то, что я искал.
Catskul
2
Пример приложения, которое анализирует этот вывод: github.com/sysnux/btrfs-snapshots-diff (не мной)
Att Righ,
10

Я использую стабильную версию 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 имеет некоторые серьезные ограничения и, следовательно, на самом деле не годится для чего-то вроде отправки / получения.

Однако, странность возникает, когда вы сравниваете живой подобъем с предыдущим состоянием, а не когда вы сравниваете (только для чтения) снимки. Так что это может быть полезно, если вы не хотите также идентифицировать удаленные файлы.

artfulrobot
источник
Привет, я немного расширил твой инструмент. Этот инструмент покажет вам все изменения, которые произошли в моментальных снимках (он также может выбирать отдельные ссылки) github.com/talwrii/btrlog
Att Righ,
1

Это поддерживается вспомогательным инструментом для создания снимков snapper.

sudo snapper -c config diff 445..446

Конечно, это требует от вас использовать snapperдля ваших снимков.

Этот идентификатор снимка можно найти с помощью snapper list -a. К сожалению, на момент написания snapper не поддерживал снимки списка для одной конфигурации, хотя эти числа можно найти по именам подразделов.

Att Righ
источник