Backup Simple/Scripte

Aus LOMSO
Wechseln zu: Navigation, Suche
Du bist hier : Warning : Could not determine path to wiki home for Backup Simple/Scripte !
Please check your category settings !


Skript: syncAll.sh

Das Skript sichert eine Liste aller installierten Pakete nach /etc/apt/packageslist/packages.list und eine Liste von Ordnern, die in unterschiedlichen Basisordnern liegen können.

Dieses Skript verwendet rsync. Es kopiert nur die Änderungen und ist daher auch bei sehr großen Datenmengen schnell.

Achtung: neues Script am 13.09.2011 eingestellt.


Änderungen:
- Zielfolderstruktur ist jetzt identisch mit der Quellfolderstruktur
- Logging wurde verbessert
- besser kommentiert
- Änderung 26.12.11: Prüfung auf Existenz, des Targetfolders hinzugefügt,
in if [ ! -d $BACKUP_TO ], in funktion do_sourcefolder()
wenn nicht vorhanden, dann wird dieser angelegt
 
#! /bin/bash

# File 'syncAll.sh'
# Autor: rleofield
# www.rleofield.de
# Sept. 2011

# exclude Beispiele
#.adobe/Flash_Player
#.macromedia 
#.gnupg/log-socket
#.gqview/.command
#.gvfs
#.cache
#.config
#.local/share/gvfs-metadata 
#.local/share/Trash
#.thumbnails
#.dbus
#.local/share/tracker/data

# 'bash' erlaubt keine Multiline Kommentare.
# Multilinekommentare sind als 'here docs' gestaltet.
# http://tldp.org/LDP/abs/html/here-docs.html
# http://www.wiredrevolution.com/bash-programming/multiple-line-comments-in-bash

: << '--COMMENT--'
Dieses Script verwendet 'rsync', um ein Backup wichtiger Folder auf einer externen Festplatte anzufertigen.
Die Folder werden relativ zu einem/mehreren  'Sourcefolder'n angegeben.
Die Folderstruktur im Backup bleibt erhalten.
Nach dem Backup gelöschte Files werden im nachfolgenden Backup in den Folder 'backupbackup' verschoben.
Es wird im Backup nichts automatisch gelöscht.

Ein automatischer Restore ist nicht vorgesehen.
Nach einem HD Ausfall kann man mit der Programmliste (s.u.) schnell ein neues System aufsetzen und
die Daten wieder selektiv mit 'cp -av' oder 'rsync -avS' zurückholen.

Die Backupfolder
 BACKUPHD=/media/elements/hd500
 BACKUPDIR=$BACKUPHD/backup
 BACKUPBACKUPDIR=$BACKUPHD/backupbackup
müssen existieren und für 'root' schreibbar sein.

Der Logfolder (LOGFILE) muss existieren.
z.B. '/var/log/backup' .

Der Folder für die Liste der installierten Programme muss vorhanden sein.
(s.u., mit 'dpkg --get-selections')

Das Script benötigt root-Rechte.
Ist DRY_RUN gesetzt, gibt 'rsync' alle Operationen aus , kopiert aber nichts.


Ausblenden von Foldern und Files im Backup:
mit Exclude Files 'exclude_*'
   (für '*' den jeweiligen Sourcefolder einsetzen, s.u.)

-- Beispiel für Zeilen im 'exclude_user1' File:
.local/share/gvfs-metadata
.compiz
.local/share/gvfs-metadata
.local/share/Trash
.strigi/socket
.thumbnails
.mozilla/firefox/toh3tf4y.default/Cache

--COMMENT--

# mit Kommenarzeichen die nötigen Zeilen für DRY_RUN ein-/ausblenden

# Test mit Kontrollausgabe, es wird nichts kopiert (siehe 'man rsync')
#DRY_RUN=--dry-run
# kein Test, Daten werden kopiert
DRY_RUN=



# Test auf root
# root wird benötigt, um auch Files von anderen Nutzern und die Systemfiles zu kopieren
[[ `id -u` == 0 ]] ||  {
	echo 'Um ein Backup anzufertigen, benötigt man root Rechte (sudo -s)'
exit
	}
# setze das heutige Datum und die Uhrzeit
TODAY=`date +%Y%m%d-%H%M`

# Logfile im vorher angelegten Logfolder
LOGFILE=/var/log/backup/bb_$TODAY.log
echo "Logfile: $LOGFILE"


# setze die Folder für das Backup (müssen auf der externen HD vorhanden sein)
BACKUPHD=/media/hd500
BACKUPDIR=$BACKUPHD/backup
BACKUPBACKUPDIR=$BACKUPHD/backupbackup


# hier die Exclude-Files ablegen
EXCLUDEFILEDIR=/home/richard/bin/backup


line="-------------------------"

echo "Backup externe HD: $BACKUPHD"
echo "Backup Verzeichnis: $BACKUPDIR"
echo "Backup Backup Verzeichnis: $BACKUPBACKUPDIR"

# test, ob der Backup Folder vorhanden ist
if [ ! -d $BACKUPDIR ]
then
	echo "Backup Folder '$BACKUPDIR' ist nicht vorhanden." | tee -a $LOGFILE
	echo "Ist die externe HD gemountet?"
	exit
fi
# test, ob der Backupbackup Folder vorhanden ist
if [ ! -d $BACKUPBACKUPDIR ]
then
	echo "Backup Backup Folder '$BACKUPBACKUPDIR' ist nicht vorhanden." | tee -a $LOGFILE
	echo "Ist die externe HD gemountet?"
	exit
