Restic: Opción de copia de seguridad para eliminar un prefijo de ruta principal

Creado en 16 nov. 2018  ·  24Comentarios  ·  Fuente: restic/restic

Salida de restic version

restic 0.9.3 compiled with go1.11.1 on linux/amd64

¿Qué debería hacer restic de manera diferente? ¿Qué funcionalidad crees que deberíamos añadir?

Sería útil tener una opción para restic backup que diga "eliminar esta ruta principal de las rutas de todos los archivos respaldados". Por ejemplo, --backup-root /some/path . Esto tendría los siguientes efectos:

  • Un archivo /some/path/to/file se almacenaría en la instantánea como /to/file .
  • Este archivo también tendría su verificación de metadatos realizada contra /to/file en la instantánea principal.
  • No se le permite especificar archivos / directorios en restic backup que no comiencen con este prefijo.

(Creo que esto puede estar relacionado con el # 1376).

¿Que estás tratando de hacer?

Uno de nuestros scripts de respaldo se ejecuta en un sistema con muchos servicios en ejecución que no se pueden detener. Estos servicios garantizan que la recuperación sea posible desde un punto específico en el tiempo (p. Ej., Registran lo suficiente para que sus datos vuelvan a estar en un estado coherente después de un corte de energía). Sin embargo, los respaldos restringidos no son atómicos; por lo tanto, las copias de seguridad restringidas rompen la garantía de recuperación del servicio.

Para solucionar esto, nosotros:

  1. Tome una instantánea de LVM de / . La instantánea es una copia atómica a nivel de bloque de todo el volumen.
  2. Monte la instantánea de LVM en /mnt/backup-snapshot .
  3. Ejecute la copia de seguridad restic contra /mnt/backup-snapshot .
  4. Desmonte la instantánea de LVM.
  5. Elimina la instantánea de LVM.

Esto hace que la copia de seguridad sea verdaderamente puntual y garantiza que la copia de seguridad restaurada se encuentre efectivamente en un estado coherente.

Desafortunadamente, esto también hace que los archivos se almacenen en nuestro repositorio restic con el prefijo (inútil) /mnt/backup-snapshot . Esto puede complicar los esfuerzos de restauración y también es un poco confuso si no conoce los detalles de cómo se creó la copia de seguridad.

La única solución viable que se me ocurre es ejecutar la copia de seguridad dentro de un chroot. Si bien no es el fin del mundo, podría ser mejor para restic proporcionar una opción para eliminar algunos prefijos iniciales de los archivos.

backup need direction feature suggestion

Comentario más útil

Hola a todos, comencé a trabajar en la implementación de esta función de "raíz personalizada". La implementación en sí fue aparentemente simple, aunque tuve que aprender a golang ya que anteriormente solo conocía C # ... De todos modos, estoy tratando de evaluar qué tipo de soporte aún tiene este problema, ya que esto proviene de 2018, hace 2 años . Pronto me comprometeré con https://github.com/TheRealVincentVanGogh/restic/tree/2092-feature-custom-path-prefix , si alguien quiere ayudarme con golang 😅. Con suerte, más tarde, presentaré una solicitud de extracción aquí.

Todos 24 comentarios

Aquí hay una encarnación anterior de esta solicitud que encontré: # 555

+1

También creo que esta sería una característica realmente útil.

Entonces, permítame resumir: está ejecutando restic backup /mnt/backup-snapshot , por lo que el archivo /mnt/backup-snapshot/foo es /mnt/backup-snapshot/foo en la instantánea, pero le gustaría que fuera /foo . ¿Es eso correcto?

Puede lograrlo con restic> 0.9.0 cambiando el directorio actual, simplemente ejecute cd /mnt/backup-snapshot y luego restic backup . .

Eso funciona para ti?

Cambiar cwd funciona, pero he notado que hay un efecto secundario desagradable si se usan archivos para incluir / excluir. Parece que si se colocan rutas absolutas allí, se omitirán al cambiar cwd . Preferiría usar también rutas absolutas; por ahora probablemente me dirija por la ruta chroot, pero estoy de acuerdo en que sería mejor tener algo similar a la bandera -C en tar .

Creo que esta opción de raíz falsa sería una característica útil. Me encantaría hacer lo mismo que cdhowie pero con la instantánea apfs en macOS. Para acceder a las instantáneas apfs de solo lectura, deben montarse en algún lugar. Pero al restaurar, me gustaría que la ruta "original" fuera la ruta canónica almacenada en la instantánea.

Desafortunadamente, el truco del cd no es óptimo, ya que tengo muchas (125) rutas absolutas recopiladas de StdExclusions.plist (lista de exclusión de copia de seguridad estándar de macOS) y todos los archivos y carpetas que mdfind puede encontrar con el conjunto de atributos com_apple_backup_excludeItem.

Simplemente deja el problema si coloca / mnt en el archivo de ignorar y comienza la copia de seguridad desde / mnt / fs-snapshot, se excluirá a sí mismo.

Más copia de seguridad de cd $ path && restic. todavía da $ path en la descripción general de la instantánea, mientras que los parches en la instantánea están basados ​​en /.

Encontré una solución con proot.

También quería encontrar una forma de eliminar el prefijo de ruta. Mi caso de uso es ligeramente diferente: estoy creando una instantánea de zfs ( fs@$(date +%s) ) y quería hacer una copia de seguridad de esto sin tener que montarlo ( /path/to/mount/.zfs/snapshots/${TS} ); de esta manera, con suerte, no tengo preocuparse de que la instantánea no se desmonte y luego se quede para siempre en el caso de que algo se caiga.

La salida restic forget para esto me hace pensar que las instantáneas con diferentes rutas no se olvidarán según el cronograma (diario / semanal / etc.).

El comentario proot de @blurayne fue un buen punto de partida, creo que he llegado a la misma conclusión:

$snap_path="/path/to/where/snapshot/is/accessible"
$orig_fs="/path/to/filesystem"
proot -b "${snap_path}":"${orig_fs}" restic backup "${orig_fs}"

Esto funciona muy bien, y ahora todas las instantáneas tienen la misma ruta, sin cd o pushd requeridos. Además, proot está disponible en el espacio de usuario, por lo que si las copias de seguridad no se realizan como root, aún es posible.

Mi caso de uso: volcar los datos de la base de datos en un directorio temporal, como / tmp / tmpzmn28r02 (obtenido a través de mktemp o mkdtemp () de python) y luego hacer una copia de seguridad.
Este método marcará todos los archivos entre 2 instantáneas como diferentes. Así que necesito una forma de decirle a restic que ignore por completo el prefijo del directorio temporal.
Otro posible caso de uso: hoy tengo todas mis imágenes en '/ mnt / algo / imágenes' pero mañana, el mismo contenido estará en '/ mnt / external / pictures-from-home' (esquema de partición diferente / lo que sea)

Además, si desea usar restic y hacer una copia de seguridad de varios directorios en la misma ejecución, para usar la misma instantánea, esto se vuelve aún más complicado.

Hasta que se haga una solución, usaré la propuesta 'proot', gracias @blurayne y @ whi-tw

¡Hola! Tengo un caso similar. Por ejemplo, tengo carpetas

/srv/my/long/server1/path/data (with many subfolders and dozen of files)
/path/to/dump.sql
/path/certbot.tar.gz

así que quiero obtener una copia de seguridad como

/data
/dump.sql
/certbot.tar.gz

y obtener la capacidad de restaurar en otro servidor (no sé sobre la estructura de carpetas anterior) por una ruta diferente (relativa).

No tengo ideas calientes para resolver esta trivial tarea. Restic es una herramienta increíble pero ... ¿por qué funciona tan difícil para los usuarios finales?

Estoy copiando en la carpeta de copia de seguridad predefinida (/ copia de seguridad) todo lo que necesito y allí ejecuto la copia de seguridad de Restic (a través de un cd). Pero esta solución solo funciona para pequeñas cantidades de datos.

Será genial tener la capacidad de restaurar con la subcarpeta --include justo después de la plantilla (o incluyendo esta máscara). ex.:
restic restore --include data --target /my/new/path
y obtener como resultado
/my/new/path/data


Gracias @ whi-tw por la solución con proot -b /path/i/wanted:./path_in_repo restic backup . - funciona para mí.

Mi caso de uso es migrar instantáneas de otras soluciones de respaldo a restic (Time Machine e imágenes de disco en mi caso).

Los migro desde donde monto la imagen o el subdirectorio de la instantánea creada por TM, que puede ser muy larga, por ejemplo, /Volumes/TimeMachine-Backups/Backups.backupdb/MacBook Pro/2019-05-22-185113/Macintosh SSD/ .

La solución cd funciona cuando se usa restic mount y restic restore , pero la ruta absoluta de la instantánea original aparece cuando ejecuto restic snapshots .

Dado que es una instantánea migrada, me gustaría que esa fuera la ruta desde donde también se tomó la instantánea original. Aparte de eso, con las rutas largas, también hace que la salida de restic snapshots un poco ruidosa.

Una bandera para establecer un prefijo alternativo también sería ideal para mí.

Esto funciona muy bien, y ahora todas las instantáneas tienen la misma ruta, sin cd o pushd requeridos. Además, proot está disponible en el espacio de usuario, por lo que si las copias de seguridad no se realizan como root, aún es posible.

Esta habría sido una buena solución, pero proot no está disponible en macOS y no parece estar disponible pronto (la mayoría del código escrito específicamente en Linux): ¿PRoot funciona en MacOSX?

¿Hay alguna otra solución alternativa que se le ocurra?

Mi caso de uso: volcar los datos de la base de datos en un directorio temporal, como / tmp / tmpzmn28r02 (obtenido a través de mktemp o mkdtemp () de python) y luego hacer una copia de seguridad.
Este método marcará todos los archivos entre 2 instantáneas como diferentes.

Tenga en cuenta que los archivos probablemente _son_ diferentes de todos modos; Las copias de seguridad de la base de datos generalmente incluyen una marca de tiempo en las primeras líneas.

Puede ajustar los comandos de volcado de la base de datos para excluir los comentarios dinámicos y ser ordenados por claves primarias para que los datos que cambian lentamente sean realmente deducibles.

Una actualización: 'proot' funcionó solo en una máquina para mí, en otra segfaults.
Una alternativa a ella (más reciente) - bubblewrap
Se agregó un contenedor sobre él (adjunto) que debería funcionar con los mismos parámetros '-b'. Parece funcionar hasta ahora. Tenga en cuenta que, según sus necesidades y la ubicación del directorio, es posible que deba cambiar un poco el contenedor.
Espero que les ayude a todos, pero espero con ansias el apoyo dentro de sí mismo.

proot.sh.txt

Probé proot . Parece romper la capacidad de ejecutar restic como no root con capacidades adicionales (https://restic.readthedocs.io/en/stable/080_examples.html#full-backup-without-root); al menos obtuve scan: Open: open /.pulse: permission denied errores que no obtuve al ejecutar restic sin proot .

El mismo problema con bwrap .

Entonces, para mí, quitar un prefijo de ruta en restic todavía me parece útil.

Esta característica faltante hace que sea más difícil de lo necesario realizar copias de seguridad de las máquinas virtuales.
Las instantáneas de mi VM terminan en una carpeta temporal y luego restic hace una copia de seguridad.
Esto da como resultado lo siguiente:

ID        Time                 Host         Tags        Paths
--------------------------------------------------------------------------------------
02c536db  2020-04-10 14:28:27  resolver-02              /tmp/tmp.vOFFxxly9O/config.xml
c5709aed  2020-04-10 14:28:29  resolver-02              /tmp/tmp.vOFFxxly9O/sdb.img
a88cc1e7  2020-04-10 14:36:22  resolver-02              /tmp/tmp.FoY1j5JPIZ/config.xml
7c44e6ee  2020-04-10 14:36:24  resolver-02              /tmp/tmp.FoY1j5JPIZ/sdb.img
65456111  2020-04-10 14:37:48  resolver-02              /tmp/tmp.vjtI9JE3Iz/config.xml
eaced756  2020-04-10 14:37:49  resolver-02              /tmp/tmp.vjtI9JE3Iz/sdb.img
8eccec2c  2020-04-10 16:04:30  resolver-02              /tmp/tmp.YtLYRd0rNI/config.xml
34c897e1  2020-04-10 16:04:31  resolver-02              /tmp/tmp.YtLYRd0rNI/sdb.img
99b67b97  2020-04-10 16:07:53  resolver-02              /tmp/tmp.aWaEDqAaTq/config.xml
cad2c9d8  2020-04-10 16:07:54  resolver-02              /tmp/tmp.aWaEDqAaTq/sdb.img
--------------------------------------------------------------------------------------

Esto rompe restic forget porque no reconoce que es el mismo archivo y mantiene una instantánea de cada instancia. Preferiría si hubiera una manera de eliminar un prefijo conocido o solo almacenar una ruta relativ, no absoluta.
Ya estoy llamando a restic con una ruta relativ y ching en la carpeta temporal. Lamentablemente, no ayuda y preferiría no tener que usar bindmounts para esto.

Esto rompe restic forget porque no reconoce que es el mismo archivo y mantiene una instantánea para cada instancia.

También nos encontramos con esto, pero la solución es bastante sencilla: etiquete cada copia de seguridad en función de los archivos que se están respaldando.

Por ejemplo, podría usar las etiquetas config.xml y sdb.img aquí. Luego agregue --group-by host,tags cuando ejecute restic forget .

¿Qué hace que esta función sea tan difícil de implementar? ¿No es el mismo filtrado básico de cadenas en los metadatos de instantáneas? El valor que aportaría es enorme. Sí, puede solucionarlo con el etiquetado, pero hay un campo de ruta y podría ser utilizable ...

¿Qué hace que esta función sea tan difícil de implementar?

Hablando como desarrollador yo mismo (no de restic, sino de otros proyectos de código abierto): a menudo no es la complejidad de una característica lo que impide implementarla, sino cosas mundanas como falta de tiempo, motivación o simplemente "la vida real" ...

Por supuesto, mi objetivo no era ser crítico, buscando genuinamente mapear la complejidad de los posibles contribuyentes.

Hola a todos, comencé a trabajar en la implementación de esta función de "raíz personalizada". La implementación en sí fue aparentemente simple, aunque tuve que aprender a golang ya que anteriormente solo conocía C # ... De todos modos, estoy tratando de evaluar qué tipo de soporte aún tiene este problema, ya que esto proviene de 2018, hace 2 años . Pronto me comprometeré con https://github.com/TheRealVincentVanGogh/restic/tree/2092-feature-custom-path-prefix , si alguien quiere ayudarme con golang 😅. Con suerte, más tarde, presentaré una solicitud de extracción aquí.

@TheRealVincentVanGogh No voy a aprender Go, pero todavía estoy ansioso por esta función y tengo un montón de copias de seguridad que todavía quiero portar a restic pero por este problema. Abra un PR una vez que tenga algo que parezca que está funcionando y publique el enlace aquí, le haré algunas pruebas pesadas

@TheRealVincentVanGogh ¿Cómo se relaciona su implementación planificada con PR # 2010?

@TheRealVincentVanGogh ¿Cómo se relaciona su implementación planificada con PR # 2010?

@MichaelEischer ¡Oh, dispara! Parece que alguien ya se me adelantó. Sí, PR # 2010 es exactamente lo que estoy en medio de ... re-lograr ... Maldita sea. ¿Quizás @cdhowie podría vincular PR # 2010 con este tema para ayudar a evitar confusiones en el futuro? ¡Gracias!

@themightychris Aquí hay un enlace a ese PR . Parece que el desarrollador también se retiró en 2018 ... curioso.

Editar:

Parece haber cierta ambigüedad entre eliminar un prefijo de ruta del archivo de instantánea VS. eliminar un prefijo de ruta de cada estructura de archivo + archivo de instantánea. Parece que PR # 2010 solo aborda el primero . Dado que OP estaba buscando "eliminar esta ruta principal de las rutas de todos los archivos respaldados" (también conocido como corrección de ruta de nivel de estructura de archivo) , tengo que retractarme de lo que dije acerca de vincular PR # 2010 a este problema . ¡Perdón por la mención cdhowie!

¡Sin embargo! @MichaelEischer Mis intenciones siempre han sido obtener una implementación de corte de prefijo de ruta de nivel de instantánea de estructura de archivo en Restic (hombre, esa es una característica / oración larga). Así que lo más probable es que empiece a trabajar en eso a partir del código existente de PR # 2010, lo que debería acelerar la implementación.

PD: Estoy bastante ocupado hoy en día, por lo que el trabajo puede ser lento durante un tiempo; por supuesto, publicaré un PR cuando crea que tengo algo que vale la pena compartir con todos ustedes. ¡Manténganse seguros todos! 😄

¿Fue útil esta página
0 / 5 - 0 calificaciones