Herramienta o script para detectar archivos movidos o renombrados en Linux antes de una copia de seguridad [cerrado]

15

Básicamente estoy buscando para ver si existe una herramienta o script que pueda detectar archivos movidos o renombrados para poder obtener una lista de archivos renombrados / movidos y aplicar la misma operación en el otro extremo de la red para conservar el ancho de banda.

Básicamente, el almacenamiento en disco es económico, pero el ancho de banda no lo es, y el problema es que los archivos a menudo se reorganizarán o se moverán a una mejor estructura de directorios, por lo tanto, cuando use rsync para hacer la copia de seguridad, rsync no notará que es un cambio de nombre o movió el archivo y lo volvió a transmitir a través de la red nuevamente a pesar de tener el mismo archivo en el otro extremo.

Entonces, me pregunto si existe un script o herramienta que pueda registrar dónde están todos los archivos y sus nombres, luego, justo antes de una copia de seguridad, volvería a explorar y detectar archivos movidos o renombrados, luego puedo tomar esa lista y volver a aplicar la operación de mover / renombrar en el otro lado.

Aquí hay una lista de las características "generales" de los archivos:

  1. Grandes archivos que no cambian
  2. Se pueden renombrar o mover

[Editar:] Todas estas son buenas respuestas, y lo que terminé haciendo al final fue mirar todas las respuestas y escribiré un código para lidiar con esto. Básicamente, lo que estoy pensando / trabajando ahora es:

  1. Usar algo como AIDE para el análisis "inicial" y permitirme mantener sumas de verificación en los archivos porque se supone que nunca cambian, por lo que ayudaría a detectar la corrupción.
  2. Crear un demonio inotify que supervisaría estos archivos / directorio y registrar cualquier cambio relacionado con los cambios de nombre y mover los archivos a un archivo de registro.
  3. Hay algunos casos extremos en los que inotify puede fallar al registrar que algo le sucedió al sistema de archivos, por lo tanto, hay un paso final de usar find para buscar archivos en el sistema de archivos que tengan un tiempo de cambio posterior a la última copia de seguridad .

Esto tiene varios beneficios:

  1. Sumas de verificación / etc. de AIDE para poder verificar / asegurarse de que algunos medios no se corrompan
  2. Inotify mantiene el uso de recursos bajo y no es necesario volver a escanear el sistema de archivos una y otra vez
  3. No es necesario parchear rsync; Si tengo que parchear cosas que puedo, pero preferiría evitar parchar cosas para mantener la carga baja (IE no necesita volver a parchar cada vez que hay una actualización).
  4. He usado Unison antes y es realmente agradable, sin embargo, ¿podría haber jurado que Unison guarda copias en el sistema de archivos y que sus archivos "archivados" pueden llegar a ser bastante grandes?
Pharaun
fuente

Respuestas:

7

Unison http://www.cis.upenn.edu/~bcpierce/unison/ afirma que puede detectar movimientos y renombrar.

Hay un par de parches para rsync para agregar detección de movimiento / cambio de nombre:

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed-lax.diff;h=1ff593c8f97a97e8970d43ff5a62dfad5abddd75;hb=master

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed.diff;h=c3e6e846eab437e56e25e2c334e292996ee84345;hb=master

Entrada de Bugzilla que rastrea este problema: https://bugzilla.samba.org/show_bug.cgi?id=2294

Mark Wagner
fuente
66
¿Por qué no están integrados estos parches? Simplemente agregan banderas, no son intrusivas. Otro parche interesante es rsyncsums , que puede mantener las sumas de comprobación entre las ejecuciones de rsync.
Tobu
5

Esta es una solución un poco extraña, pero ... git detecta movimientos y cambia el nombre en función del contenido del archivo, por lo que si tuviera que mantener los directorios en cuestión bajo control de versión, entonces git podría detectar movimientos y evitar la transferencia de contenido (ya que está en ambos lados del cable) mientras se siguen moviendo cosas en el árbol.