fi


# schreibe Liste aller installierten Pakete auf die HD, wird danach vom Backup mit erfasst
echo "sichere Packageslist -> /etc/apt/packageslist/packages.list" | tee -a $LOGFILE
dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > /etc/apt/packageslist/packages.list
echo "Packageslist gesichert" | tee -a $LOGFILE


# Funktion, die 'rsync' aufruft
function do_sourcefolder(){
	_sourcebase=$1
	_sourcefolder=$2

	# Test, ob 'exlude_*' existiert
	EXCLUDEFILE=$EXCLUDEFILEDIR/exclude_$_sourcefolder
	EXCLUDE=
	if [ -f $EXCLUDEFILE ]
	then
		EXCLUDE=$EXCLUDEFILE
		echo "Exclude-File: $EXCLUDE" | tee -a $LOGFILE
	fi
	slash=/
	FROM=$_sourcebase
	# wenn 'sourcebase' im Root liegt, dann darf 'sourcebase' nicht 'sourcefolder' voran gestellt werden
	if [ $FROM = $slash ]
	then
		echo "FROM ist /"
		FROM=/$_sourcefolder
	else
		FROM=$_sourcebase/$_sourcefolder
	fi

	BACKUP_TO=$BACKUPDIR$FROM
	BACKUP_BACKUP=$BACKUPBACKUPDIR$FROM

	if [ ! -d $BACKUP_TO ]
	then
               echo "mkdir -p $BACKUP_TO" | tee -a $LOGFILE	       
               mkdir -p $BACKUP_TO
	fi
	if [ ! -d $BACKUP_BACKUP ]
	then
               echo "mkdir -p $BACKUP_BACKUP" | tee -a $LOGFILE	       
	       mkdir -p $BACKUP_BACKUP
	fi

	echo "Backup-From   $FROM" | tee -a $LOGFILE
	echo "Backup-To     $BACKUP_TO" | tee -a $LOGFILE
	echo "Backup-Backup $BACKUP_BACKUP" | tee -a $LOGFILE

	OPTIONS=-rlptvgoSAXH

	# siehe 'man rsync'
	# -r, --recursive             recurse into directories
	# -l, --links                 copy symlinks as symlinks
	# -p, --perms                 preserve permissions
	# -t, --times                 preserve modification times
	# -v, --verbose               increase verbosity
	# -g, --group                 preserve group
	# -o, --owner                 preserve owner (super-user only)
	# -X, --xattrs                preserve extended attributes
	# -A, --acls                  preserve ACLs (implies -p)
	# -S, --sparse                handle sparse files efficiently
	# -H, --hard-links            preserve hard links

	echo "rsync $DRY_RUN  $OPTIONS  --delete --exclude-from=$EXCLUDE --backup --backup-dir=$BACKUP_BACKUP $FROM/ $BACKUP_TO/" | tee -a $LOGFILE
	rsync $DRY_RUN $OPTIONS --delete --exclude-from=$EXCLUDE --backup --backup-dir=$BACKUP_BACKUP $FROM/ $BACKUP_TO/ | tee -a $LOGFILE
	echo "Backup $FROM To $BACKUP_TO ok" | tee -a $LOGFILE
}

# Funktion, die die Liste der Sourcefolder abarbeitet und 'do_sourcefolder()' aufruft
function do_sourcefolders(){
	_sourcebase=$1
	_sourcefolders=$2

	echo $line | tee -a $LOGFILE
	cd $_sourcebase
	pwd
	echo "pwd `pwd`" | tee -a $LOGFILE
	echo $line | tee -a $LOGFILE
	#echo "Sourcebase  $_sourcebase" | tee -a $LOGFILE
	#echo "Backup-To     $BACKUP_TO" | tee -a $LOGFILE

	for _sourcefolder in $_sourcefolders
	do
		echo "Sourcebase  $_sourcebase" | tee -a $LOGFILE
		echo "Sourcefolder  $_sourcefolder" | tee -a $LOGFILE
		do_sourcefolder $_sourcebase $_sourcefolder

		echo $line | tee -a $LOGFILE
	done
}

# Hier geht es los


: << '--COMMENT--'
# Beispiel:

folgende Verzeichnisse in / sollen gesichert werden:
(Ausgabe von ls -l / | grep '^d' | awk '{print $8}' )

Beispiel:

bin
boot
cdrom
dev - nicht
etc
home - nicht, wird weiter unten extra kopiert
initrd
lib
lib32
lib64 - nicht, ist ein Link nach lib
media - nicht, hier sind externe HDs
mnt - nicht
nonexistent - nicht, gehoert zu memcache
opt
proc - nicht, virtueller Folder
root
sbin
selinux
srv
sys - nicht, ist dynamisch
tmp - nicht, ist tmp
usr
var
--COMMENT--

# root Folder Backup
SOURCEDIR=/

# anderer Vorschlag, ohne /home:
do_sourcefolders $SOURCEDIR "bin boot etc initrd lib lib32 lib64 opt root sbin selinux srv usr var"


# und noch der /home Folder:
(Ausgabe von ls -l /home | grep '^d' | awk '{print $8}' )

#Beispiel:
#user1
#user2
#user3
#user4

SOURCEDIR=/home
do_sourcefolders $SOURCEDIR "user1 user2 user3 user4"

# usw.

# siehe: http://www.halfgaar.net/backing-up-unix
sync
sleep 2

echo $line | tee -a $LOGFILE
echo "Backup beendet"
echo $line | tee -a $LOGFILE