Хоча різні знімки зможуть працювати, але це здається, що це може бути жахливо повільним у багатьох випадках.
Чи є btrfs специфічна функціональність для різних знімків? (Мені не вдалося знайти жодного в документах)
Хоча різні знімки зможуть працювати, але це здається, що це може бути жахливо повільним у багатьох випадках.
Чи є btrfs специфічна функціональність для різних знімків? (Мені не вдалося знайти жодного в документах)
Відповіді:
Це здається, що ви шукаєте btrfs відправлення / отримання , яке з’явиться в Linux 3.6. send
Команда створює файл журналу відмінностей між двома знімками, і receive
команда застосовує зміни з файлу. Зауважте, що для надсилання / отримання використовується спеціальний формат файлу, тому файл не буде виглядати так, як, скажімо, diff або tar.
Я запускаю стабільний 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
з'являється. Тож така поведінка трохи дивна. Можливо, тому у вікі йдеться:
Новий підхід має деякі серйозні обмеження, і тому насправді не можна використовувати для чогось, як надсилати / отримувати.
Однак дивацтво виникає, коли ви порівнюєте підживи в прямому ефірі з попереднім станом, а не при порівнянні знімків (лише для читання). Тож це все ще може бути корисним, якщо ви також не хочете визначити видалені файли.
Це підтримується інструментом зручності знімків snapper
.
sudo snapper -c config diff 445..446
Звичайно, це вимагає використання snapper
вами знімків.
Цей ідентифікатор знімка можна знайти за допомогою snapper list -a
. На жаль, на момент написання Snapper не підтримував перелік знімків для однієї конфігурації, хоча ці номери можна знайти з імен підпункту.
A
що міститьa
, записуйтеb
в його знімок і пізніше змініть його назадa
, файл насправді зовсім не змінився.