Existe-t-il un système de fichiers qui ne conserve qu'une seule copie d'un fichier, et les autres copies ne sont que des références?

18

La question peut être imprécise, je vais donc essayer de l'expliquer plus en détail.

Pour un certain nombre de raisons, j'ai beaucoup de copies du même fichier sur mon système de fichiers Linux. Beaucoup d'entre eux sont assez grands.

Dites que j'ai /path/to/some.fileet des copies de ce fichier /other/path/file.nameet /yet/another/path/third.copy. Je me demande s'il existe un système de fichiers qui ferait littéralement en sorte que deux de ces fichiers servent de référence à l'original. Naturellement, si l'utilisateur modifie l'un d'entre eux, alors et seulement alors ils deviennent des fichiers indépendants.

PS. Je sais que cela peut être (partiellement) accompli en utilisant des liens. Mais je veux que cette fonctionnalité que j'ai essayé d'expliquer ci-dessus soit gérée de manière transparente par le système de fichiers.

DejanLekic
la source
Puisqu'il ne semble pas encore y avoir de réponse parfaite, pourquoi ne pas écrire un script (peut-être exécuté à partir de cron) qui remplace les fichiers par des liens durs (ou, si cela est sûr pour certains d'entre eux, des liens symboliques)? Dans tous les cas, si vous ne savez pas déjà où se trouvent tous les doublons, consultez fdupes code.google.com/p/fdupes .
Joe
1
Je ne peux pas le faire parce que lorsque certains utilisateurs modifient des données dans l'un des doublons, ils devraient devenir des fichiers indépendants car le contenu est différent après le changement ... Si je crée des liens symboliques, la modification changera en fait l'original. Considérez le fichier d'origine comme une valeur dans un langage de programmation fonctionnel - lorsque vous le modifiez, vous obtenez littéralement un nouvel objet et faites référence à lui.
DejanLekic
D'ACCORD. Juste quelques idées: existe-t-il un moyen de faire le lien entre vos utilisateurs et ces fichiers? Si vous le pouvez, vous pouvez commencer par un lien (sym ou hard) puis rompre le lien s'ils écrivent quelque chose dans le fichier. Vous pouvez également utiliser quelque chose comme diff pour simplement stocker les différences afin d'économiser beaucoup d'espace comme dans un système de contrôle de version. Si vous placez les fichiers dans l'un de ceux-ci, cela pourrait gérer les différences pour vous. Je n'ai pas beaucoup utilisé de systèmes vcs, donc je ne connais pas les détails.
Joe

Réponses:

17

Cette fonctionnalité est appelée déduplication . Aucun des systèmes de fichiers Linux populaires (ext *) ne le prend en charge, mais apparemment, ZFS le prend en charge partiellement . Il existe également un tableau des systèmes de fichiers répertoriant, entre autres, la déduplication, mais il ne semble pas y avoir de choix populaires - c'est une fonctionnalité prévue pour Btrfs, cependant.

Je suppose que vérifier périodiquement votre système de fichiers et créer des liens durs appropriés est le meilleur que vous puissiez faire pour le moment, bien que cela n'implique pas une copie sur écriture.

Claudius
la source
J'espérais que BTRFS l'aurait alraedy. Je ne savais pas qu'ils prévoyaient d'avoir cette fonctionnalité - bonne nouvelle! Merci!
DejanLekic
10

Le mot-clé principal que vous souhaitez rechercher est "copier sur écriture". BTRFS a une opération de clonage qui fait exactement ce que vous voulez, et cp --reflinkfera ce que vous recherchez, à condition que votre système ait un noyau et coreutils 7.5 suffisamment modernes. Source Wiki De plus, bedup est un outil qui fusionnera les doublons sur un volume entier. CoW est également la fonction de conduite sous la technologie d'instantané de btrfs, IIRC.

afrazier
la source
Je suis au courant, cp --reflinkmais notez que je souhaite que le FS détecte les clones et utilise des références à la place, de manière transparente. Je suis également loin de l' bedupoutil.
DejanLekic
Lorsqu'un processus de niveau utilisateur lit un fichier et écrit dans un autre, comment la couche FS va-t-elle savoir qu'il s'agit d'une copie exacte et non d'une copie modifiée? C'est pourquoi il existe un ioctl distinct pour le clonage par rapport à la lecture et à l'écriture. Les applications qui souhaitent cloner des fichiers et utiliser CoW doivent utiliser ces éléments lorsqu'ils sont disponibles et se replier dans le cas contraire. Il n'y a pas de méthode magique fiable par laquelle la couche FS peut détecter une copie en cours et effectuer un CoW à la place. Une application doit utiliser l'appel approprié pour le travail ( cp --reflink/ clone) ou un outil distinct pour terminer le travail plus tard (bedup).
afrazier
En comparant les hachages (plus sûrs) ou les valeurs d'horodatage crc +. L'écriture amènerait certainement FS à créer une copie indépendante d'un fichier. De plus, ce système peut être implémenté au niveau de la page ...
DejanLekic
Et où exactement dans le noyau cela se fait-il? Ce dont vous parlez n'est pas un problème simple. Le faire au niveau de la page est également possible, mais nécessite des quantités massives de RAM pour faire en ligne - ZFS peut être plus de 20 Go de RAM par To de données [Source ], et OpenDedup veut 8 Go de RAM par To de données w / 4k pages [Source ]. Les exigences de ZFS peuvent être réduites avec L2ARC au détriment des performances.
afrazier
1
WHS ne fait pas de déduplication, sauf si vous parlez du magasin de sauvegarde. Dans le cas d'un logiciel de sauvegarde, le client peut effectuer la majeure partie du travail et vérifier le hachage avec le serveur avant de lui envoyer des données à écrire. Un service de sauvegarde est une bête très différente d'un système de fichiers. Les stratégies qui fonctionnent pour l'une peuvent ne pas être viables pour une autre.
afrazier
4

Il existe un système de fichiers en ligne S3QL conçu pour les sauvegardes avec une grande capacité de déduplication.

Daniel Fanjul
la source
J'aurais dû dire que j'en ai besoin pour un système de fichiers local ... +1 quand même pour des informations utiles.
DejanLekic
@DejanLekic, les URL comme local: // ... sont autorisées.
Daniel Fanjul
0

Zfs, btrfs, ext3cow, bcachefs (afaik, mais il est possible qu'il ne soit pas encore implémenté). Microsoft en avait un en développement mais ils se sont arrêtés pour des raisons inconnues.

orange_juice6000
la source