Nachdem ich vor kurzem meinen kleinen Ubuntu-Heimserver komplett neu aufgespielt habe, habe ich mich u.a. mit den notwendigen Backups eines solchen Systems auseinandergesetzt. Nachdem ich im Internet nirgendwo einr 100% Lösung für meine Backup-Wünsche gefunden habe, habe ich mit einigen Scripten rumgespielt und daraus folgendes Backup-Script erstellt.

Die Anforderungen im Einzelnen:

  • Ausführbares Backup-Script welches auch als cronjob läuft (1 mal wöchentlich)
  • Da der Backupordner bei mir in der Ordnerstruktur so liegt, dass andere Teile des Ordners im Backup enthalten sein sollen, soll der Backup-Ordner vom Backup ausgeschlossen werden.
  • Backup soll gepackt und anschließend direkt an einen FTP-Server übermittelt werden

Zu beginn logge ich mich auf meinem Server in meinen Admin-Account ein und erstelle mir erstmal ein .sh-File

sudo nano backup.sh

Dies erstellt mir gleich die Datei mit und benennt sie auch gleich richtig. Die Datei liegt dann unter /home/ADMINISTRATOR/backup.sh

Zu den Einstellungen der Backup-Datei komme ich später noch, hier erstmal der Inhalt: Zeilen die mit # beginnen sind auskommentiert und dienen dem Programmierer nur zur Erläuterung sie haben auf den Programmablauf keinen Einfluss.

#!/bin/sh
####################################
#
# Sebaier’s Backup-Script
# inkl Übertragung an FTP-Server
#
# Name        – backup-script
# Version    – 0.1
#
# Autor    – sebaier
#
###################################

# Was gesichert werden soll.
# Angabe mehrerer Verzeichnisse möglich mit Leerzeichen (Bsp. „/home /var /etc“)
backup_files=“HIER ORDNER ANGEBEN“

# Wo es gesichert werden soll
dest=“HIER ZIELVERZEICHNIS ANGEBEN“

# Dateinamen
datum=$(date +%Y-%m-%d_%H-%M-%S)
hostname=$(hostname -s)
archive_file=“$hostname-$datum.tar.gz“

# FTP-Zugangsdaten
server_ip=“HIER IP ODER DOMAIN ANGEBEN“
server_user=“HIER DEN FTP-BENUTZERNAMEN EINTRAGEN“
server_password=“HIER DAS FTP-PASSWORT EINTRAGEN“
server_dir=“HIER DAS SERVERVERZEICHNIS EINTRAGEN“

# Ab hier beginnt das Backup-Script.

# Ausgabe des Speichervorgangs.
echo „——————————————————–“
echo
echo „Erstelle das Backup der Ordner“
echo “ $backup_files“
echo „unter“
echo “ $dest/$archive_file“
echo
date
echo „——————————————————–“
sleep 5

# Backup erstellen mit tar.
tar -czpf $dest/$archive_file $backup_files –exclude=“Backup“

# Ausgabe der Fertigstellung des Backups.
echo
echo „Backup vollständig“
date
echo „——————————————————–“
echo

# Ausgabe des $dest Ordners um Dateigröße zu überprüfen.
ls -lh $dest
echo
sleep 5

# Datei auf FTP-Server $server_ip sichern
echo „Die Datei wird nun an den FTP-Server übertragen“
echo „——————————————————–“
echo „FTP-Server:        $server_ip“
echo „FTP-User:        $server_user“
echo „FTP-Passwort:        *************“
echo
echo „Ziel:            /$archive_file“
echo „——————————————————–“
echo

ftp -n $server_ip <<INPUT_END
quote USER $server_user
quote PASS $server_password
cd $REMOTEPATH
prompt on
put $dest/$archive_file $server_dir/$archive_file
exit
INPUT_END

echo
echo „Übertragung abgeschlossen“
date
echo „——————————————————–“
echo
sleep 5

# Verabschiedung
echo
echo „Vielen Dank und bis zum nächsten Mal.“
echo
sleep 5

So um es nun dem einen oder anderen verständlich zu machen was ich da eigentlich gemacht habe erkläre ich die einzelnen Abschnitte ein wenig

# Was gesichert werden soll.
# Angabe mehrerer Verzeichnisse möglich mit Leerzeichen (Bsp. “/home /var /etc”)
backup_files=”HIER ORDNER ANGEBEN”

Hier wird unter dem Begriff backup_files definiert welche Orte gespeichert werden sollen. Ich gebe zur Sicherheit absolute Pfadangaben an obwohl es theoretisch auch mit relativen klappen sollte. (vgl. /var mit var)

# Wo es gesichert werden soll
dest=”HIER ZIELVERZEICHNIS ANGEBEN”

Hier kommt die absolute Pfadangabe zum Speicherort des Backups hin. (z.B. /var/backup)

# Dateinamen
datum=$(date +%Y-%m-%d_%H-%M-%S)
hostname=$(hostname -s)
archive_file=”$hostname-$datum.tar.gz”

Später soll die Datei ja auch einen Dateinamen bekommen. Dafür lege ich die Variablen datum, hostname und archive_file fest. Das Datum erscheint später im Format JJJJ-MM-TT_SS-mm-ss (J=Jahr M=Monat T=Tag S=Stunde m=Minute s=Sekunde)

Der Hostname ist der Name des Rechners in Kurzform (-s)

archive_file besteht dann letztendlich aus dem Hostnamen und dem Datum mit der Endung .tar.gz

