Inhaltsverzeichnis
Backupskripte
Die folgenden drei Skripte können eine rund-um Backuplösung bilden. Diese besteht aus einem Backup von wichtigen Verzeichnissen, Paketlisten und MySQL-Dumbs. Dazu müssen alle drei Skripte richtig konfiguriert und angepasst werden. Wie du mit dem Code der Skripte umgehen musst, erfährst Erklärungen findest du unter Cron und Shell-Skripte.
Softwarevoraussetzungen: Paketverwaltung | Texteditor | evtl. Mailserver | Cron
Schwierigkeitsgrad: Mittel
Ausgetestet mit folgenden Betriebssystemen: Ubuntu | Debian | teilweise auch andere Distributionen
Einfaches Backupskript
Von ubuntuusers.de
Mit diesem einfachen Skript kann man durch Cron automatisierte Backups durchführen, indem man es regelmäßig von Cron ausführen lässt. Das Skript kopiert immer nur die veränderten Dateien, der Rest wird mit Hardlinks verlinkt.
Eine ausführlichere Beschreibung der Konfiguration findet man ubuntuusers.de. Hier wird lediglich die Einrichtung beschrieben.
Benötigte Pakete
Benötigt wird zusätzlich noch das Paket rsync
:
user@server:~$ sudo apt-get install rsync
Abspeichern und ausführbar machen
Dieses Skript muss irgendwo im Dateisystem unter beliebigen Namen abgespeichert werden (hier: backup_rsync
), dazu erstellt man mit nano diese Datei:
user@server:~$ mkdir ~/bin # Anlegen eines Skriptordners user@server:~$ touch ~/bin/backup_rsync # Anlegen des Skriptes
Anschließend muss es ausführbar gemacht werden:
user@server:~$ chmod +x ~/bin/backup_rsync # ausführbar machen
Inhalt des Skriptes
Anschließend öffnet man das Skript:
user@server:~$ nano ~/bin/backup_rsync # Öffnen des Skriptes
….und fügt diesen Code ein:
- backup_rsync
#!/bin/bash # Simple backup with rsync # SOURCES and TARGET must end with slash SOURCES="/was/soll/gesichert/werden1?/ /was/soll/gesichert/werden2?/ (...)" TARGET="/Ziel/der/Backups/(wo_sollen_die_Backups_hin?/" MOUNTPOINT="" LOGFILE="/wo_soll_die_Logadatei_hin?" EXPIREDAYS=0 RSYNC="--delete" #falls via ssh hier Benutzer, Hostname und Port eintragen #SSHUSER="user" #SSHHOST="hostname" #SSHPORT=22 ### do not edit ### /bin/date > $LOGFILE MOUNTED=$(/bin/mount | /bin/fgrep "$MOUNTPOINT"); if [ -z "$MOUNTPOINT" ] || [ -n "$MOUNTED" ]; then if [ -e $TARGET ]; then LASTBACKUP=$(/bin/ls -d $TARGET[[:digit:]]* 2>> $LOGFILE | /usr/bin/sort -r | /usr/bin/head -1) fi TODAY=$(/bin/date +%y%m%d) if [ $EXPIREDAYS -gt 0 ]; then EXPIRED=$(/usr/bin/find $TARGET[[:digit:]]* -maxdepth 0 -ctime +$EXPIREDAYS 2>> $LOGFILE) for EX in $(/bin/echo $EXPIRED) do /bin/echo "rm -rf $EX " >> $LOGFILE /bin/rm -rf $EX\\ done fi for SOURCE in $(/bin/echo $SOURCES) do if [ "$LASTBACKUP" ]; then INC="--link-dest=$LASTBACKUP$SOURCE" fi if [ "$SSHUSER" ] && [ "$SSHHOST" ] && [ "$SSHPORT" ]; then SSH="ssh -p $SSHPORT -l $SSHUSER"; SOURCEDIR="$SSHHOST:$SOURCE"; else SOURCEDIR=$SOURCE; fi /bin/mkdir -p $TARGET$TODAY$SOURCE >> $LOGFILE echo "/usr/bin/rsync -e \"$SSH\" -av $SOURCEDIR $RSYNC $INC $TARGET$TODAY$SOURCE " >> $LOGFILE 2>> $LOGFILE; /usr/bin/rsync -e "$SSH" -av $SOURCEDIR $RSYNC $INC $TARGET$TODAY$SOURCE >> $LOGFILE 2>> $LOGFILE; done else /bin/echo "$MOUNTPOINT not mounted" >> $LOGFILE fi
Konfiguration
Danach sollte man noch die Pfade Target
und Sources
, sowie die weiteren Einstellungen, wie im Skript kommentiert bearbeiten.
Beispiel
Beispiel zum Sichern von /var/www
und /home/user
nach /var/backups
, wobei /home/user/test
ausgelassen werden soll (Ausschnitt der Config):
#!/bin/bash # Simple backup with rsync # SOURCES and TARGET must end with slash SOURCES="/var/www/ /home/user/" TARGET="/var/backups/" MOUNTPOINT="" LOGFILE="/var/log/backup.log" EXPIREDAYS=0 RSYNC="--delete --exclude=test/" # Auslassen von /home/user/test #SSHUSER="user" #SSHHOST="hostname" #SSHPORT=22 ### do not edit ### (..)
Wenn das Backup auf ein externes Medium erfolgen soll, dass nicht immer zuverlässig gemountet wird, ist es ratsam die Option MOUNTPOINT=„“
auf den Mountpoint (siehe Mounten) dieses Mediums zu setzen:
MOUNTPOINT="/media/test" #Beispiel mit dem Mountpoint /media/test
In Cron ausführen
Zum Schluss muss das Skript noch regelmäßig durch Cron ausgeführt werden.
user@server:~$ sudo crontab -e # Crontab von root editieren
Ein- oder zweimal täglich ist ein guter Ansatz (hier um 08:01 und 14:01 Uhr):
01 08,14 * * * /home/user/bin/backup_rsync # /home/user durch Pfad zum Homeverzeichnis ersetzen (root: /root; andere Benutzer: user durch Benutzername ersetzen)
Achtung: Wenn die beiden anderen Skripte eingesetzt werden, muss dieses Skript vor den beiden anderen ausgeführt werden! Die anderen Skripte warten darauf, bis dies gestartet wurde.
Grund: Wenn die anderen Skripte früher ausgeführt werden, legen diese den Tagesordner bereits an → es entstehen keine Hardlinks.
Paketlisten speichern
Dieses Skript, dass sich vollkommen auf die beiden oberen Skripte stützt, speichert so oft man es ausführt eine Liste mit den installierten Paketen.
Abspeichern und ausführbar machen
Dieses Skript muss irgendwo im Dateisystem unter beliebigen Namen abgespeichert werden (hier: backup_pks
), dazu erstellt man mit nano diese Datei:
user@server:~$ touch ~/bin/backup_pks # Anlegen des Skriptes
Anschließend muss es ausführbar gemacht werden:
user@server:~$ chmod +x ~/bin/backup_pks # ausführbar machen
Inhalt des Skriptes
Anschließend öffnet man das Skript:
user@server:~$ nano ~/bin/backup_pks # Öffnen des Skriptes
….und entscheidet sich für einen der Beiden Skripte:
a) Zusammenarbeit mit den oberen
Diese Version des Skriptes ist bereits an die oberen beiden angepasst:
- backup_pks
#!/bin/bash #Pfad zum Backup path="/var/backup/$(date +%y%m%d)" #Name der datei name="packages.list" # zurück setzen: xargs -a "packages.list" sudo apt-get install if test -d $path; then sudo dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > $path/$name else exit 0 fi
b) frei Verwenden/ keine Zusammenarbeit
Um das Skript ohne oben genannte einzusetzen, würde das Ganze so aussehen:
- backup_pks
#!/bin/bash # Pfad zum Backup path="/var/backup/$(date +%y%m%d)" # Name der Datei name="packages.list" # zurück setzen: xargs -a "packages.list" sudo apt-get install if test -d $path; then sudo dpkg --get-selections | awk '!/deinstall|purge|hold/ {print $1}' > $path/$name else mkdir $path fi
In Cron ausführen
Zum Schluss muss das Skript noch regelmäßig durch Cron ausgeführt werden.
user@server:~$ sudo crontab -e # Crontab von root editieren
Am Besten alle 4 Stunden ausführen:
0 */4 * * * /home/user/bin/backup_pks # /home/user durch Pfad zum Homeverzeichnis ersetzen (root: /root; andere Benutzer: user durch Benutzername ersetzen
— chrisge 2018/05/26 01:10