Solo un pensamiento.

pjz
fuente
2
Sí, consideré esto, si los archivos fueran pequeños y basados ​​en texto, probablemente funcionaría bien, pero son binarios y el tamaño total se acerca a un Terabyte.
Pharaun
@Pharaun Necesitarías el índice git sin el almacenamiento de blobs. Tal vez extraiga este código de git y agréguelo a libgit2.
Tobu
El código relevante comienza con refresh_index en read-cache.c.
Tobu
5

sugerencias interesantes aquí. También pensé en usar las capacidades del sistema de archivos, es decir, ZFS. Me pareció extraño que no haya una herramienta que haga esa cosa simple. La opción Unison no funciona en la mayoría de los casos, ya que las personas informan, tampoco para mí.

Quiero que la función mantenga sincronizada la copia de seguridad de mi colección de películas en el segundo disco duro al reorganizar carpetas.

Ahora encontré este simple script C http://sourceforge.net/projects/movesync/

Parece funcionar bien. Ejecútelo y luego sincronice normalmente con ie unison.

Groovehunter
fuente
4

Es posible que pueda usar un IDS basado en host , como AIDE, y escribir un script de envoltura utilizando su salida. Es probable que tenga que escribir una lógica más compleja teniendo en cuenta las sumas de verificación.

De lo contrario, un sistema de archivos basado en la red podría tener sentido, ya que los cambios se reflejarían en todas las ubicaciones. Sin embargo, sospecho que está transfiriendo a través de Internet, lo que limitará las opciones aquí.

Warner
fuente
Eso era lo que estaba pensando hacer, tomar uno de esos y extenderlos. También sí, lo estoy transfiriendo a través de Internet y el ancho de banda es bastante limitado.
Pharaun
3

Podrías intentar unísono ; especialmente el

-xferbycopying optimiza las transferencias utilizando copias locales (valor predeterminado verdadero)

opción mencionada en los documentos como

Cuando se establece esta preferencia, Unison intentará evitar transferir el contenido del archivo a través de la red al reconocer cuándo ya existe un archivo con el contenido requerido en la réplica de destino. Esto generalmente permite que los movimientos de archivos se propaguen muy rápidamente. El valor por defecto es verdadero.

Parece que podría hacer lo que quieres.

pjz
fuente
En realidad, en retrospectiva, podría haber sido demasiado apresurado con el comentario al unísono. ¿Unison admite la sustitución de un enlace duro con el contenido real del archivo si cambia? Si es así, podría ser capaz de hacer algo de magia con rsnapshot + unison que cumpliría mis requisitos sin tener que escribir una tonelada de código / log / etc nuevo para lidiar con esto.
Pharaun
3

Syrep hace lo que necesitas. Mantiene actualizados los resúmenes de mensajes en un árbol de archivos; mantener los resúmenes lo hace más eficiente que rsync. Fue diseñado para sneakernet, por lo que es posible que desee agregar un contenedor que actualice / makepatch / merge a la vez.

Tobu
fuente
2

No estoy seguro de si hay una herramienta existente que haga esto por usted, pero podría escribir un script simple que simplemente ejecute un finddirectorio base donde mtimesea ​​más nuevo que la última copia de seguridad. Esto le dará una lista de todos los archivos que han sido modificados . Si un archivo simplemente se movió, no aparecerá en la lista. Desafortunadamente, esta lista incluirá los directorios a los que se movieron los archivos, ya que el directorio se actualiza cuando se agrega / elimina un archivo.

Con esa lista de archivos, puede usar rsync para sincronizar solo esos archivos. rsync tiene una opción para leer en una lista de archivos. Aquí hay una prueba que muestra este ejemplo:

$ cd tmp
$ echo test > test
$ ls -la
total 16
drwxr-xr-x 2 root root 4096 Aug 18 11:34 .
drwxr-x--- 5 root root 4096 Aug 18 11:34 ..
-rw-r--r-- 1 root root    5 Aug 18 11:34 test
$ mkdir tmp2
$ find . -mmin 1
$ date
Wed Aug 18 11:35:10 EDT 2010
$ find . -mmin 1
$ find . -mmin 2
.
./test
./tmp2
$ mv test tmp2
$ find . -mmin 1
.
./tmp2

