Backup Simple/Scripte
Zur Navigation springen
Zur Suche springen
| Du bist hier : | {{#youAreHere:Backup Simple/Scripte}} |
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