Чи є btrfs ефективний спосіб порівняння знімків?


21

Хоча різні знімки зможуть працювати, але це здається, що це може бути жахливо повільним у багатьох випадках.

Чи є btrfs специфічна функціональність для різних знімків? (Мені не вдалося знайти жодного в документах)


Хоча можливо з'ясувати, які блоки були змінені і як, вам слід врахувати випадок, коли зміна була відмінена пізніше, якщо ви дійсно хочете порівняти файлові системи (каталоги). Наприклад, якщо у вас є файл, Aщо містить a, записуйте bв його знімок і пізніше змініть його назад a, файл насправді зовсім не змінився.
Cristian Ciupitu

Здається, що це було б абсолютно аналогічно контролю версії вихідного коду, де ця справа робиться постійно, якщо я щось не пропускаю.
Catskul

Додатковою проблемою запуску чогось на зразок rsync у файловій системі btrfs є те, що, якщо не використовується опція монтування в режимі часу, читання всіх файлів, щоб перевірити, чи змінилися вони, фактично змінило б їх, і наступний знімок буде великим, навіть якщо жоден файл насправді не змінений . Див. Lwn.net/Articles/499293 для обговорення.
Лука Сіті

Відповіді:


11

Це здається, що ви шукаєте btrfs відправлення / отримання , яке з’явиться в Linux 3.6. sendКоманда створює файл журналу відмінностей між двома знімками, і receiveкоманда застосовує зміни з файлу. Зауважте, що для надсилання / отримання використовується спеціальний формат файлу, тому файл не буде виглядати так, як, скажімо, diff або tar.


Приємно! Саме це я і шукав.
Catskul

2
Приклад програми, що аналізує цей вихід, див.: Github.com/sysnux/btrfs-snapshots-diff (не мною)
Att Righ

10

Я запускаю стабільний Debian, якого немає btrfs send, тому я розглядав рішення, використовуючи btrfs subvolume find-new.

Якщо у вас є знімок1 і знімок2, і ви хочете знати, що змінилося в пізнішому, знімку 2, оскільки зроблений знімок1, ви можете використовувати сценарій, наведений нижче

btrfs-diff oldsnapshot/ 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з'являється. Тож така поведінка трохи дивна. Можливо, тому у вікі йдеться:

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

Однак дивацтво виникає, коли ви порівнюєте підживи в прямому ефірі з попереднім станом, а не при порівнянні знімків (лише для читання). Тож це все ще може бути корисним, якщо ви також не хочете визначити видалені файли.


Гей, я трохи розширив ваш інструмент. Цей інструмент покаже вам потік усіх змін, які відбулися на знімках (він також може вибрати окремі посилання) github.com/talwrii/btrlog
Att

1

Це підтримується інструментом зручності знімків snapper.

sudo snapper -c config diff 445..446

Звичайно, це вимагає використання snapperвами знімків.

Цей ідентифікатор знімка можна знайти за допомогою snapper list -a. На жаль, на момент написання Snapper не підтримував перелік знімків для однієї конфігурації, хоча ці номери можна знайти з імен підпункту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.