
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 mv
la 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 receive
subcomando 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 receive
subcomando 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.btrfs
tuviera un padre propio).