Btrfs ha un modo efficace per confrontare le istantanee?


21

Mentre le diverse istantanee montate funzionerebbero, sembra che potrebbe essere orribilmente lento in molti casi.

Esiste una funzionalità specifica di btrfs per le diverse istantanee? (Non sono riuscito a trovarne nessuno nei documenti)


Mentre potrebbe essere possibile scoprire quali blocchi sono stati modificati e come, è necessario considerare il caso in cui una modifica è stata invertita in seguito, se si desidera davvero confrontare i filesystem (directory). Ad esempio, se hai un file Acontenente a, scrivi bnella sua istantanea e successivamente ripristinalo in a, il file non è cambiato affatto.
Cristian Ciupitu,

Sembra che sarebbe del tutto analogo al controllo di revisione del codice sorgente in cui questo genere di cose viene fatto continuamente, a meno che non mi manchi qualcosa.
Catskul,

Un ulteriore problema nell'esecuzione di qualcosa come rsync su un filesystem btrfs è che, a meno che non fosse usata l'opzione noatime mount, la lettura di tutti i file per verificare se sono stati modificati li avrebbe effettivamente modificati e lo snapshot successivo sarebbe grande anche se nessun file fosse stato effettivamente modificato . Vedi lwn.net/Articles/499293 per una discussione.
Luca Citi,

Risposte:


11

Sembra che tu stia cercando btrfs send / rece , che apparirà in Linux 3.6. Il sendcomando crea un file di registro delle differenze tra due istantanee e receiveapplica le modifiche da un file. Si noti che invia / ricevi utilizza un formato file personalizzato, quindi il file non sarà esattamente come, diciamo, diff o tar.


Bello! Questo è esattamente quello che stavo cercando.
Catskul,

2
Per un'app di esempio che analizza questo output, consultare: github.com/sysnux/btrfs-snapshots-diff (non da me)
Att Righ

10

Sto eseguendo Debian stable che non ha btrfs send, quindi ho cercato una soluzione usando btrfs subvolume find-new.

Se si dispone di snapshot1 e snapshot2 e si desidera sapere cosa è cambiato in quello successivo, snapshot 2, poiché è stato creato snapshot1 è possibile utilizzare lo script seguente che fornisce

btrfs-diff oldsnapshot/ newsnapshot/

che elencherà tutti i file modificati in newsnapshot / da 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

Per spiegare: btrfs subvolume find-newtrova i file modificati dopo una 'generazione' particolare di istantanee. Riporta anche il numero di generazione corrente.

Avvertenze

ad esempio, acquisire l'istantanea giornaliera di un caso sottovolume:

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

Cosa è cambiato tra snap1 e snap2?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Quindi possiamo vedere il nuovo file, vedere il file modificato, ma la cancellazione non viene segnalata . Questo perché il comando riporta i file esistenti, non quelli che ora non lo sono.

Cosa è cambiato tra snap2 e il sottovolume live?

$ btrfs-diff snap2/ live/
foo3

il file rinominato non viene riportato . I suoi dati non sono cambiati.

Ora cosa succede se aggiungiamo dati al file rinominato

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

OK, ha senso. Ma facciamo un nuovo file

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

eh! dov'è Lala? . Se si aggiunge un altro file, lalaviene visualizzato. Quindi questo comportamento è un po 'strano. Questo è probabilmente il motivo per cui il wiki dice:

L'approccio find-new ha alcune serie limitazioni e quindi non è realmente utilizzabile per qualcosa come inviare / ricevere.

Tuttavia, la stranezza si presenta quando si confronta un sottovolume live con uno stato precedente, non quando si confrontano le istantanee (sola lettura). Quindi questo potrebbe essere ancora utile se non si desidera identificare anche i file eliminati.


Ehi, ho ampliato un po 'il tuo strumento. Questo strumento ti mostrerà un flusso di tutte le modifiche che sono avvenute nelle istantanee (può anche selezionare singoli collegamenti) github.com/talwrii/btrlog
Att Righ

1

Questo è supportato dallo strumento di convenienza dell'istantanea snapper.

sudo snapper -c config diff 445..446

Ovviamente questo richiede che tu stia usando snapperper le tue istantanee.

Gli ID di questa istantanea possono essere trovati usando snapper list -a. Sfortunatamente al momento della scrittura di snapper non supportava gli snapshot di elenco per una singola configurazione, sebbene questi numeri possano essere trovati dai nomi dei sottovolumi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.