web-dev-qa-db-fra.com

Solution de sauvegarde simple

Je recherche un script/package de sauvegarde très basique pour un répertoire sur mon serveur Ubuntu. Actuellement, j'utilise un cronjob comme ceci:

0 5 * * 1 Sudo tar -Pzcf /var/backups/home.tgz /home/

Mais je veux une solution qui ajoute un horodatage au nom du fichier et ne remplace pas les anciennes sauvegardes. Bien entendu, cela va inonder lentement mon lecteur, de sorte que les anciennes sauvegardes (par exemple, antérieures à 2 mois) doivent être supprimées automatiquement.

À la vôtre, Dennis


PDATE: J'ai décidé de donner la prime à la solution logrotate- à cause de sa simplicité. Mais merci également à tous les autres intervenants!

6
wottpal

Solution simple en utilisant logrotate

Si vous voulez que cela reste simple et sans script, restez simplement avec votre travail actuel et configurez en plus une règle logrotate pour cela.

Pour ce faire, placez ce qui suit dans un fichier nommé /etc/logrotate.d/backup-home:

/var/backups/home.tgz {
    weekly
    rotate 8
    nocompress
    dateext
}

À partir de maintenant, chaque fois que logrotate s'exécutera (et cela se fera normalement tous les jours à environ 6 h 25), il vérifiera s'il est approprié de le faire pivoter et, si tel est le cas, renommez votre home.tgz en un autre fichier avec un horodatage ajouté. Il en conservera 8 exemplaires, vous aurez donc environ deux mois d’histoire.

Vous pouvez personnaliser l'horodatage à l'aide de l'option dateformat , voir logrotate (8) .

Étant donné que votre travail de sauvegarde est exécuté à 5 heures du matin et que logrotate est exécuté à 6h25, vous devez vous assurer que votre sauvegarde au format tar est bien inférieure à 1 heure et à 25 mètres (je suppose que ce sera beaucoup plus rapide de toute façon).

4
Sebastian Stark

C’est (une variante de) le script que j’utilise (/home/pduck/bup.sh):

#!/usr/bin/env bash

src_dir=/home/pduck
tgt_dir=/tmp/my-backups
mkdir -p $tgt_dir

# current backup directory, e.g. "2017-04-29T13:04:50";
now=$(date +%FT%H:%M:%S) 

# previous backup directory
prev=$(ls $tgt_dir | grep -e '^....-..-..T..:..:..$' | tail -1); 

if [ -z "$prev" ]; then
    # initial backup
    rsync -av --delete $src_dir $tgt_dir/$now/
else
    # incremental backup
    rsync -av --delete --link-dest=$tgt_dir/$prev/ $src_dir $tgt_dir/$now/
fi

exit 0;

Il utilise rsync pour copier localement les fichiers de mon répertoire personnel dans un emplacement de sauvegarde, /tmp/my-backups dans mon cas. En dessous de ce répertoire cible, un répertoire avec l’horodatage actuel est créé, par exemple. /tmp/my-backups/2018-04-29T12:49:42 et au-dessous de ce répertoire, la sauvegarde de ce jour est placée.

Lorsque le script est exécuté à nouveau, il constate qu'il existe déjà un répertoire /tmp/my-backups/2018-04-29T12:49:42 (il sélectionne le "dernier" répertoire qui correspond au modèle d'horodatage). Il exécute ensuite la commande rsync mais cette fois avec le commutateur --link-dest=/tmp/my-backups/2018-04-29T12:49:42/ pour pointer sur la sauvegarde précédente.

C’est le but des sauvegardes incrémentielles:

Avec --link-dest=… rsync ne copie pas les fichiers inchangés par rapport aux fichiers du répertoire link-dest. Au lieu de cela, il crée simplement des liens durs entre le fichier actuel et le fichier précédent.

Lorsque vous exécutez ce script 10 fois, vous obtenez 10 répertoires avec les différents horodatages et chacun contient un instantané des fichiers à ce moment. Vous pouvez parcourir les répertoires et restaurer les fichiers souhaités.

Le nettoyage est également très facile: rm -rf juste le répertoire d’horodatage que vous ne voulez pas garder. Cela ne supprimera pas les fichiers anciens, nouveaux ou inchangés, mais simplement supprimera (décrémentera) les liens physiques. Par exemple, si vous avez trois générations:

  • /tmp/my-backups/2018-04-29T...
  • /tmp/my-backups/2018-04-30T...
  • /tmp/my-backups/2018-05-01T...

et supprimez le 2ème répertoire, puis vous perdez juste l'instantané de ce jour mais les fichiers sont toujours dans le 1er ou le 3ème répertoire (ou les deux) .

