Outil ou script pour détecter les fichiers déplacés ou renommés sous Linux avant une sauvegarde [fermé]

15

Fondamentalement, je cherche à voir s'il existe un outil ou un script qui peut détecter les fichiers déplacés ou renommés afin que je puisse obtenir une liste de fichiers renommés / déplacés et appliquer la même opération à l'autre extrémité du réseau pour économiser la bande passante.

Fondamentalement, le stockage sur disque est bon marché, mais la bande passante ne l'est pas, et le problème est que les fichiers seront souvent réorganisés ou déplacés dans une meilleure structure de répertoires.Par conséquent, lorsque vous utilisez rsync pour effectuer la sauvegarde, rsync ne remarquera pas qu'il s'agit d'un fichier renommé ou déplacé le fichier et le retransmettre sur le réseau à nouveau malgré le même fichier à l'autre extrémité.

Je me demande donc s'il existe un script ou un outil qui peut enregistrer où se trouvent tous les fichiers et leurs noms, puis juste avant une sauvegarde, il réanalyserait et détecterait les fichiers déplacés ou renommés, alors je peux prendre cette liste et réappliquer l'opération déplacer / renommer de l'autre côté.

Voici une liste des fonctionnalités "générales" des fichiers:

  1. Grands fichiers immuables
  2. Ils peuvent être renommés ou déplacés

[Modifier:] Ce sont toutes de bonnes réponses, et ce que je finis par faire à la fin était de regarder toutes les réponses et j'écrirai du code pour y faire face. Fondamentalement, ce à quoi je pense / travaille actuellement:

  1. Utiliser quelque chose comme AIDE pour l'analyse "initiale" et me permettre de garder des sommes de contrôle sur les fichiers car ils sont censés ne jamais changer, donc cela aiderait à détecter la corruption.
  2. Créer un démon inotify qui surveillerait ces fichiers / répertoires et enregistrer toutes les modifications relatives aux renommages et déplacer les fichiers vers un fichier journal.
  3. Il existe certains cas marginaux où inotify peut ne pas enregistrer que quelque chose est arrivé au système de fichiers, il y a donc une dernière étape d'utilisation de la recherche pour rechercher dans le système de fichiers les fichiers dont le temps de modification est supérieur à la dernière sauvegarde .

Cela présente plusieurs avantages:

  1. Somme de contrôle / etc de AIDE pour pouvoir vérifier / s'assurer que certains médias ne sont pas corrompus
  2. Inotify réduit l'utilisation des ressources et n'a pas besoin de réanalyser le système de fichiers encore et encore
  3. Pas besoin de patcher rsync; Si je dois patcher des choses que je peux, mais je préférerais éviter de patcher des choses pour réduire la charge (IE n'a pas besoin de re-patcher chaque fois qu'il y a une mise à jour).
  4. J'ai déjà utilisé Unison et c'est vraiment sympa, mais j'aurais juré qu'Unison garde des copies sur le système de fichiers et que ses fichiers "archive" peuvent devenir assez gros?
Pharaun
la source

Réponses:

7

Unison http://www.cis.upenn.edu/~bcpierce/unison/ prétend pouvoir détecter les mouvements et les renommages.

Il existe quelques correctifs à rsync pour ajouter la détection de déplacement / renommage:

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

Entrée Bugzilla suivant ce problème: https://bugzilla.samba.org/show_bug.cgi?id=2294

Mark Wagner
la source
6
Pourquoi ces correctifs ne sont-ils pas intégrés? Ils ajoutent juste des drapeaux, ils ne sont pas intrusifs. Un autre patch intéressant est rsyncsums , qui peut conserver des sommes de contrôle entre les exécutions rsync.
Tobu
5

C'est un peu une solution étrange, mais ... git détecte les mouvements et renomme en fonction du contenu du fichier, donc si vous deviez garder les répertoires en question sous contrôle de version, alors git serait en mesure de détecter les mouvements et autres et éviter de transférer le contenu (car il est déjà des deux côtés du fil) tout en déplaçant les choses dans l'arbre.