# FTP-Zugangsdaten
server_ip=”HIER IP ODER DOMAIN ANGEBEN”
server_user=”HIER DEN FTP-BENUTZERNAMEN EINTRAGEN”
server_password=”HIER DAS FTP-PASSWORT EINTRAGEN”
server_dir=”HIER DAS SERVERVERZEICHNIS EINTRAGEN”

In diesem Abschnitt wird dann der FTP-Zugang konfiguriert. Die Felder sind somit eigentlich selbsterklärend.

Ab jetzt beginnt dann das eigentlich Backup – bisher haben wir bestimmte Begriffe innerhalb unseres Programmes definiert.

# Ausgabe des Speichervorgangs.
echo “——————————————————–”
echo
echo “Erstelle das Backup der Ordner”
echo ” $backup_files”
echo “unter”
echo ” $dest/$archive_file”
echo
date
echo “——————————————————–”
sleep 5

Obgleich das Script später als cronjob ausgeführt werden soll kann man es auch manuell starten und möchte vielleicht wissen was gerade passiert. Für das eigentlich Backup ist es jedoch nicht ausschlaggegend und kann wenn gewünscht mit # zu beginn der Zeile auskommentiert werden.

# Backup erstellen mit tar.
tar -czpf $dest/$archive_file $backup_files –exclude=”Backup”

hier wird mit dem Programm tar das Backup erstellt. Über die vorher definierten Programmbestandteile erhalten wir hier also unseren Zielordner ($dest) in den das fertige Backup ($archive_file) kommt. Dieses besteht aus den gewünschten Ordner ($backup_files). Über –exclude kann man einzelne Ordner vom Backup ausschließen. In diesem Fall heißt mein fertiger Backupordner „Backup“ und damit die alten Backups nicht in das neue Backup gepackt werden schließe ich diesen Ordner aus. Die Angabe hierzu erfolgt als reiner Ordnername, alle Ordner mit dem Namen Backup werden somit ausgeschlosen.

# Ausgabe der Fertigstellung des Backups.
echo
echo “Backup vollständig”
date
echo “——————————————————–”
echo

# Ausgabe des $dest Ordners um Dateigröße zu überprüfen.
ls -lh $dest
echo
sleep 5

# Datei auf FTP-Server $server_ip sichern
echo “Die Datei wird nun an den FTP-Server übertragen”
echo “——————————————————–”
echo “FTP-Server:        $server_ip”
echo “FTP-User:        $server_user”
echo “FTP-Passwort:        *************”
echo
echo “Ziel:            /$archive_file”
echo “——————————————————–”
echo

Auch dieser Teil ist wieder nur für die Bildschirmausgabe relevant und kann auskommentiert werden.

ftp -n $server_ip <<INPUT_END
quote USER $server_user
quote PASS $server_password
cd $REMOTEPATH
prompt on
put $dest/$archive_file $server_dir/$archive_file
exit
INPUT_END

echo
echo “Übertragung abgeschlossen”
date
echo “——————————————————–”
echo
sleep 5

# Verabschiedung
echo
echo “Vielen Dank und bis zum nächsten Mal.”
echo
sleep 5

Zum Schluß wird das fertige Backupfile an unseren FTP-Server übertragen. Mit dem Programm ftp bauen wir über die definierten Pararmeter die Verbindung zum Server auf. (Sollte keine Übertragung zu einem FTP-Server gewünscht sein, kann man diese Zeilen getrost auskommentieren.) Hinterher bekommen wir die Meldung, dass die Übertragung fertig ist und werden vom Programm verabschiedet.

So unser Script ist erstmal fertig. Wir speichern und schließen nano und können das Script direkt testen mit

sudo bash backup.sh

Je nach Größe der Ordner und Verbindungsgeschwindigkeit zum Internet kann dies eine Weile dauern.

Zum Schluß wollen wir noch, dass das Script vom System selbstständig und regelmäßig ausgeführt wird. Beim Dauerbetrieb eines Servers wäre cron die richtige Wahl dazu. Für einen Heimserver der nicht rund um die Uhr läuft habe ich mich für Anacron entschieden. Ich erstelle also eine Kopie in den Ordner /etc/cron.weekly mittels

sudo cp /home/ADMINISTRATOR/backup.sh /etc/cron.weekly/backup

und mache zum Schluß die neue Datei ausführbar mit

sudo chmod u+x /etc/cron.weekly/backup

Somit wird einmal in der Woche das Script automatisch ausgeführt.

ACHTUNG WICHTIG: Programme die in einem der cron.* Ordner ausgeführt werden sollen dürfen u.a keine Punkte enthalten. Hier der Auszug aus dem manual

run-parts  führt  alle  ausführbaren Dateien im Verzeichnis Verzeichnis aus, wobei die Namen den unten  beschriebenen  Randbedingungen  genügen müssen.  Andere Dateien und Verzeichnisse werden ohne Rückmeldung ignoriert.

Falls weder die Option »–lsbsysinit« noch die Option »–regex« angegeben  werden, dann mssen die Namen komplett aus ASCII-Groß- und -Kleinbuchstaben, ASCII-Ziffern, ASCII-Unterstrichen  und  ASCII-Minuszeichen bestehen.

Wer sich noch mehr mit der Materie befassen möchte, dem sei http://wiki.ubuntuusers.de empfohlen.

Email this to someoneShare on Facebook0Share on Google+0Tweet about this on TwitterShare on LinkedIn0