instantánea `cp -al` cuyos enlaces duros se dirigen a un nuevo archivo cuando se editan

11

Estoy tratando de tomar instantáneas de una carpeta masiva regularmente.

He leído aquí: http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
que cp -altoma una instantánea de una carpeta simplemente copiando los enlaces duros.

Todo eso es genial, pero el problema es que en esta instantánea, si cambio un archivo, cambia en todas las instantáneas. En cambio, lo que me gustaría es que el sistema cree un nuevo archivo en el cambio y lo vincule a eso. De esa manera, cada instantánea no se volvería inválida en una edición del primer archivo.

¿Cómo puedo lograr eso?

PD Lo intenté rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/, pero tiene el mismo problema.

Hermann Ingjaldsson
fuente

Respuestas:

7

Así es como funcionan los enlaces duros. Pero, hay formas de evitarlo:

Se me ocurren un par de opciones:

  • Utilice un sistema de archivos con soporte para archivos de copia en escritura, como btrfs. Por supuesto, si usara btrfs, simplemente usaría sus instantáneas nativas ... Si su sistema de archivos lo admite, puede usarlo cp --reflink=always. Desafortunadamente, ext4 no es compatible con esto.
  • Solo comparta enlaces duros entre sus instantáneas, no con el original. Es decir, la primera vez que ve una versión determinada de un archivo, cópielo en la instantánea. Pero la próxima vez, vincúlelo al de la instantánea anterior. (No estoy seguro de qué programa solía hacer esto, hace una década, pero la búsqueda muestra dirvish, obnam, storebackup y rsnapshot)
  • Dependiendo de cómo se cambien sus archivos, es posible que pueda garantizar que se use una temperatura de escritura / cambio de nombre para cambiarlos, entonces eso romperá el enlace rígido, por lo que la versión en la instantánea permanecerá impecable. Sin embargo, esto es menos seguro, ya que los errores podrían corromper su instantánea.
  • Tome instantáneas LVM de todo el sistema de archivos.

Por supuesto, existe la otra opción: usar un sistema de respaldo adecuado. La mayoría de ellos solo pueden hacer una copia de seguridad de los archivos modificados.

derobert
fuente
¿Qué recomienda como forma de hacer una copia de seguridad de una carpeta masiva?
Hermann Ingjaldsson el
Estaba pensando en usar rsync para un servidor que tiene un cronjob para hacer cp -al regularmente para instantáneas ... junto con rsync-ing en adelante para obtener aún más copias. ¿Como suena eso?
Hermann Ingjaldsson el
@HermannIngjaldsson bueno, depende de cómo hagas tus copias de seguridad. Personalmente, lo agregaría a mi configuración de Bacula, pero no lo recomendaría a menos que tenga un montón de máquinas para hacer una copia de seguridad, o ya conozca a Bacula. Por lo tanto, supongo que sugeriría que pruebe rsnapshot primero.
derobert
rsnapshotes bueno
developerbmw
4

Lo que está buscando es una forma de copia en escritura , donde varios archivos que tienen el mismo contenido usan el mismo espacio en el disco hasta que se modifique uno de ellos. Los enlaces duros solo implementan copia en escritura si la aplicación que escribe borra el archivo y crea un nuevo archivo con el mismo nombre (que generalmente se hace creando un nuevo archivo con un nombre diferente y luego moviéndolo a su lugar). Evidentemente, la aplicación que está utilizando no está haciendo esto: está sobrescribiendo el archivo existente.

Algunas aplicaciones se pueden configurar para usar la estrategia de reemplazo. Algunas aplicaciones usan la estrategia de reemplazo por defecto, pero usan la estrategia de sobrescritura cuando ven un archivo con múltiples enlaces duros, precisamente para no romper los enlaces duros. Su técnica de instantánea actual funcionará si puede configurar su aplicación para reemplazarla en lugar de sobrescribirla.

Fl-cow modifica programas para usar sistemáticamente la estrategia de reemplazo en archivos con múltiples enlaces duros.

Alternativamente, puede almacenar sus archivos en un sistema de archivos que realiza copia por escritura o deduplicación, o tiene una función de instantánea, y no se preocupa por los enlaces duros: Btrfs o Zfs . Dependiendo de su esquema de partición, el uso de instantáneas LVM puede ser una opción.

Mi recomendación es utilizar una herramienta de instantánea adecuada. Hacer copias de seguridad confiables es sorprendentemente difícil. Probablemente quieras rsnapshot .

Gilles 'SO- deja de ser malvado'
fuente
2

El siguiente es un script de ruby ​​que escribí que envuelve el "cp -al" y rsync en un script agradable que puede ejecutarse manualmente o vía cron. El destino puede ser local o remoto (a través de ssh):

Ghetto Timemachine

La respuesta básica a su pregunta, como se mencionó en un comentario anterior, la fuente debe mantenerse separada de los enlaces duros. Por ejemplo, suponga una copia de seguridad diaria de su directorio de inicio:

Fuente:

  • / inicio / flakrat

Destino:

  • / data / backup / daily
    • /lunes
    • /martes
    • /miércoles
    • /jueves
    • ...

Los enlaces duros se crean ejecutando "cp -al" contra la copia de seguridad de ayer. Digamos que es martes por la mañana cuando lo ejecutas:

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/

FlakRat
fuente
0

rdiff-backup parece hacer lo que quieres, échale un vistazo.

Usando rsync primero debe hacer una copia de seguridad completa sin usar enlaces duros. La siguiente copia de seguridad puede apuntar a la copia de seguridad anterior y al enlace rígido. De esa manera, sus copias de seguridad no están vinculadas a sus archivos de trabajo (los que está modificando). Ejemplo. Si mi copia de seguridad anterior era así, la carpeta de copia de seguridad.01 mi script de copia de seguridad incrementaría primero las carpetas renombrándolas por una, de modo que copia de seguridad.01 se convierta en copia de seguridad.02. Luego, el script crea una nueva carpeta vacía llamada backup.01. a continuación, rscync la nueva copia de seguridad en la nueva carpeta y el enlace duro a la copia de seguridad.02 para que solo los archivos nuevos ocupen espacio en la copia de seguridad. El comando rsync se vería así: rsync -rlt sourcepath backuppath / backup.01 --link-dest = backuppath / backup.02

Para que pueda ver, todo el enlace duro está sucediendo en la ruta de respaldo. De esta manera, no tiene que preocuparse por copiar al escribir al modificar archivos en su ruta de origen.

Marty
fuente