Juste une pensée.

pjz
la source
2
Oui, j'ai considéré cela, si les fichiers étaient petits et basés sur du texte, cela fonctionnerait probablement bien, mais ils sont binaires et la taille totale approche d'un téraoctet.
Pharaun
@Pharaun Vous auriez besoin de l'index git sans le stockage d'objets blob. Peut-être extraire ce code de git et l'ajouter à libgit2.
Tobu
Le code pertinent commence par refresh_index dans read-cache.c.
Tobu
5

suggestions intéressantes ici. Penser également à utiliser les capacités du système de fichiers, c'est-à-dire ZFS J'ai trouvé étrange qu'il n'y ait aucun outil qui fasse cette chose simple. L'option Unison ne fonctionne pas dans la plupart des cas, comme le rapportent les gens, pas pour moi non plus.

Je souhaite que la fonctionnalité conserve la sauvegarde de ma collection de films sur le deuxième disque dur en synchronisation lors de la réorganisation des dossiers.

Maintenant, j'ai trouvé ce simple script C http://sourceforge.net/projects/movesync/

Semble bien fonctionner. Exécutez-le puis synchronisez normalement avec ie à l'unisson.

groovehunter
la source
4

Vous pourrez peut-être utiliser un ID basé sur l'hôte tel que AIDE et écrire un script wrapper en utilisant sa sortie. Vous devrez probablement écrire une logique plus complexe compte tenu des sommes de contrôle.

Sinon, un système de fichiers basé sur le réseau pourrait avoir un sens, car les modifications seraient reflétées à tous les emplacements. Néanmoins, je soupçonne que vous transférez sur Internet, ce qui limitera les options ici.

Warner
la source
C'est ce que je pensais faire, en prendre un et le prolonger. Oui, je le transfère également sur Internet et la bande passante est assez limitée.
Pharaun
3

Vous pourriez essayer à l' unisson ; en particulier le

-xferbycopying optimiser les transferts en utilisant des copies locales (par défaut true)

option mentionnée dans les documents comme

Lorsque cette préférence est définie, Unison essaiera d'éviter de transférer le contenu des fichiers sur le réseau en reconnaissant qu'un fichier avec le contenu requis existe déjà dans la réplique cible. Cela permet généralement de propager les déplacements de fichiers très rapidement. La valeur par défaut est true.

on dirait qu'il pourrait faire ce que vous voulez.

pjz
la source
En fait, avec le recul, j'aurais peut-être été trop précipité sur le commentaire à l'unisson. Unison prend-il en charge le remplacement d'un lien physique par le contenu réel du fichier s'il change? Si c'est le cas, je pourrais peut-être faire de la magie avec rsnapshot + unison qui répondrait à mes besoins sans avoir à écrire une tonne de nouveau code / log / etc pour y faire face.
Pharaun
3

Syrep fait ce dont vous avez besoin. Il garde à jour les résumés des messages dans une arborescence de fichiers; garder les résumés autour le rend plus efficace que rsync. Il a été conçu pour sneakernet, vous pouvez donc ajouter un wrapper qui met à jour / makepatch / fusionne à la fois.

Tobu
la source
2

Je ne sais pas s'il existe un outil existant qui le fait pour vous, mais vous pouvez écrire un script simple qui exécute simplement un findsur le répertoire de base où mtimeest plus récent que la dernière sauvegarde. Cela vous donnera une liste de tous les fichiers qui ont été modifiés . Si un fichier a été simplement déplacé, il n'apparaîtra pas dans la liste. Malheureusement, cette liste inclura les répertoires dans lesquels les fichiers ont été déplacés, car le répertoire est mis à jour lorsqu'un fichier est ajouté / supprimé.

Avec cette liste de fichiers, vous pouvez utiliser rsync pour synchroniser uniquement ces fichiers. rsync a une option pour lire dans une liste de fichiers. Voici un test montrant cet exemple:

