Um regelmäßige Sicherungskopien meiner wichtigen Konfigurationserzeichnisse zu erstellen habe ich ein kleines Backupscript erstellt. Es ist sehr simpel, erfüllt aber seinen Zweck. Aktuell besitzt das Script folgende Funktionalität:
Nach einer Neuinstallation oder einem Systemcrash lässt mittels dieser Sicherung ein Großteil der Funktionalität des Orignalsystems wiederherstellen. Die KOnfigurationsdaten liegen vor und mittels yaourt kann die Software per Liste installiert werden was viel Zeit spart. Das Script arbeitet mit dem Snapshotverfahren wie man es von Apples timeMachine Backup kennt. Ein schöner Vorteil dieser Lösung ist der effiziente Verbrauch an Speicherplatz. HIerzu arbeitet rsync mit Hardlinks. Das Script verlinkt alle unveränderte Dateien in den aktuellen Backupordner und kopiert neue und veränderte Dateien hinzu. So kann zu jedem Snapshot gesprungen und der Speicherzuwachs entspricht immer den neuen oder veränderten Dateien. Das Script ist bei weitem nicht vollständig, soll aber erweitert werden um zum Beispiel Pfade interaktiv einzugeben, Konfiguration aus einer Datei einlesen oder das Skript mit Eingabeparametern zu starten. Um das Backup und Restore weiter zu vereinfachen ist auch ein Restorescript geplant.
#!/bin/bash
echo -e "#####################################
# Welcome to my backup script #
# for private purposes. The #
# script backups the home config #
# dirs and a software list of #
# pacman and yaourt #
#####################################\n\n"
#echo -e "# THE FIRST THING TO DO IS TO SPECIFY THE BACKUP DESTINATION #" # Define the backup location
#read -e -p "backup path:" bak_dest
#echo -e "\n\n# IS THIS THE CORRECT PATH TO STORE YOURE BACKUP? #"
#echo $bak_dest
#read -p "# PRESS ENTER TO CONFIRM... #"
####################
# define variables #
####################
volume="/media/backintime_nas"
bak_dest=/media/backintime_nas/micha_bak/ # hardcoded path
heute=$(date +%Y-%m-%d_%H-%M-%S) # date variable
bak_source='/home/micha/' # pathn to backup directory
declare -a bak_directories=('.[^.]*') # Define only hidden files and folders to backup
bak_items=("${bak_directories[@]/#/$bak_source}") # Put directory name and path together
bak_allitems=${bak_items[@]} # full path is goin into an array so we can iterate through
#-----------------------------------------------------------------------------------------------------------------------------------------------------------
echo -e "##############################################
# check if backup destination aleady mounted #
##############################################"
sleep 3
if mount|grep $volume; then # check if destination is already mounted
echo "mounted"
else
mount /media/backintime_nas
fi
#-----------------------------------------------------------------------------------------------------------------------------------------------------------
echo -e "\n\n###################
# do the backup #
###################"
sleep 3
rsync -avzh --delete ${bak_allitems} ${bak_dest}${heute} --link-dest="${bak_dest}last/" # start the backup with hard links to save time and space
# a = archive; v = verbose; z = compress during transfer; h = human readable; P = progress (not human)
rm -rf ${bak_dest}last # Delete the reference to latest backup
ln -s "${bak_dest}${heute}" "${bak_dest}last" # Actualize and point the new softlink to the last backup
#-----------------------------------------------------------------------------------------------------------------------------------------------------------
echo -e "\n\n###############################
# SAVING THE PACMAN DATABASE #
###############################"
sleep 3
tar -cjf ${bak_dest}${heute}/pacman_database.tar.bz2 /var/lib/pacman/local # Backup the pacman database
#-----------------------------------------------------------------------------------------------------------------------------------------------------------
echo -e "\n\n#################################
# NOW GENERATE THE PACMAN LISTS #
#################################"
sleep 3
pacman -Qqe | grep -v "(pacman -Qqm)" > ${bak_dest}${heute}/amiga_$(date +%F)_pkglist-off.txt # Save installed software list