Sauvegardes

Commande rsync

Mon système de sauvegarde est un simple script rsync qui copie les dossiers importants de mon $HOME vers un SSD monté sur /media/backup/ avec des options pour sauvegarder les fichiers écrasés à part dans des dossier datés.

#!/bin/sh
date=`date "+%Y%m%d-%H%M%S"`
name=`uname -n`
# Attention au /
SOURCE_DIR=/home/guilhem/
MOUNT_POINT=/media/backup
TARGET_DIR=$MOUNT_POINT/guilhem
INCDIR="${MOUNT_POINT=}/backup/"
BACKUP_DIR="$INCDIR/$(date +%F_%H-%M-%S)"

echo "BACKUP_DIR is $BACKUP_DIR"
echo "SOURCE_DIR is $SOURCE_DIR"
echo "TARGET_DIR is $TARGET_DIR"

uuid=`findmnt -n --target $TARGET_DIR -o UUID`
LOGLINE="$date : save $name on $uuid"

if mountpoint -q "$MOUNT_POINT"; then
    echo "$MOUNT_POINT is already a mountpoint"
else
    echo "$MOUNT_POINT is not a mountpoint please mount the drive and restart the backup."
    exit
fi


echo $LOGLINE >> $LOGFILE
mkdir -p $TARGET_DIR
mkdir -p $INCDIR

La commande rsync:

  # Rsync options used:
  # --devices #preserve device files
  # --specials #preserve special files
  # --links  #copy symlinks as symlinks
  # --times  #preserve modification times
  # --one-file-system  #don't cross filesystem boundaries
  # --hard-links #preserve hard-links
  # --human-readable  # output in human-readable numbers
  # --inplace  # update detination files in-place
  # --partial  #keep partially transferred files
  # --progress  #show progress during transfer
  # --delete-excluded  #delete exluded files from destination
  # --backup # save deleted and pre-existing files in --backup-dir
rsync\
  --recursive\
  --devices\
  --specials\
  --links\
  --times\
  --one-file-system\
  --hard-links\
  --human-readable\
  --inplace\
  --partial\
  --progress\
  --backup\
  --backup-dir=$BACKUP_DIR\
  --delete-excluded\
  --include='.'\
  --include='research/***'\
  --include='perso/***'\
  --include='documents/***'\
  --include='.zotero/***'\
  --include='.thunderbird/***'\
  --include='.dotfiles/***'\
  --include='music/***'\
  --include='pictures/***'\
  --include='sync/***'\
  --include=''\
  --exclude='*'\
  $SOURCE_DIR $TARGET_DIR

  if [ $? -eq 0 ]; then
    echo "Backup success"   
fi
echo "Backup script finished"

Fichiers de configuration avec Gnu Stow

Les fichiers de configuration auxquels je tiens sont tous enregistrés dans ~/.dotfile/ et je créé des liens symboliques vers leur destination en utilisant GNU Stow . Le dossier est sous contrôle de version avec git et je maintiens une branche par machine.

Le principe est simple, dans dotfiles il y a un certain nombre de dossiers qui correspondent chacun à un ensemble cohérent de fichiers de configurations.

Par exemple, le dossier mpd contient la configuration de mon lecteur de musique et son client ncmpcpp .

mpd
└── dot-config
    ├── mpd
    │   ├── database
    │   └── mpd.conf
    └── ncmpcpp
        └── config

Quand stow est invoqué, il créé des liens symboliques en remplaçant le préfixe dot- par un point.

Ainsi stow --dotfiles mpd va créer les liens suivants:
~/.config/mpd -> ~/.dotfiles/dot-config/mpd
~/.config/ncmpcpp/config -> ~/.dotfiles/dot-config/ncmpcpp/config # (car .config/ncmpcpp/error.log existe déjà).

J'utilise les commandes suivantes pour appliquer Stow a tout les dossiers:

abbr stow-mock "cd ~/.dotfiles && stow -n -R --dotfiles --verbose=1 *"
abbr stow-dotfiles "cd ~/.dotfiles && stow -R --dotfiles --verbose=1 *"
abbr stow-remove "cd ~/.dotfiles && stow -D --dotfiles --verbose=1 *" 

Comme je ne souhaite pas utiliser de serveur tiers pour stocker mes fichiers de configuration, je bundle le dépôt git quand je le modifie, et le clone depuis le bundle sur mes nouvelles machines.

abbr stow-save cd ~/.dotfiles/ && git bundle create ~/sync/.dotfiles.git.bundle --all

Ce que j'aimerais améliorer

J'aimerais avoir un système pour garder une trace du contenu de mes disques durs externes. J'en ai 3 ou 4 et je prends un peu toujours le premier qui me tombe sous la main pour faire mes sauvegardes. Il faudrait que je regarde les outis du type gocatcli . Pour le moment je sauvegarde juste le nom de la machine, la date et l'uuid du disque dans un fichier de log, synchronisé entre machines.