$ 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

Veuillez noter que j'ai attendu environ 1 minute entre l'exécution de chaque findcommande. De cela, il montre que lors de la création initiale du fichier, il est répertorié par find. Si je déplace le fichier dans un autre répertoire et réexécute la findcommande, il n'affiche que le répertoire dans lequel j'ai déplacé le fichier, et non le fichier lui-même. Vous pouvez utiliser une combinaison de commandes findet rsyncpour répertorier uniquement les fichiers que vous souhaitez, il peut probablement atteindre votre objectif.

J'espère que ça aide.

vmfarms
la source
2

Compte tenu de votre flux de travail, je me demande si travailler au niveau du fichier (comme ce que d'autres ont proposé jusqu'à présent) est la meilleure solution. Tu pourrais travailler ...

Au niveau du système de fichiers

L'idée est que le système de fichiers garde une trace des opérations entre les sauvegardes. Au lieu de faire une sauvegarde du système de fichiers, sauvegardez le journal du système de fichiers (et éventuellement relisez les modifications sur la machine de sauvegarde, si vous voulez une sauvegarde prête à l'emploi). Un journal de système de fichiers exprime naturellement les mouvements et les suppressions en quelques octets.

Fuse facilite la conception d'un système de fichiers avec des exigences spécifiques qui se trouve au-dessus d'un «vrai système de fichiers». Je ne l'ai jamais utilisé, mais LoggedFS semble prometteur.

Avec cette solution, il serait utile d'avoir une forme de compression de journal. Par exemple, si un fichier a été écrasé 10 fois, ne conservez que sa dernière mise à jour dans le journal. Une autre optimisation intéressante serait de reconnaître les opérations de copie et, mieux encore, les modifications (c'est-à-dire la création d'un fichier qui est principalement mais pas complètement identique à un autre fichier). Je ne sais pas si quelqu'un a mis cela en œuvre. Pour votre flux de travail, je ne pense pas que cela importerait de toute façon.

Au niveau du volume

L'idée est que le gestionnaire de volumes garde la trace des opérations entre les sauvegardes. Au lieu de faire une sauvegarde du système de fichiers, prenez un instantané avec le gestionnaire de volume et sauvegardez l'instantané exprimé en diff de l'instantané précédent.

Cela devrait bien fonctionner si tout ce que vous faites est de créer des fichiers, de les renommer et de les supprimer. Il serait beaucoup plus difficile de détecter des choses comme les copies et les modifications, ou d'optimiser la création d'un fichier suivie de sa suppression.

Gilles 'SO- arrête d'être méchant'
la source
J'ai en fait travaillé un peu sur un enregistreur de "système" de fichiers via inotify pour garder une trace des changements, mais si les changements arrivent plus vite que la vitesse à laquelle le démon peut l'enregistrer, il perdra des informations, donc il faut construire un sauvegarde / scan pour obtenir l'état initial et en cas d'inotification de perte d'informations. Cela ressemble à l'idée d'avoir quelque chose qui se situe entre le système de fichiers et le reste du système pourrait également être une bonne idée, comme vous l'avez dit, que les modifications pourraient être rejouées sur la machine de sauvegarde.
Pharaun
Mais que logsFS ressemble à un projet intéressant, la seule préoccupation est qu'ils ont arrêté le développement en 2008/09. Je vais devoir jouer avec et voir si ça fera l'affaire.
Pharaun
0

Unison est bon pour cela, mais doit toujours copier les fichiers localement et il ne peut pas détecter un déplacement / renommage si le contenu du fichier a également changé un peu.

J'ai créé un script Python simple pour détecter les fichiers et répertoires renommés / déplacés à l'aide de numéros d'inode (* nix uniquement) et relire ces modifications sur la machine synchronisée. Vous pouvez l'utiliser seul ou comme "préprocesseur renommant" pour Unison ou rsync. Il se trouve ici

rolicot
la source