Ein Update- und Backup-System für die Raspberry Pi einrichten mit dem Raspbian (Jessie) Stand: 28.12.2016 Inhalt 1. Einleitung... 1 2. Automatische Updates und Upgrades... 2 2.1 Das Skript mit den Update-Befehlen... 2 2.2 Update-Skript regelmäßig im Crontab ausführen... 2 3. Ein automatisches Backup eines Verzeichnisses regelmäßig erstellen... 4 3.1 Einen USB-Stick für die Backups mounten... 4 3.2 Das Skript mit den Backup-Befehlen... 6 3.3 Backup-Skript regelmäßig im Crontab ausführen... 7 4. Report über das Update und das Backup erstellen und per E-Mail versenden... 8 4.1 Report-Skript erstellen... 8 4.2 Backup-Skript anpassen... 10 4.3 Update-Skript anpassen... 11 1. Einleitung Die Raspberry Pi sollte immer aktuell gehalten und mit den neusten Updates versorgt sein um Sicherheitslücken zu schließen. Ebenfalls sollte man von seinem System ein Backup erstellen umso einem möglichen Datenverlust zu verhindern. Es ist Ratsam von Zeit zu Zeit ein komplettes Image der Raspberry Pi zu erstellen. Dies ist vor allem nützlich, wenn tiefgreifende Systemeingriffe vorgenommen werden sollen. Eine Sicherung der Dateien sollte wiederrum regelmäßig erstellt werden. Ein großer Vorteil ist es, wenn diese beiden Dinge automatisiert und in vorher festgelegten Abständen vom System erledigt werden. Die nachfolgende Anleitung stellt ein derartiges System mit seinen benötigten Schritten zur Verfügung. Rahmenbedingungen: Raspberry Pi 2 SanDisk microsd mit 32GB Raspberry Stand von Kapitel 2.3 E-Mail Server mit Strato USB Stick von SanDisk mit 16Gb Roland Kuenen Seite 1
2. Automatische Updates und Upgrades Im Kapitel 2.2 Den Websurfer absichern wurde schon eine Update-Zeile in den Crontab geschrieben. Diese kann nach dem Erstellen des Skriptes dann aus der Datei entfernt bzw. ersetzt werden. Die nachfolgende Zeile 15 0 * * 7 root apt-get update -y && apt-get dist-upgrade -y && apt-get autoremove -y && reboot müsste aus der Datei sudo nano /etc/crontab entfernt werden, falls ihr dies nach der Anleitung aus Kapitel 2.2 erstellt habt. 2.1 Das Skript mit den Update-Befehlen Das Skript, welches die Aktualisierungen durchführt, wird im Ordner für Crontabs erstellt. Hierzu wird mit dem nachfolgenden Befehl cd /etc/cron.d in den cron.d - Ordner gewechselt. Hier können die Skripts, welche später automatisch ausgeführt werden sollen, abgelegt werden. Natürlich kann dies auch in jedem anderen beliebigen Verzeichnis geschehen. Hier wird nun ein neues Skript für die Aktualisierungen mit erstellt und mit folgendem Inhalt gefüllt sudo nano update.sh #!/bin/bash -e #Datei /etc/cron.d sudo apt-get update -y && apt-get dist-upgrade -y && apt-get autoremove -y sudo shutdown -r 1 Erklärung: Die erste Zeile ist zur Definition des Interpreters. Die zweite nur eine Information, unter welchem Verzeichnis sich das Skript befindet. In der dritten Zeile steht der Befehl zum Aktualisieren des Systems. Die && - Operatoren zwischen den Befehlen sagen aus, dass der nachfolgende Befehl nur ausgeführt wird, wenn der vorherige erfolgreich war. Die Erklärungen für update, upgrade und autoremove findet ihr zur Genüge im Web. Der Letzte Befehl fährt die Pi nach 1 Minute herunter und startet diese mit dem Parameter r erneut. So startet ihr die Raspberry mit den neuen Aktualisierungen. 2.2 Update-Skript regelmäßig im Crontab ausführen Um das Skript automatisch mit einem Benutzer starten zu können, muss dies noch für die Benutzer in den Berechtigungen festgelegt werden. Mit dem Befehl sudo chmod a+x update.sh Roland Kuenen Seite 2
legt ihr für alle Benutzer das Recht fest, das Skript auszuführen. Der letzte Schritt besteht darin, den Intervall im Crontab festzulegen, wann das Skript ausgeführt werden soll. Öffnet die Datei zum Festlegen der Crontabs mit sudo nano /etc/crontab Hier tragt ihr in die letzte Zeile, aber vor der #, folgenden Eintrag ein 20 0 * * 5 root sudo /etc/cron.d/update.sh Die 20 und die 0 stehen dafür, dass das Skript immer 20 Minuten nach 0 Uhr ausgeführt wird. Die beiden nachfolgenden * stehen für den Tag des Monats und den Monat selbst. Da hier ein Stern drin steht, ist dies an jedem Monat. Die 5 steht für den Wochentag. Hier wird das Skript also immer an jedem Freitag um 20 Minuten nach 0 Uhr ausgeführt. Natürlich könnt ihr die Zeit beliebig nach euren Wünschen anpassen. Der nächste Eintrag root steht für den Benutzer, welcher das Skript ausführen soll. Und er letzte Eintrag steht für das Verzeichnis und die Datei. Wenn ihr wollt, könnt ihr das Skript nun mit dem folgenden Befehl testen. Beachtet auch die Information, welche am Schluss im Display auftaucht und euch mitteilt, dass in einer Minute die Raspberry heruntergefahren wird (abbrechen könnt ihr diesen Neustart-Vorgang mit der Eingabe shutdown -c ). Zum Testen zuerst Root-Rechte verschaffen: mit Passworteingabe und dann das Skript mit su./update.sh ausführen. Verlassen könnt ihr den Superuser-Bereich wieder mit exit Roland Kuenen Seite 3
3. Ein automatisches Backup eines Verzeichnisses regelmäßig erstellen Ein Backup eines Verzeichnisses in regelmäßigen Abständen zu erstellen kann durchaus Sinnvoll sein. Es könnte z.b. bei einem Websurfer das /var/www-verzeichnis gesichert werden. In diesem sind alle Dateien eures Websurfers und eurer Homepage untergebracht. Sollte sich aus irgendeinem Grund die Raspberry Pi zerschießen oder die SD-Karte defekt sein, sind wenigstens die Homepage-Dokumente gesichert. Vorausgesetzt ist natürlich, dass die Backups auf einem externen Speichermedium erstellt werden. 3.1 Einen USB-Stick für die Backups mounten Der erste Schritt besteht darin, den Stick mit dem Dateiformat FAT32 auf einem Windows-PC zu formatieren. Dass ich diese Formatierung wähle hängt mit meinem Rechner zusammen. Meine Hauptplattform ist ein Windows-Rechner. Deshalb wähle ich immer Dateiformate, welche ich ohne Probleme auch auf meinem Rechner öffnen und bearbeiten kann. Nach dem Formatieren und dem einstecken in die Raspberry Pi werden die Geräte mit dem Befehl sudo blkid -o list -w /dev/null angezeigt. Es müsste ein ähnlicher Bildschirm wie der folgende angezeigt werden. Hier wird der USB-Stick unter /dev/sda1 mit dem Namen Backup angezeigt. Der Name ist der, welcher bei der Formatierung unter Windows angegeben wurde. Die Information bei Mount point zeigt an, dass der Stick noch nicht eingebunden wurde. USB-Sticks werden immer unter sda angezeigt. Die Nummer unter UUID muss für später aufgeschrieben werden. Hier ist zu beachten, wenn der Stick erneut formatiert wird, ändert sich diese Nummer und muss dementsprechend in den nachfolgenden Skripten angepasst werden. Als nächstes wird mit sudo mkdir /media/backup eine Struktur erstellt, unter welchem der USB-Stick eingebunden wird. Üblicherweise wird das media -Verzeichnis dafür gewählt. Mit dem Befehl sudo mount -t vfat -o uid=root,gid=root /dev/sda1 /media/backup wird der USB-Stick eingebunden. Natürlich muss der Eintrag von sda1 und das Verzeichnis auf die aktuellen Begebenheiten angepasst werden. Roland Kuenen Seite 4
Mit dem Befehl sudo blkid -o list -w /dev/null müsste nun bei mount point das Verzeichnis /media/backup erscheinen. Mit folgendem Befehl wird der Stick wieder ausgeworfen. sudo umount /media/backup Den USB-Stick sollte man immer auf diese Art auswerfen. Wenn er entfernt wird, während er beschrieben oder bearbeitet wird, können die Daten auf dem Stick verloren gehen. Auch ist es mir schon passiert, dass der Stick nicht mehr vollständig beschreibbar und nur noch einen Bruchteil seiner Größe angezeigt wurde. Hier musste der Stick mit einem externen Programm des Herstellers zurückgesetzt werden. Wird die Raspberry Pi heruntergefahren und neu gestartet, muss der Stick immer manuell wieder eingebunden werden. Um dies automatisch zu erledigen, muss dies in einer Initialisierungsdatei festgelegt werden. Hierzu wird die oben erwähnte UUID -Nummer benötigt. Die Initialisierungsdatei wird mit geöffnet und muss mit der Zeile sudo nano -w /etc/fstab UUID=ABCD-1234 /media/backup vfat utf8,uid=root,gid=root,noatime 0 erweitert werden. Die Datei sollte nun folgendermaßen aussehen proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime 0 1 UUID=ABCD-1234 /media/backup vfat utf8,uid=root,gid=root,noatime 0 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on off] for that Getestet werden kann es mit einem Neustart der Raspberry Pi und dem anschließenden ausführen von sudo reboot sudo blkid -o list -w /dev/null zum Anzeigen der angeschlossenen Geräte. Hier müsste nun beim mount point das vorher festgelegte Verzeichnis automatisch eingebunden worden sein. Roland Kuenen Seite 5
3.2 Das Skript mit den Backup-Befehlen Nachdem nun das Verzeichnis für die Backup-Ablage feststeht, kann nun das Skript erstellt werden. Zuerst allerdings erstellen wir auf dem USB-Stick einen neuen Ordner, unter welchem die Backups abgespeichert werden. Dies hat zwei praktische Gründe. Der erste ist, dass die Backups in einem separaten Ordner auf dem Stick gespeichert werden. So erleichtert es die Übersichtlichkeit und es können noch weitere Dinge auf diesem gespeichert werden. Der zweite Grund ist, dass mit diesem neuen Ordner im Skript eine Abfrage durchgeführt werden kann, ob der Stick mit dem benötigten Ordner tatsächlich eingesteckt ist. So können unkontrollierte Befehle abgefangen werden. Denn ist der Stick nicht eingebunden und das Verzeichnis, unter welchem gespeichert werden soll, nicht vorhanden, führt dies zu einem Fehler. Mit dem Befehl sudo mkdir /media/backup/www wird nun ein Ordner auf dem Stick erstellt, unter dem das Verzeichnis www der Raspberry Pi abgespeichert wird. Mit dem Befehl cd /etc/cron.d wird nun in den cron.d - Ordner gewechselt. Hier können die Skripts, welche später automatisch ausgeführt werden sollen, abgelegt werden. Natürlich kann dies auch in jedem anderen beliebigen Verzeichnis geschehen. Hier wird nun ein neues Skript für die Backups mit erstellt und mit folgendem Inhalt gefüllt sudo nano backup.sh Roland Kuenen Seite 6
#!/bin/bash -e #Datei /etc/cron.d if [ -d /media/backup/www ]; then sudo tar -vczf /media/backup/www/backup-$(date +%Y%m%d-%H%M%S).gz /var/www else exit 1 fi Erklärung: Die erste Zeile ist zur Definition des Interpreters. Die zweite nur eine Information, unter welchem Verzeichnis sich das Skript befindet. In der dritten Zeile ist eine IF-Abfrage, welche abfragt ob das zuvor erstellte Verzeichnis auf dem USB-Stick vorhanden ist. Ist dies nicht der Fall wird direkt durch exit 1 beendet. Ist die Bedingung wahr, also das Verzeichnis vorhanden, wird das Verzeichnis /var/www kopiert, komprimiert und unter dem Verzeichnis media/backup/www unter dem Namen backupaktuellesdatumunduhrzeit.gz gespeichert. Diese Datei kann unter Linux oder Windows wieder entpackt (z.b. mit zip ) und geöffnet werden. 3.3 Backup-Skript regelmäßig im Crontab ausführen Um das Skript automatisch mit einem Benutzer starten zu können, muss dies noch für die Benutzer in den Berechtigungen festgelegt werden. Mit dem Befehl sudo chmod a+x backup.sh legt ihr für alle Benutzer das Recht fest, das Skript auszuführen. Der letzte Schritt besteht darin, den Intervall im Crontab festzulegen, wann das Skript ausgeführt werden soll. Öffnet die Datei zum Festlegen der Crontabs mit sudo nano /etc/crontab Hier tragt ihr in die letzte Zeile, aber vor der #, folgenden Eintrag ein 10 0 * * 5 root sudo /etc/cron.d/backup.sh Die 10 und die 0 stehen dafür, dass das Skript immer 10 Minuten nach 0 Uhr ausgeführt wird. Die beiden nachfolgenden * stehen für den Tag des Monats und den Monat selbst. Da hier ein Stern drin steht, ist dies an jedem Monat. Die 5 steht für den Wochentag. Hier wird das Skript also immer an jedem Freitag um 10 Minuten nach 0 Uhr ausgeführt. Natürlich könnt ihr die Zeit beliebig nach euren Wünschen anpassen. Der nächste Eintrag root steht für den Benutzer, welcher das Skript ausführen soll. Und er letzte Eintrag steht für das Verzeichnis und die Datei. Wenn ihr wollt, könnt ihr das Skript nun mit dem folgenden Befehl testen. Zum Testen zuerst Root-Rechte verschaffen: mit Passworteingabe und dann das Skript mit su./backup.sh Roland Kuenen Seite 7
ausführen. Verlassen könnt ihr den Superuser-Bereich wieder mit exit 4. Report über das Update und das Backup erstellen und per E-Mail versenden Die nachfolgenden Erweiterungen beschreiben eine Textdatei, welche mit den Ergebnissen des Backup- und des Update-Skriptes beschrieben werden und einmal in der Woche an eine E-Mail-Adresse geschickt werden. Wichtig ist hier, dass ein E-Mail-Server auf der Raspberry installiert und eingerichtet ist. Hierzu siehe Kapitel 2.3 Den Websurfer mit einem E-Mail-Server unter Strato erweitern der Raspberry-Projekte auf meiner Homepage. 4.1 Report-Skript erstellen Zuerst wird eine Textdatei für die Ergebnisse im cron.d-verzeichnis erstellt. Hierzu wird das Verzeichnis mit gewechselt und mit cd /etc/cron.d sudo nano logfile.txt eine Textdatei angelegt. Zur Übersichtlichkeit kann das folgende dort eingefügt werden. Besitzer: Max Muster Datum: 28.12.2016 Information: Log-File fuer die Ergebnisse der Aktualisierungen und des Backup-Sktipts ------------------------------------------------------------------------------------------------------------ Datum Uhrzeit Skript Information. ------------- ----------- --------- ------------------------------------------------------------------------- Hier werden die Ergebnisse nun nach Datum und Uhrzeit mit den Informationen des Skriptes und der Ergebnisse gespeichert. Als nächstes wird nun das Skript zum Senden der Ergebnisse mit erstellt und mit folgendem Inhalt gefüllt sudo nano sendestatus.sh Roland Kuenen Seite 8
#!/bin/bash -e #Datei /etc/cron.d mail -s "Wöchentlicher Statusbericht" ich@meinedomain.de < /etc/cron.d/logfile.txt Erklärung: Die erste Zeile ist zur Definition des Interpreters. Die zweite nur eine Information, unter welchem Verzeichnis sich das Skript befindet. In der dritten Zeile ist der Befehl zum Senden der E-Mail. Der Betreff ist der Wöchentlicher Statusbericht und die nachfolgende E-Mail-Adresse der Empfänger. Sinnvollerweise sollte hier die eigene stehen. Der letzte Eintrag füllt die E-Mail mit dem Inhalt der Textdatei. Hier ist es wichtig den kompletten Pfad anzugeben. Um das Skript automatisch mit einem Benutzer starten zu können, muss dies noch für die Benutzer in den Berechtigungen festgelegt werden. Mit dem Befehl sudo chmod a+x sendestatus.sh legt ihr für alle Benutzer das Recht fest, das Skript auszuführen. Der letzte Schritt besteht darin, den Intervall im Crontab festzulegen, wann das Skript ausgeführt werden soll. Öffnet die Datei zum Festlegen der Crontabs mit sudo nano /etc/crontab Hier tragt ihr in die letzte Zeile, aber vor der #, folgenden Eintrag ein 30 0 * * 5 root sudo /etc/cron.d/sendestatus.sh Die 30 und die 0 stehen dafür, dass das Skript immer 30 Minuten nach 0 Uhr ausgeführt wird. Die beiden nachfolgenden * stehen für den Tag des Monats und den Monat selbst. Da hier ein Stern drin steht, ist dies an jedem Monat. Die 5 steht für den Wochentag. Hier wird das Skript also immer an jedem Freitag um 30 Minuten nach 0 Uhr ausgeführt. Natürlich könnt ihr die Zeit beliebig nach euren Wünschen anpassen. Der nächste Eintrag root steht für den Benutzer, welcher das Skript ausführen soll. Und er letzte Eintrag steht für das Verzeichnis und die Datei. Wenn ihr wollt, könnt ihr das Skript nun mit dem folgenden Befehl testen. Zum Testen zuerst Root-Rechte verschaffen: mit Passworteingabe und dann das Skript mit su./sendestatus.sh ausführen. Verlassen könnt ihr den Superuser-Bereich wieder mit exit Nun sieht man auch eine gewisse chronologische Reihenfolge der einzelnen Skripts. Zuerst wird ein Backup um 10 Minuten nach 0 Uhr erstellt, dann das System um 20 Minuten nach Aktualisiert und zum Schluss der Status per E-Mail um 30 Minuten nach 0 Uhr gesendet. Roland Kuenen Seite 9
4.2 Backup-Skript anpassen Nun muss das Backup-Skript um die Einträge für den Status erweitert werden. Hierzu wird erneut das Skript mit sudo nano /etc/cron.d/backup.sh geöffnet und um die folgenden Einträge erweitert Zeile 1: #!/bin/bash -e Zeile 2: #Datei /etc/cron.d Zeile 3: statusmeldung="backup nicht erfolgreich" Zeile 4: if [ -d /media/backup/www ]; then Zeile 5: sudo tar -vczf /media/backup/www/backup-$(date +%Y%m%d- %H%M%S).gz /var/www && statusmeldung="backup erfolgreich erstellt." Zeile 6: sudo echo "$(date +%Y.%m.%d) $(date +%H:%M:%S) Backup $statusmeldung" >> /etc/cron.d/logfile.txt Zeile 7: else Zeile 8: sudo echo "$(date +%Y.%m.%d) $(date +%H:%M:%S) Backup Backup nicht erfolgreich erstellt, da das Verzeichnis nicht gefunden wurde." >> logfile.txt Zeile 9: exit 1 Zeile 10: fi Erklärung: Zeile 1 und 2 wie im Kapitel zuvor. Zeile 3 erstellt am Anfang eine Variable mit einem Textinhalt. Zeile 4 fragt ab ob das Verzeichnis existiert und falls ja, dann wird das Backup des Verzeichnisses /var/www erstellt und am Ende die Variable auf Erfolgreich gesetzt (Zeile 5 und 6). Sollte das Verzeichnis nicht existieren (Zeile 7), dann wird die Variable auf nicht Erfolgreich gesetzt. Die logfile.txt wird jeweils um den Status erweitert und mit Datum, Uhrzeit, Skriptname und Meldung in die letzte Zeile (mit >> ) des Dokuments geschrieben. Roland Kuenen Seite 10
4.3 Update-Skript anpassen Auch hier muss das Skript um die Statusmeldung erweitert werden. Hierzu wird erneut das Skript mit sudo nano /etc/cron.d/update.sh geöffnet und um die folgenden Einträge erweitert Zeile 1: #!/bin/bash -e Zeile 2: #Datei /etc/cron.d Zeile 3: statusmeldung="update nicht erfolgreich." Zeile 4: sudo apt-get update -y && apt-get dist-upgrade -y && apt-get autoremove - y && statusmeldung="update erfolgreich ausgefuehrt." Zeile 5: sudo echo "$(date +%Y.%m.%d) $(date +%H:%M:%S) Update $statusmeldung" >> /etc/cron.d/logfile.txt Zeile 6: sudo shutdown -r 1 Erklärung: Zeile 1, 2 und 3 wie im Kapitel zuvor. Zeile 4 wird um die Variablenänderung und dem &&-Operator erweitert, dass dies nur geschieht, wenn alle Befehle erfolgreich ausgeführt wurden. In Zeile 5 wird die logfile.txt wieder um das Ergebnis erweitert. Zeile 6 fährt die Pi nach einer Minute runter und startet sie mit dem Parameter r erneut. Roland Kuenen Seite 11