J'ai mis un cronjob dans /etc/cron.daily qui se lit comme suit:

#!/bin/sh
/usr/bin/systemd-cat -t backupscript -p info /home/pduck/bup.sh

Nommez ce fichier backup ou quelque chose comme ça, chmod +x le, mais omettez le suffixe .sh (il ne sera pas exécuté ensuite). En raison de /usr/bin/systemd-cat -t backupscript -p info, vous pouvez suivre les progrès via journalctl -t backupscript.

Notez que cette solution rsync requiert que le répertoire cible se trouve sur un système de fichiers ext4 en raison des liens physiques.

5
PerlDuck

Avec une petite modification de votre commande cron, vous pouvez ajouter un horodatage au nom du fichier:

0 5 * * 1 Sudo tar -Pzcf /var/backups/home_$(date "+%Y-%m-%d_%H-%M-%S").tgz /home/

Et en ce qui concerne le nettoyage, j'ai trouvé un script d'une ligne génial ici que j'ai adapté à votre cas:

find . -type f -name 'home_*.tgz' -exec sh -c 'bcp="${1%_*}"; bcp="${bcp#*_}"; [ "$bcp" "<" "$(date +%F -d "60 days ago")" ] && rm "$1"' 0 {} \;

Vous pouvez ajouter la commande ci-dessus à un autre travail cron qui supprimera les sauvegardes de plus de 60 jours. HTH

3
Eskander Bejaoui

Voici une partie de la solution de mon script de sauvegarde quotidien appelé par cron: Sauvegarde de la configuration Linux, des scripts et des documents sur Gmail . Le script complet est approprié car:

  • il inclut des fichiers /home/me/* ciblés mais ignore 1 Go de fichiers /home/ importants pour vous utilisés par FireFox, Chrome et d'autres applications que je n'ai aucun intérêt à sauvegarder.
  • cela inclut des fichiers importants pour moi mais qui ne vous importent pas dans /etc/cron*, /etc/system*, /lib/systemd/system-sleep, /etc/rc.local, /boot/grub, /usr/share/plymouth, /etc/apt/trusted.gpg, etc.
  • il envoie la sauvegarde tous les matins à mon compte gmail.com pour des sauvegardes hors site. Vos sauvegardes ne sont pas seulement sur site mais également sur le même ordinateur.

Voici le script pertinent, des parties de celui que vous pourriez adapter:

#!/bin/sh
#
# NAME: daily-backup
# DESC: A .tar backup file is created, emailed and removed.
# DATE: Nov 25, 2017.
# CALL: WSL or Ubuntu calls from /etc/cron.daily/daily-backup
# PARM: No parameters but /etc/ssmtp/ssmtp.conf must be setup

# NOTE: Backup file name contains machine name + Distro
#       Same script for user with multiple dual boot laptops
#       Single machine should remove $HOSTNAME from name
#       Single distribution should remove $Distro

sleep 30 # Wait 30 seconds after boot

# Running under WSL (Windows Subsystem for Ubuntu)?
if cat /proc/version | grep Microsoft; then
    Distro="WSL"
else
    Distro="Ubuntu"
fi

today=$( date +%Y-%m-%d-%A )
/mnt/e/bin/daily-backup.sh Daily-$(hostname)-$Distro-backup-$today

Mon compte gmail.com étant rempli à 35% (sur 15 Go), mes sauvegardes quotidiennes peuvent être exécutées pendant un certain temps avant que je ne doive supprimer des fichiers. Mais au lieu d’une philosophie "tout ce qui est plus vieux que xxx", je vais utiliser une stratégie grand-père-père-fils, comme indiqué ci-dessous: Est-il nécessaire de conserver des enregistrements de mes sauvegardes? . En résumé:

  • Du lundi au dimanche (sauvegardes quotidiennes) qui sont purgés après 14 jours
  • Les sauvegardes du dimanche (sauvegardes hebdomadaires) sont purgées après 8 semaines
  • Sauvegardes du dernier jour du mois (sauvegardes mensuelles) purgées après 18 mois
  • Sauvegardes du dernier jour de l'année (sauvegardes annuelles) conservées pour toujours

Mon processus de purge sera compliqué par le fait que je devrai apprendre Python et installer une bibliothèque Python pour gérer les dossiers Gmail.

Si vous ne voulez pas de sauvegardes générationnelles et que vous voulez purger les fichiers de plus de 2 mois, cette réponse vous aidera: Ne pas supprimer les fichiers dans les dossiers via le script bash .

En résumé:

DAYS_TO_KEEP=60
find $BACKUP_DIR -maxdepth 1 -mtime +"$DAYS_TO_KEEP" -exec rm -rf {} \;
3
WinEunuuchs2Unix