Instantané `cp -al` dont les liens durs sont dirigés vers un nouveau fichier lors de leur modification

11

J'essaie de prendre régulièrement des instantanés d'un dossier massif.

J'ai lu ici: http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
qui cp -alprend un instantané d'un dossier en copiant simplement les liens durs.

C'est très bien, mais le problème est que dans cet instantané, si je change un fichier, il change dans tous les instantanés. Ce que j'aimerais à la place, c'est que le système crée un nouveau fichier lors de la modification et un lien vers celui-ci à la place. De cette façon, chaque instantané ne deviendrait pas invalide lors d'une modification du premier fichier.

Comment puis-je y parvenir?

ps j'ai essayé rsync -a --delete --link-dest=../backup.1 source_directory/ backup.0/, mais il a le même problème.

Hermann Ingjaldsson
la source

Réponses:

7

Voilà comment fonctionnent les liens physiques. Mais, il existe des moyens de contourner cela:

Quelques options me viennent à l'esprit:

  • Utilisez un système de fichiers prenant en charge les fichiers de copie sur écriture, comme btrfs. Bien sûr, si vous utilisiez btrfs, vous utiliseriez simplement ses instantanés natifs ... Si votre système de fichiers le prend en charge, vous pouvez l'utiliser cp --reflink=always. Malheureusement, ext4 ne prend pas cela en charge.
  • Partagez uniquement des liens physiques sur vos instantanés, pas avec l'original. Autrement dit, la première fois que vous voyez une version donnée d'un fichier, copiez-la dans l'instantané. Mais la prochaine fois, liez-le à celui de l'instantané précédent. (Je ne sais pas quel programme j'ai utilisé pour faire cela - il y a une décennie - mais la recherche se révèle dirvish, obnam, storebackup et rsnapshot)
  • En fonction de la façon dont vos fichiers sont modifiés, vous pouvez être en mesure de garantir qu'un temp / rename en écriture est utilisé pour les modifier, ce qui rompra le lien fixe. La version dans l'instantané restera donc vierge. C'est moins sûr, cependant, car les bogues pourraient corrompre votre instantané.
  • Prenez des instantanés LVM de l'ensemble du système de fichiers.

Bien sûr, il y a l'autre option: utilisez un système de sauvegarde approprié. La plupart d'entre eux peuvent gérer uniquement la sauvegarde des fichiers modifiés.

derobert
la source
Que recommandez-vous pour sauvegarder un dossier massif?
Hermann Ingjaldsson
Je pensais utiliser rsync sur un serveur qui a une tâche cron pour faire régulièrement cp -al pour les snapshots .. à côté de rsync-ing pour encore plus de copies. Comment ça sonne?
Hermann Ingjaldsson
@HermannIngjaldsson bien, cela dépend de la façon dont vous effectuez vos sauvegardes. Personnellement, je voudrais simplement l'ajouter à ma configuration Bacula, mais je ne le recommanderais pas, sauf si vous avez un tas de machines à sauvegarder ou si vous connaissez déjà Bacula. Donc, je suppose que je vous suggère d'essayer d'abord rsnapshot.
derobert
rsnapshotest bon
developerbmw
4

Ce que vous recherchez est une forme de copie sur écriture , où plusieurs fichiers ayant le même contenu utilisent le même espace sur le disque jusqu'à ce que l'un d'eux soit modifié. Les liens matériels n'implémentent la copie sur écriture que si l'application qui effectue l'écriture supprime le fichier et crée un nouveau fichier du même nom (ce qui se fait généralement en créant un nouveau fichier sous un nom différent, puis en le déplaçant). L'application que vous utilisez ne le fait évidemment pas: elle écrase le fichier existant.

Certaines applications peuvent être configurées pour utiliser la stratégie de remplacement. Certaines applications utilisent la stratégie de remplacement par défaut, mais utilisent la stratégie de remplacement lorsqu'elles voient un fichier avec plusieurs liens durs, précisément pour ne pas rompre les liens durs. Votre technique actuelle de capture d'écran fonctionnera si vous pouvez configurer votre application pour la remplacer au lieu de l'écraser.

Fl-cow modifie les programmes pour utiliser systématiquement la stratégie de remplacement sur les fichiers avec plusieurs liens durs.

Alternativement, vous pouvez stocker vos fichiers sur un système de fichiers qui effectue la copie sur écriture ou la déduplication, ou avoir une fonction de capture instantanée, et ne pas vous soucier des liens matériels: Btrfs ou Zfs . Selon votre schéma de partitionnement, l'utilisation d'instantanés LVM peut être une option.

Ma recommandation est d'utiliser un outil d'instantané approprié. Faire des sauvegardes fiables est étonnamment difficile. Vous voulez probablement rsnapshot .

Gilles 'SO- arrête d'être méchant'
la source
2

Ce qui suit est un script ruby ​​que j'ai écrit qui enveloppe le "cp -al" et rsync dans un joli script qui peut être exécuté manuellement ou via cron. La destination peut être locale ou distante (via ssh):

Ghetto Timemachine

La réponse de base à votre question, comme mentionné dans un commentaire précédent, la source doit être tenue à l'écart des liens durs. Par exemple, supposez une sauvegarde quotidienne de votre répertoire personnel:

La source:

  • / accueil / flakrat

Destination:

  • / données / sauvegarde / quotidien
    • /Lundi
    • /Mardi
    • /Mercredi
    • /Jeudi
    • ...

Les liens durs sont créés en exécutant "cp -al" contre la sauvegarde d'hier. Disons que c'est mardi matin lorsque vous l'exécutez:

cd /data/backup/daily

rm -rf tuesday

cp -al monday tuesday

rsync -a --delete /home/flakrat /data/backup/daily/tuesday/

FlakRat
la source
0

rdiff-backup semble faire ce que vous voulez, vérifiez-le.

En utilisant rsync, vous devez d'abord effectuer une sauvegarde complète sans utiliser de liens durs. La sauvegarde suivante peut pointer vers la sauvegarde précédente et un lien dur vers celle-ci. De cette façon, vos sauvegardes ne sont pas liées à vos fichiers de travail (ceux que vous modifiez). Exemple. Si ma sauvegarde précédente était la sauvegarde de dossier.01, mon script de sauvegarde incrémenterait d'abord les dossiers en les renommant d'un pour que la sauvegarde.01 devienne la sauvegarde.02. Ensuite, le script crée un nouveau dossier vide appelé backup.01. il serait alors rscync la nouvelle sauvegarde dans le nouveau dossier et un lien dur vers backup.02 afin que seuls les nouveaux fichiers prennent de la place dans la sauvegarde. La commande rsync ressemblerait à ceci: rsync -rlt sourcepath backuppath / backup.01 --link-dest = backuppath / backup.02

Ainsi, vous pouvez voir que toutes les liaisons physiques se produisent sur le chemin de sauvegarde. De cette façon, vous n'avez pas à vous soucier de la copie lors de l'écriture lorsque vous modifiez des fichiers dans votre chemin source.

Marty
la source