Czy btrfs ma skuteczny sposób na porównywanie migawek?

21

Podczas gdy różne montowane migawki działałyby, wydaje się, że w wielu przypadkach może być strasznie powolne.

Czy istnieje specyficzna funkcjonalność btrfs dla różnych migawek? (Nie udało mi się znaleźć żadnych w dokumentacji)

Catskul
źródło
Chociaż może być możliwe ustalenie, które bloki zostały zmienione i jak, należy jednak rozważyć przypadek późniejszej zmiany, jeśli naprawdę chcesz porównać systemy plików (katalogi). Na przykład, jeśli masz plik Azawierający a, zapisz bw jego migawce, a później zmień go z powrotem na a, plik tak naprawdę wcale się nie zmienił.
Cristian Ciupitu,
Wygląda na to, że byłoby to całkowicie analogiczne do kontroli wersji kodu źródłowego, w której takie rzeczy są wykonywane przez cały czas, chyba że czegoś mi brakuje.
Catskul,
Dodatkowym problemem związanym z uruchomieniem czegoś takiego jak rsync w systemie plików btrfs jest to, że jeśli nie zostanie użyta opcja montowania noatime, odczyt wszystkich plików w celu sprawdzenia, czy uległy zmianie, spowoduje ich skuteczną modyfikację, a następna migawka byłaby duża, nawet gdyby żaden plik nie został zmodyfikowany . Zobacz lwn.net/Articles/499293 do dyskusji.
Luca Citi

Odpowiedzi:

11

Wygląda na to, że szukasz wysyłania / odbierania btrfs , które pojawią się w Linuksie 3.6. sendPolecenie tworzy plik dziennika różnic między dwoma migawek, a receivekomenda dotyczy zmiany z pliku. Zauważ, że wysyłanie / odbieranie używa niestandardowego formatu pliku, więc plik nie będzie wyglądał dokładnie tak, jak powiedzmy diff lub tar.

amcnabb
źródło
Miły! Właśnie tego szukałem.
Catskul,
2
Dla przykładowej aplikacji, który analizuje tego wyjścia zobacz: github.com/sysnux/btrfs-snapshots-diff (nie przeze mnie)
kontaktów Righ
10

Używam stabilnej wersji Debiana, której nie ma btrfs send, więc szukałem rozwiązania używającego btrfs subvolume find-new.

Jeśli masz snapshot1 i snapshot2 i chcesz wiedzieć, co zmieniło się w późniejszym, snapshot 2, ponieważ od czasu utworzenia snapshot1 możesz użyć skryptu, który zapewnia

btrfs-diff oldsnapshot/ newsnapshot/

która wyświetli listę wszystkich plików zmienionych w newsnapshot / od 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

Aby wyjaśnić: btrfs subvolume find-newznajduje pliki zmienione po określonej „generacji” migawki. Podaje również bieżący numer generacji.

Ostrzeżenia

np. weź codzienną migawkę przypadku podobjętości:

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

Co zmieniło się między snap1 i snap2?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Możemy więc zobaczyć nowy plik, zobaczyć zmodyfikowany plik, ale usunięcie nie jest zgłaszane . Jest tak, ponieważ polecenie informuje o plikach, które istnieją, a nie o tych, które już nie istnieją.

Co zmieniło się między snap2 a podobjętością na żywo?

$ btrfs-diff snap2/ live/
foo3

plik o zmienionej nazwie nie jest zgłaszany . Jego dane nie uległy zmianie.

Co teraz, jeśli dodamy dane do pliku o zmienionej nazwie

date >>live/bar2
btrfs-diff snap2/ live/
bar2
foo3

OK, ma sens. Ale stwórzmy nowy plik

date >live/lala
btrfs-diff snap2/ live/
bar2
foo3

eh! gdzie jest lala? . Jeśli dodasz kolejny plik, lalapojawi się. To zachowanie jest trochę dziwne. Prawdopodobnie dlatego wiki mówi:

Podejście „znajdź nowe” ma poważne ograniczenia i dlatego nie jest tak naprawdę przydatne w przypadku czegoś takiego jak wysyłanie / odbieranie.

Jednak dziwność pojawia się, gdy porównujesz podobjętość na żywo z poprzednim stanem, a nie podczas porównywania migawek (tylko do odczytu). Może to być nadal przydatne, chyba że chcesz również zidentyfikować usunięte pliki.

artfulrobot
źródło
Cześć, trochę rozszerzyłem wasze narzędzie. Narzędzie to pokaże strumień wszystkich zmian, jakie zaszły w migawkach (można go również wybrać poszczególne linki) github.com/talwrii/btrlog
Att righ
1

Jest to obsługiwane przez narzędzie wygody migawki snapper.

sudo snapper -c config diff 445..446

Oczywiście wymaga to korzystania snapperz migawek.

Identyfikatory tych migawek można znaleźć za pomocą snapper list -a. Niestety w chwili pisania snappera nie obsługiwał migawek list dla pojedynczej konfiguracji, chociaż liczby te można znaleźć w nazwach podwielokrotnych.

Att Righ
źródło