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

Achtung! sudo: In dieser Anleitung verdeutlicht der Befehl sudo, dass die folgende Codezeile mit Root-Rechten ausgeführt werden muss. In normalen Ubuntu Installationen (Root-/VServer siehe Debian) kann dies durch den Befehl sudo erreicht werden.
Bei Debian wird bei der Installation ein Passwort für den Root-Benutzer festgelegt, so kann man sich entweder direkt als Root oder als „normaler“ Benutzer mit Eingabe von su als Root einloggen (Root-Passwort benötigt) → sudo bleibt dann überflüssig!

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

Zur Bereitstellung eines bestmöglichen Angebots setzt diese Webseite Cookies ein. Durch die Nutzung dieser Webseite erklären Sie sich mit der Verwendung von Cookies einverstanden. Weitere Informationen

Diskussion

Geben Sie Ihren Kommentar ein. Wiki-Syntax ist zugelassen:
Y K P C H