Tenga en cuenta que esperé aproximadamente 1 minuto entre ejecutar cada findcomando. A partir de esto, muestra que al crear inicialmente el archivo, aparece en la lista find. Si muevo el archivo a otro directorio y vuelvo a ejecutar el findcomando, solo muestra el directorio al que moví el archivo, y no el archivo en sí. Puede usar una combinación de findy rsynccomandos para enumerar solo los archivos que desea, probablemente pueda lograr su objetivo.

Espero que esto ayude.

vmfarms
fuente
2

Dado su flujo de trabajo, me pregunto si trabajar a nivel de archivo (como lo que otros han propuesto hasta ahora) es la mejor solución. Podrías trabajar ...

A nivel del sistema de archivos

La idea es que el sistema de archivos realice un seguimiento de las operaciones entre las copias de seguridad. En lugar de hacer una copia de seguridad del sistema de archivos, haga una copia de seguridad del diario del sistema de archivos (y opcionalmente reproduzca los cambios en la máquina de copia de seguridad, si desea una copia de seguridad lista para usar). Un diario del sistema de archivos naturalmente expresa movimientos y eliminaciones en unos pocos bytes.

Fuse hace que sea relativamente fácil diseñar un sistema de archivos con requisitos específicos que se asienta sobre un "sistema de archivos real". Nunca lo he usado, pero LoggedFS parece prometedor.

Con esta solución, valdría la pena tener alguna forma de compresión de diario. Por ejemplo, si un archivo se ha sobrescrito 10 veces, solo mantenga su última actualización en el diario. Otra optimización que vale la pena sería reconocer las operaciones de copia, y aún mejor, las ediciones (es decir, crear un archivo que sea mayormente pero no completamente idéntico a otro archivo). No sé si alguien ha implementado esto. Para su flujo de trabajo, no creo que importe mucho de todos modos.

A nivel de volumen

La idea es que el administrador de volúmenes realice un seguimiento de las operaciones entre las copias de seguridad. En lugar de hacer una copia de seguridad del sistema de archivos, tome una instantánea con el administrador de volumen y haga una copia de seguridad de la instantánea expresada como una diferencia de la instantánea anterior.

Esto debería funcionar bien si todo lo que haces es crear archivos, renombrarlos y eliminarlos. Sería mucho más difícil detectar cosas como copias y ediciones, u optimizar la creación de un archivo seguido de su eliminación.

Gilles 'SO- deja de ser malvado'
fuente
De hecho, he estado trabajando un poco en un registrador de "sistema" de archivos a través de inotify para realizar un seguimiento de los cambios, pero si los cambios llegan más rápido que la velocidad que el demonio puede registrar, perderá información, por lo tanto, necesitará construir un copia de seguridad / escaneo para obtener el estado inicial y en caso de inotificar la pérdida de información. Parece que la idea de tener algo que se encuentre entre el sistema de archivos y el resto del sistema también podría ser una buena idea, entonces, como dijiste, que los cambios podrían reproducirse en la máquina de copia de seguridad.
Pharaun
Pero ese loginFS parece un proyecto interesante, la única preocupación es que detuvieron el desarrollo en 2008/09. Voy a tener que jugar con él y ver si funciona.
Pharaun
0

Unison es bueno para esto, pero aún necesita copiar archivos localmente y no puede detectar un movimiento / cambio de nombre si también el contenido del archivo cambió aunque sea un poco.

Hice un script Python simple para detectar archivos y directorios renombrados / movidos usando números de inodo (solo * nix) y reproducir estos cambios en la máquina sincronizada. Puede usarlo solo o como "preprocesador de cambio de nombre" para Unison o rsync. Se puede encontrar aquí.

rolicot
fuente