La recepción de btrfs falla con transmisiones incrementales: "El archivo existe"

La recepción de btrfs falla con transmisiones incrementales: "El archivo existe"

Para un subvolumen btrfs, tengo una copia de seguridad incremental simple creada a partir de dos etapas:

btrfs send old/@ > base.btrfs
btrfs send new/@ -p old/@ > update.btrfs

Los dos subvolúmenes de origen son instantáneas capturadas en momentos separados del mismo subvolumen montado activamente.

En el objetivo, intento restaurar:

btrfs receive ./ < base.btrfs
btrfs receive ./ < update.btrfs

La expectativa es que el comando anterior cree una instantánea restaurada de la etapa de copia de seguridad inicial y que esta última aplique la etapa incremental adicional.

El comando anterior tiene éxito, pero el último falla:

ERROR: creating snapshot ./@ -> @ failed: File exists

Dado que es obvio que no puedo aplicar de manera útil la última etapa a un objetivo que no existe, me sorprende por qué el proceso realiza esta verificación, así como qué se espera que tenga éxito al aplicar la actualización.

¿Cómo puedo aplicar la etapa de actualización al objetivo generado al restaurar la etapa inicial?

Respuesta1

No puede tener (como en el lado de envío) varios subvolúmenes con el mismo nombre.

Puede obtener mvla instantánea/subvolumen base en el sistema de destino:

mv @ @.old
btrfs receive ./ < update.btrfs

Respuesta2

He aprendido lo suficiente para responder la pregunta desde que la publiqué.

La respuesta consta de dos partes.

En primer lugar, el receivesubcomando siempre crea una nueva entrada en el directorio de destino que tiene el mismo nombre que el subvolumen original, ya sea que el nuevo subvolumen se cree a partir de una secuencia secundaria o principal. Por lo tanto, el directorio de destino debe estar vacío, al menos cualquier nombre que tenga el mismo que el subvolumen original. Una técnica sencilla sería crear un nuevo directorio vacío para cada subvolumen principal y para cada subvolumen secundario.

En segundo lugar, aunque la invocación del subcomando en un niño no hace referencia a un padre, puede utilizar los datos necesarios del padre siempre que el padre haya sido restaurado en un subvolumen de la misma partición. Es decir, el receivesubcomando tendrá el efecto deseado para la secuencia secundaria siempre que haya sido invocado previamente en la misma partición para la secuencia principal.

Una vez que se hayan restaurado los padres y los hijos, se podrá eliminar a los padres sin dañar a los hijos.

En consecuencia, la siguiente sería una secuencia de comando efectiva para el objetivo original:

mkdir _tmp
btrfs receive _tmp/ < base.btrfs
btrfs receive ./ < update.btrfs
btrfs subvolume delete _tmp/@
rmdir _tmp

Todo el contenido de la transmisión secundaria estaría disponible a través de ./@.

Naturalmente, se requerirían más comandos si la secuencia secundaria destinada a la preservación tuviera múltiples ancestros (por ejemplo, base.btrfstuviera un padre propio).

información relacionada