Fichier incrémentiel sauvegardé par date

Y at-il un outil de sauvegarde qui prend en charge la sauvegarde partielle par date? Ce que je veux dire, c'est que j'ai quelques petits disques comme sur un ordinateur portable qui ne peut pas contenir une copy complète de tous les files sur un lecteur externe de 2 To. Je veux garder les derniers files, qui sont généralement ceux avec lesquels je travaille, sur l'ordinateur portable. Mais en même time, je veux pouvoir synchroniser d'autres disques avec un espace de stockage limité. Chaque petit lecteur doit donc contenir des files créés ou modifiés au-delà d'une certaine date, comme il y a 3 mois. Disons que j'ai 2 ordinateurs portables et que chacun a une taille de disque différente. Pour l'ordinateur portable avec un lecteur plus petit, je ne peux que vouloir que les files du dernier mois soient présents. Tous les files des deux ordinateurs portables doivent être sauvegardés sur le grand lecteur externe, ainsi que tous les autres files archivés datant de plus de 3 mois. Ainsi, le lecteur externe doit refléter les deux disques plus petits et les garder synchronisés. J'ai essayé d'utiliser l' unison mais il ne semble pas soutenir de sauvegarde par date. Peut-être que rsync avec quelques scripts shell pourrait fonctionner, mais je veux vérifier d'abord si une solution existe avant d'en implémenter un nouveau.

Je n'ai pas utilisé de programmes dédiés pour cela, mais c'est assez facile à organiser et à régler avec une combinaison de cron, bash, tar ( incrémental ) et / ou rsync. Dans mon esprit, il y a deux solutions optimales, et j'utilise les deux ou l'une d'entre elles en fonction du context. Je pense que le premier sera plus approprié pour vous, mais je vais décrire les deux ici.

Archives tar incrémentielles

Le kernel de cette solution est un script qui pourrait ressembler à ceci:

 #!/bin/bash # You will need to set the variables $EXCLUDE, $DATA and $BACKUPS # as environment variables, in ~/.bashrc or somewhere. OPTS="--create --no-check-device --bzip2 --verbose -X $EXCLUDE" for d in `ls $DATA`; do SNAPSHOT=$BACKUPS/$d.snar if [ $1 == full ]; then echo "Archiving $d (full)..." rm -rvf $SNAPSHOT ARCHIVE=$DATA/$d.`date --iso-8601`.full.tar.bz2 tar $OPTS --file=$ARCHIVE --listd-incremental=$SNAPSHOT $DATA/$d fi if [ $1 == increment ]; then echo "Archiving data/$d (increment)..." ARCHIVE=$DATA/$d.`date --iso-8601`.tar.bz2 tar $OPTS --file=$ARCHIVE --listd-incremental=$SNAPSHOT $DATA/$d fi done 

Cela suppose qu'il y a des sous-directorys dans $DATA et des sauvegardes chacun dans une archive séparée. Si votre configuration est différente, personnalisez le script.

Vous pouvez planifier la sauvegarde dans votre crontab comme ceci:

 # mh dom mon dow command 44 1 1 */2 * ~/bin/backup_data full > ~/backups/data/logs/`date --iso-8601`.full.log 2>&1 44 5 * * * ~/bin/backup_data increment > ~/backups/data/logs/`date --iso-8601`.log 2>&1 

Comme vous pouvez le voir, dans ce cas, une sauvegarde complète est créée une fois tous les deux mois et des sauvegardes incrémentielles à partir de ce vidage complet sont créées tous les jours. Problèmes avec les archives incrémentielles dans tar démarrer lorsque vous perdez un file ou même changer un horodatage. Donc, il est prudent de créer une décharge complète de time en time.

En ce qui concerne la synchronisation entre les machines et la suppression des anciens files, vous devez séparer cette tâche de la sauvegarde elle-même, car elle est vraiment orthogonale. Bien sûr, utilisez rsync pour la synchronisation, sans l'option --delete pour ne pas perdre de données sur le grand disque externe. Donc, votre command pour cela pourrait être:

 rsync -av /backups/data /mnt/external 

si le lecteur externe est monté sur l'ordinateur portable. Sinon, vous devrez le faire sur le réseau comme ceci:

 rsync -av /backups/data user@external:/backups/data 

Si vous souhaitez nettoyer les archives de plus de 90 jours à partir de votre ordinateur portable, vous pouvez le faire comme ceci:

 find /path/to/files -type f -mtime +90 -delete 

Encore une fois, mettez ces choses dans votre crontab.

Sauvegardes incrémentielles avec rsync

Vous pouvez utiliser rsync seul pour sauvegarder de manière incrémentielle les éléments. J'aime particulièrement utiliser des snapshots horodatés et des liens durs pour cela, et ce n'est qu'une command. Voici un exemple proche de ce que j'utilise normalement:

 rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/`date --iso-8601 -d "one day ago"` /data/ /backups/data/`date --iso-8601`/ 

qui crée essentiellement des liens vers l'instantané du jour précédent (celui donné par --link-dest ) pour les files qui n'ont pas changé. Si vous exécutez de manière irrégulière, vous pouvez utiliser un lien symbolique qui pointe vers le dernier instantané et mettre à jour ce lien après la sauvegarde, comme suit:

 rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/last /data/ /backups/data/`date --iso-8601`/ && rm -rvf /backups/data/last && ln -vs /backups/data/`date --iso-8601`/ /backups/data/last 

En plus de cela, vous devrez organiser la synchronisation avec le lecteur externe et supprimer les anciens snapshots. Ceci est généralement fait de la même manière que dans la première solution décrite ci-dessus. Toutefois, lors de la synchronisation des snapshots entre les machines, assurez-vous d'utiliser les options -H pour conserver les liens physiques.

Résumé

Comparé à la solution utilisant le tar , le second dans mon esprit est un peu plus simple à gérer et a tous les files disponibles à tout moment. En revanche, l'utilisation d'archives fait appel à la compression, utilise less d'inodes et a d'autres avantages sur les machines autres que les servers.

Encore une fois, faites tout cela dans crontab chaque fois que possible, afin que vous n'ayez pas à vous en souvenir. Si vous n'avez pas toujours l'ordinateur allumé, choisissez un moment où il est souvent utilisé, et peut-être plusieurs fois par jour, afin qu'au less certains des travaux cron commencent. Mieux encore, utilisez quelque chose comme l' anacron .

Vous pouvez également exécuter le script de sauvegarde à la main et affiner les dates dans les noms de files / directorys si vous souhaitez effectuer des incréments plus d'une fois par jour. Évidemment, vous devrez jouer avec ces solutions pour les adapter à votre cas d'utilisation. J'espère que cela t'aides.

Mise à jour : un aperçu avec un exemple de script: https://gist.github.com/langner/401bd43e3f0f04228460