¿Cómo obtengo instantáneas o versiones del sistema de archivos transparentes y eficientes en ext3 / 4?

11

Durante mucho tiempo pensé en versionar sistemas de archivos. Esta es una característica excelente y he visto Wayback, ext3cow, zfs, soluciones de fusibles o simplemente superposiciones de cvs / svn / git.

Considero ext3cow el modelo para mis requisitos. Transparente, eficiente, pero puedo prescindir de la ls abc@timestampfunción adicional . Siempre que de alguna manera obtenga versiones automatizadas y transparentes de mis archivos.

Puede ser instantáneo o puede basarse en instantáneas en intervalos de 10s, 30s, 1m, 5m, 15m, etc. Simplemente es algo que manejará eficientemente miles de archivos en un directorio dado, todos de varios tamaños, la mayoría pequeños, pero algunos más de 100 ma 1 gb.

ZFS no es realmente una opción, ya que estoy en Linux (y preferiría no usarlo a través del fusible ya que ya tengo una configuración ext3 que quiero versionar, no algo nuevo).

¿Qué soluciones hay por ahí?

Dale Forester
fuente

Respuestas:

7

Si ajusta sus sistemas de archivos con LVM, puede crear un volumen de instantánea utilizando la capa de volumen lógico subyacente. Es un proceso bastante simple y sorprendentemente efectivo para cosas "instantáneas" estándar, como copias de seguridad y deshacer rm -froopsies.

McJeff
fuente
Gracias por la respuesta. Desafortunadamente, estoy buscando algo que pueda aplicarse en un sistema de archivos existente.
Dale Forester
6

Después de 8 años de búsqueda , encontré el SVNFS de Marco R. Gazzetta (que es diferente del proyecto anterior con el mismo nombre de John Madden [que hace cosas diferentes]). Este SVNFS usa svn de forma transparente en las operaciones de r / w:

En lugar de crear un sistema de archivos que haga su propio control de versiones, utilicé una herramienta de control de versiones existente, subversión, e hice su uso transparente. La ventaja es que este sistema de archivos no requiere que aprenda una nueva herramienta, si conoce la subversión

Está escrito en Python y usa FUSE:

Ahora inicia el sistema de archivos de versiones invocando el script adjunto:

python svnfs.py -o svnroot=/home/marco/svnfiles /home/marco/myfiles

Una vez que todo esté bien, debería poder obtener una lista de ambos directorios y ver que el contenido es el mismo.

Ahora, si crea (casi) cualquier archivo en cualquiera de los directorios, también se mostrará en el otro lado de la cerca. La gran diferencia es que si crea un archivo en el directorio myfiles, se colocará automáticamente bajo el control de la versión (lo contrario no es cierto).

En el ejemplo, SVNFS usa un directorio separado para el repositorio. Aunque no lo he probado. Para mis necesidades, me gustaría tener un repositorio en mi directorio de trabajo.


También encontré referencia a las capacidades de versiones de Reiser4 hace 4 años:

Ver Reiser 4. Los archivos son directorios.

p.ej: diff -u main.C main.C/r/123

O para acceder a propiedades

cat main.C/p/svn-eolstyle

echo "foobar" > main.C/p/my-property 

Parece que sería mejor seguir ese modelo, ya que un sistema de archivos importante ya está yendo por esa ruta.

-Paul Querna

Pero tampoco lo he comprobado.


Hace dos años fui a buscar más, encontré el proyecto FiST para generar sistemas de archivos apilables y contacté al profesor. Erez Zadok, de la Universidad Stony Brook, quien fue asesor / mentor para el proyecto llamado versionfs hace mucho tiempo. Citando:

http://www.fsl.cs.sunysb.edu/docs/versionfs-fast04/

http://www.fsl.cs.sunysb.edu/docs/versionfs-msthesis/versionfs.pdf

permite a los usuarios administrar sus propias versiones de manera fácil y eficiente. Versionfs proporciona esta funcionalidad con no más del 4% de sobrecarga para cargas de trabajo típicas de usuario. Versionfs permite a los usuarios seleccionar qué versiones se mantienen y cómo se almacenan a través de políticas de retención y políticas de almacenamiento, respectivamente. Los usuarios pueden seleccionar la compensación entre espacio y rendimiento que mejor satisfaga sus necesidades individuales: copias completas, copias comprimidas o deltas de bloque. Aunque los usuarios pueden controlar sus versiones, el administrador puede imponer valores mínimos y máximos, y proporcionar a los usuarios valores predeterminados razonables.

