¿Existe un sistema de archivos que guarde solo una copia de un archivo, y otras copias son solo referencias?

18

La pregunta puede ser imprecisa, así que intentaré explicarla con más detalle.

Por varias razones, tengo muchas copias del mismo archivo en mi sistema de archivos Linux. Muchos de ellos son bastante grandes.

Digamos que tengo /path/to/some.filey copias de este archivo /other/path/file.namey /yet/another/path/third.copy. Me pregunto si hay un sistema de archivos que literalmente haría que dos de estos archivos actúen como una referencia al original. Naturalmente, si el usuario modifica uno de ellos, entonces y solo entonces se convierten en archivos independientes.

PD. Sé que esto se puede lograr (parcialmente) mediante el uso de enlaces. Pero quiero que esta característica que intenté explicar anteriormente sea manejada de manera transparente por el sistema de archivos.

DejanLekic
fuente
Dado que todavía no parece haber una respuesta perfecta, ¿por qué no escribir un script (quizás ejecutado desde cron) que reemplaza los archivos con enlaces duros (o, si es seguro para algunos de ellos, enlaces simbólicos)? En cualquier caso, si aún no sabe dónde están todos los duplicados, consulte fdupes code.google.com/p/fdupes .
Joe
1
No puedo hacer eso porque cuando algún usuario cambia los datos en uno de los duplicados, deberían convertirse en archivos independientes porque el contenido es diferente después del cambio ... Si hago enlaces simbólicos, la modificación en realidad cambiará el original. Piense en el archivo original como un valor en un lenguaje de programación funcional: cuando lo modifica, obtiene literalmente un nuevo objeto y hace referencia a él.
DejanLekic
OKAY. Solo algunas ideas: ¿hay alguna forma de que puedas interponerse entre tus usuarios y estos archivos? Si puede, puede comenzar con un enlace (sym o hard) y luego romper el enlace si escriben algo en el archivo. También podría usar algo como diff para almacenar diferencias y ahorrar mucho espacio, como en un sistema de control de versiones. Si coloca los archivos en uno de ellos, podría gestionar las diferencias por usted. No he usado mucho los sistemas vcs, así que no conozco los detalles.
Joe

Respuestas:

17

Esta característica se llama deduplicación . Ninguno de los populares sistemas de archivos de Linux (ext *) lo admite, pero aparentemente, ZFS lo admite parcialmente . También hay una tabla de sistemas de archivos que enumera, entre otros, la deduplicación, pero no parece haber ninguna opción popular; sin embargo, es una característica planificada para Btrfs.

Supongo que verificar periódicamente su sistema de archivos y crear enlaces duros apropiados es lo mejor que puede hacer en este momento, aunque eso no implica copiar en escritura.

Claudio
fuente
Esperaba que BTRFS lo tuviera alborotado. No sabía que planeaban tener esta característica, ¡buenas noticias! ¡Gracias!
DejanLekic
10

La palabra clave principal que desea buscar es "copiar al escribir". BTRFS tiene una operación de clonación que hace exactamente lo que desea, y cp --reflinkhará lo que está buscando, siempre que su sistema tenga un núcleo suficientemente moderno y coreutils 7.5. Fuente de Wiki Además, bedup es una herramienta que fusionará duplicados en todo un volumen. CoW también es la característica de conducción debajo de la tecnología de instantáneas de btrfs, IIRC.

afrazier
fuente
Soy consciente de, cp --reflinkpero tenga en cuenta que realmente quiero que el FS detecte clones y use referencias en su lugar, de forma transparente. También estoy lejos de la bedupherramienta.
DejanLekic
Cuando un proceso a nivel de usuario lee de un archivo y escribe en otro, ¿cómo va a saber la capa FS que es una copia exacta y no una copia modificada? Es por eso que hay un ioctl separado para la clonación en lugar de solo leer y escribir. Las aplicaciones que quieran clonar archivos y quieran usar CoW deben usar esas cosas cuando estén disponibles y retroceder de lo contrario. No existe un método mágico confiable mediante el cual la capa FS pueda detectar que ocurra una copia y, en su lugar, hacer CoW. Una aplicación debe usar la llamada adecuada para el trabajo ( cp --reflink/ clonar) o una herramienta separada para finalizar el trabajo más tarde (acostarse).
Afrazier
Al comparar valores hash (más seguros) o crc + marca de tiempo. Escribir definitivamente haría que FS creara una copia independiente de un archivo. Además, este sistema puede implementarse a nivel de página ...
DejanLekic
¿Y dónde exactamente en el núcleo se hace eso? De lo que estás hablando no es un problema simple. También es posible hacerlo a nivel de página, pero requiere cantidades masivas de RAM para hacer en línea: ZFS puede tener más de 20 GB de RAM por TB de datos [Fuente ], y OpenDedup quiere 8 GB de RAM por TB de datos w / 4k páginas [Fuente ]. Los requisitos de ZFS se pueden reducir con L2ARC a costa del rendimiento.
Afrazier
1
WHS no deduce, a menos que esté hablando del almacén de copias de seguridad. En el caso del software de respaldo, el cliente puede hacer la mayor parte del trabajo y verificar el hash con el servidor antes de enviarle cualquier información para que se escriba. Un servicio de respaldo es una bestia muy diferente a un sistema de archivos. Las estrategias que funcionan para uno pueden no ser viables para otro.
Afrazier
4

Existe un sistema de archivos en línea S3QL diseñado para copias de seguridad con gran capacidad de deduplicación.

Daniel Fanjul
fuente
Debería haber dicho que necesito esto para un sistema de archivos local ... +1 de todos modos para obtener información útil.
DejanLekic
@DejanLekic, urls como local: // ... están permitidas.
Daniel Fanjul
0

Zfs, btrfs, ext3cow, bcachefs (afaik, pero existe la posibilidad de que aún no esté implementado). Microsoft tenía uno en desarrollo, pero se detuvieron por razones desconocidas.

orange_juice6000
fuente