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:
- Grandes archivos que no cambian
- 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:
- 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.
- 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.
- 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:
- Sumas de verificación / etc. de AIDE para poder verificar / asegurarse de que algunos medios no se corrompan
- Inotify mantiene el uso de recursos bajo y no es necesario volver a escanear el sistema de archivos una y otra vez
- 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).
- 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?
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.
fuente
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.
fuente
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í.
fuente
Podrías intentar unísono ; especialmente el
opción mencionada en los documentos como
Parece que podría hacer lo que quieres.
fuente
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.
fuente
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
find
directorio base dondemtime
sea 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:
Tenga en cuenta que esperé aproximadamente 1 minuto entre ejecutar cada
find
comando. A partir de esto, muestra que al crear inicialmente el archivo, aparece en la listafind
. Si muevo el archivo a otro directorio y vuelvo a ejecutar elfind
comando, solo muestra el directorio al que moví el archivo, y no el archivo en sí. Puede usar una combinación defind
yrsync
comandos para enumerar solo los archivos que desea, probablemente pueda lograr su objetivo.Espero que esto ayude.
fuente
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.
fuente
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í.
fuente