Además, mediante el uso de libversionfs, las aplicaciones no modificadas pueden examinar, manipular y recuperar versiones. Los usuarios simplemente pueden ejecutar herramientas conocidas para acceder a versiones de archivos anteriores, en lugar de exigirles a los usuarios que aprendan comandos separados, o solicitar al administrador del sistema que vuelva a montar un sistema de archivos. Sin libversionfs, las versiones anteriores están completamente ocultas para los usuarios.

Finalmente, Versionfs va más allá de la simple copia en escritura empleada por sistemas anteriores: implementamos copia en cambio. Aunque al principio esperábamos que la comparación entre páginas antiguas y nuevas sería demasiado costosa, descubrimos que el aumento en el tiempo del sistema está más que compensado por la reducción de E / S y el tiempo de CPU asociado con la escritura de bloques sin cambios. Cuando se utilizan políticas de almacenamiento más caras (p. Ej., Compresión), la copia en cambio es aún más útil.

Me pareció muy interesante, pero contactar a los chicos que trabajaron en el proyecto reveló que no hay un lugar conocido de su código fuente. El propio profesor declaró por correo:

El código de Versionfs es muy antiguo ahora, y solo funcionó en el kernel 2.4. Si aún desea un versionado apilable f / s, entonces uno tendría que escribirlo desde cero, posiblemente basado en wrapfs (consulte wrapfs.filesystems.org/).

Por lo tanto, no hay ningún proyecto que funcione aquí, aunque el concepto de sistemas de archivos apilables me parece muy agradable. ¿Alguien quiere comenzar un proyecto basado en f wrapfs , notifíqueme por favor :)

saulius2
fuente
3

Puedes consultar gitfs . Es un sistema de archivos FUSE basado en git, bastante estable y súper fácil de usar.

Básicamente, es una superposición sobre git. Cada vez que actualiza un archivo o directorio, crea una confirmación con ese cambio (sabe que debe procesar las confirmaciones para que no termine con 100 confirmaciones cuando descomprime un archivo). También sabe sincronizar su control remoto y fusionar los conflictos utilizando la estrategia 'aceptar siempre el mío'.

Cuando lo montas, te trae dos directorios: actual e histórico . ├── current │   ├── test1.md │   ├── test2.md │   ├── test3.md -> current/test2.md │   ├── test4.md │   └── test_directory └── history ├── 2014-11-23 │   ├── 20-00-21-d71d1579a7 │   │   └── testing.md │   └── 20-42-32-7d09611d83 │   ├── test2.md │   └── testing.md ├── 2014-12-08 │   ├── 16-38-30-6d6e71fe47 │   │   ├── test2.md │   │   └── test1.md

Se puede encontrar más información en esta página .

vtemian
fuente
Agregar más información mejoraría esta respuesta.
Dave M
2

Bup parece prometedor.

Una discusión más antigua sobre esto aquí: http://lwn.net/Articles/380983/

Shane Geiger
fuente
Hay una advertencia con el uso de algo basado en git, las modificaciones en git no se tratan como deltas desde el origen: cada confirmación es el archivo completo, incluso si solo cambia un byte.
sintetizador
0

Pruebe rsnapshot : no lo he usado yo mismo, pero me topé con él mientras buscaba @ sistemas de deduplicación a nivel de archivo.

Jason
fuente
Eso es interesante. Definitivamente voy a mirar en él. Mi preocupación es que su carga io causará tartamudeo en mi sistema (no hice algo similar con rsync hace un tiempo y dejé de usarlo debido al comportamiento de enganches / tartamudeo en otras consolas cuando se ejecutó).
Dale Forester
Eché un vistazo a rsnapshot y me gusta su idea, pero es muy, muy desafortunado que requiera una copia duplicada de lo que sea una instantánea. Desafortunadamente, y por necesidad, estoy trabajando con unidades en su límite y quiero capturar contenidos que sean bastante más grandes que el espacio libre restante.
Dale Forester
1
La dificultad está en tus requerimientos. además de algo como rsnapshot, o LVM, ext2 / ext3 no tiene una función de captura de imágenes incorporada. Señalas ext3cow, pero tendrías que cambiar el sistema de campo subyacente. Tenga en cuenta que parece que puede usar rsnapshot y almacenar sus datos en OTRA máquina, no sé de qué tipo de espacio está hablando, pero ¿puede tener sentido mantener sus instantáneas en otra máquina? También tenga en cuenta que las instantáneas de cualquier tipo requerirán espacio en disco. Si sus unidades están cerca de su capacidad, ¿cuánto espacio le queda para las instantáneas?
Jason