¿Tiene btrfs una manera eficiente de comparar instantáneas?

21

Si bien las diferentes instantáneas montadas funcionarían, parece que podría ser terriblemente lento en muchos casos.

¿Existe una funcionalidad específica de btrfs para diferentes instantáneas? (No pude encontrar ninguno en los documentos)

Catskul
fuente
Si bien es posible averiguar qué bloques se cambiaron y cómo, debe considerar el caso cuando un cambio se ha revertido más adelante, si realmente desea comparar sistemas de archivos (directorios). Por ejemplo, si tiene un archivo que Acontiene a, escriba bsu instantánea y luego vuelva a cambiarla a, el archivo realmente no cambió en absoluto.
Cristian Ciupitu
Parece que sería completamente análogo al control de revisión del código fuente donde este tipo de cosas se hacen todo el tiempo, a menos que me falte algo.
Catskul
Un problema adicional de ejecutar algo como rsync en un sistema de archivos btrfs es que, a menos que se use la opción de montaje de noatime, leer todos los archivos para verificar si han cambiado los modificaría efectivamente y la siguiente instantánea sería grande incluso si no se modificara realmente ningún archivo . Ver lwn.net/Articles/499293 para una discusión.
Luca Citi

Respuestas:

11

Parece que está buscando btrfs enviar / recibir , que aparecerá en Linux 3.6. El sendcomando crea un archivo de registro de las diferencias entre dos instantáneas, y el receivecomando aplica los cambios desde un archivo. Tenga en cuenta que enviar / recibir utiliza un formato de archivo personalizado, por lo que el archivo no se verá exactamente como, por ejemplo, diff o tar.

amcnabb
fuente
¡Agradable! Eso es exactamente lo que estaba buscando.
Catskul
2
Para ver una aplicación de ejemplo que analiza esta salida, consulte: github.com/sysnux/btrfs-snapshots-diff (no por mí)
Att Righ
10

Estoy ejecutando Debian estable que no tiene btrfs send, así que busqué una solución usando btrfs subvolume find-new.

Si tiene snapshot1 y snapshot2 y desea saber qué cambió en la posterior, snapshot 2, ya que se hizo snapshot1, puede usar el script que se encuentra a continuación, que proporciona

btrfs-diff oldsnapshot/ newsnapshot/

que enumerará todos los archivos modificados en newsnapshot / since 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

Para explicar: btrfs subvolume find-newencuentra los archivos cambiados después de una 'generación' particular de instantánea. También informa el número de generación actual.

Advertencias

Por ejemplo, tome la instantánea diaria de un caso de subvolumen:

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

¿Qué cambió entre snap1 y snap2?

$ btrfs-diff snap1/ snap2/
bar1
foo2

Entonces podemos ver el nuevo archivo, ver el archivo modificado, pero la eliminación no se informa . Esto se debe a que el comando informa sobre los archivos que existen, no sobre los que ahora no.

¿Qué cambió entre snap2 y el subvolumen en vivo?

$ btrfs-diff snap2/ live/
foo3

el archivo renombrado no se informa . Sus datos no han cambiado.

¿Y si agregamos datos al archivo renombrado?

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

OK, tiene sentido. Pero hagamos un nuevo archivo

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

eh! donde esta lala . Si agrega otro archivo, lalaaparece. Entonces este comportamiento es un poco extraño. Probablemente por eso la wiki dice:

El enfoque de encontrar nuevo tiene algunas limitaciones serias y, por lo tanto, no se puede usar para algo como enviar / recibir.

Sin embargo, la rareza se produce cuando compara un subvolumen en vivo con un estado anterior, no cuando compara instantáneas (solo lectura). Por lo tanto, esto podría ser útil a menos que también desee identificar los archivos eliminados.

artfulrobot
fuente
Hola, he extendido un poco tu herramienta. Esta herramienta le mostrará una secuencia de todos los cambios que han ocurrido en las instantáneas (también puede seleccionar enlaces individuales) github.com/talwrii/btrlog
Att Righ
1

Esto es compatible con la herramienta de conveniencia de instantáneas snapper.

sudo snapper -c config diff 445..446

Por supuesto, esto requiere que esté utilizando snapperpara sus instantáneas.

Los identificadores de esta instantánea se pueden encontrar usando snapper list -a. Desafortunadamente, al momento de escribir, Snapper no admitía instantáneas de lista para una sola configuración, aunque estos números se pueden encontrar a partir de nombres de subvolúmenes.

Att Righ
fuente