Comme tout le monde, les sauvegardes j'y pense que lorsque j'ai un soucis. J'ai donc voulu me concocter un petite bidouille pour sauvegarder automatiquement mes documents ($HOME) sur un disque externe. Pour que mes données restent un brin protégées, j'ai choisi d'utiliser une partition cryptée (mots de passe, clés ssh et PGP, ...). Lorsque je branche mon disque, une fenêtre apparaît pour me demander la clé de décryptage, et je confirme si je veux ou non synchroniser les données.

1) Créer la partition

Perso, j'utilise gparted. Noter le device (ex: /dev/sdb2).

Sinon, pour voir la liste des disques et des partitions:

 $ df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda5             6.3G  4.2G  1.9G  70% /
/dev/sda3              73G   39G   30G  57% /data
/dev/sdb1              68G   58G   11G  85% /media/EXT
/dev/sdb2              24G   6.1G   18G  25% /media/disk
/dev/mapper/home       25G   14G  9.6G  59% /home

2) Créer le système de fichier crypté

Installer le paquet cryptsetup

sudo apt-get install cryptsetup

Lancer le formattage :

sudo luksformat -t ext3 /dev/sdb2

La passphrase doit être un minimum compliquée, mais si on l'oublie les données sont irrécupérables.

Voilà c'est tout ! Vous avez une partition cryptée, quand le disque est branché, le système vous demande la passphrase pour monter la partition.

3) Lancer un script automatiquement lorsque le disque est branché :

Il suffit de créer un fichier autorun.sh à la racine de la partition. Mon script principal est sur le PC et pas sur le disque, donc celui-ci lui fait simplement appel quand la partition est montée :

#! /bin/sh
diskpath=`pwd`
cd ~/.bin
./backup-disk-usb.sh $diskpath

4) Lancer un script de backup rsync avec une barre de progression

En utilisant zenity, on demande la confirmation et on affiche la progression avec des jolies boites de dialogue.

Créer le script ~/.bin/backup-disk-usb.sh, qui s'appuie sur rsync pour la sauvegarde incrémentale :

#! /bin/bash
 
# Get destination from command line
diskpath=$1
 
# Ask confirmation
zenity --question --text="Backup home folder to '$diskpath', confirm ?"
rc=$?
if [ "${rc}" == "1" ]; then
    echo "Backup canceled by user."
    exit 1
fi
 
# Run synchronization
rsync --verbose --progress --archive $HOME $diskpath  |  
     awk -f rsync.awk | 
     zenity --progress --width=400 --auto-close --auto-kill --title "Backing up" --text="Scanning..." --percentage=0
 
# Show popup
zenity --info --title="Backup complete" --text="Backup is now complete."
exit 0

Créer le fichier ~/.bin/rsync.awk pour relier la barre de progression à rsync (Merci à crowdway pour l'astuce).

{
   if (index($0, "to-check=") > 0)
   {
	split($0, pieces, "to-check=");
	term = substr(pieces[2], 0, length(pieces[2])-1);
	split(term, division, "/");
	print (1-(division[1]/division[2]))*100"%"
   }
   else
   {
	print "#"$0;
   }
   fflush();
}

Si aucun fichier n'est modifié entre deux sauvegardes, cela ne prend que quelques secondes...