Mein Backup zuhause

Es heißt ja dass ein Backup nur gut ist, wenn es auch automatisch funktioniert…
Während das bei allen Servern die ich verwalte zutrifft (die backupen sich gegenseitig und schieben die Daten in Cloudspeicher) so war das bei meinem Computer zuhause noch eher sehr altmodisch.
Ich hab halt einfach „dann und wann“ eine USB-Festplatte angesteckt und die Daten rübergezogen.
Da das nicht sonderlich automatisch ist musste eine einfache (Linux) LowCost Lösung her!

Eigentlich ists ganz einfach:
Ein Raspberry Pi der durchgehend läuft hat eine externe Festplatte angeschlossen. Der Pi weckt nun einmal die Woche meinen PC auf, synchronisiert alle Daten von ihm auf die externe Platte und schickt ihn danach wieder schlafen.

Die Vorteile:

  • Es geht automatisch, somit kann mans nicht vergessen und hat immer ein relativ aktuelles Backup.
  • Die Platte steckt nicht dauerhaft im PC, somit kann der PC selbst nicht auf die Platte zugreifen und sein eigenes Backup zerstören.
  • Der PC kann ausgeschalten bleiben.
  • Man nutzt nicht irgendeine teure NAS sondern hat alles selbst in der Hand.

Die Nachteile:

  • Es ist nur eine externe Festplatte, man hat also keine Redundanz, ist die Platte kaputt ist das Backup futsch.
  • Es ist in der aktuellen Version keine Möglichkeit eingebaut um informiert zu werden wenn etwas nicht geklappt hat (z.B. per Mail).
  • Wir haben immer nur ein Backup, und das findet am Sonntag statt. Besser wäre es natürlich ein ordentliches Großvater, Vater, Sohn Backup zu haben welches mehrere Versionen mit Deduplizierung vorhält. Rsync kann das theoretisch mit dem Parameter ‚–link-dest‘.

Hier nun die Umsetzung, zuerst muss mein PC (mit Ubuntu 16.04) Wake on LAN können damit der Raspberry Pi ihn hochfahren kann. Hierfür muss der Computer per LAN-Kabel verbunden sein.

In die Datei ‚/etc/default/halt‘ kommt rein:

NETDOWN=no

Das sorgt dafür dass das Netzwerk beim Shutdown nicht komplett runtergefahren wird und die LAN-Schnittstelle noch auf Pakete reagieren kann.

Und in die Datei ‚/etc/default/tlp‘ kommt rein:

WOL_DISABLE=N

Das sorgt dafür dass das PowerManagment von Ubuntu dass Wake-On-LAN nicht deaktiviert.

Jetzt müssen wir nur noch WOL beim booten aktivieren, das machen wir in der Datei ‚/etc/rc.local‘, und zwar kommt da vor dem ‚exit 0‘ folgendes rein:

sleep 5
ethtool -s enp3s0 wol g

Natürlich müssen wir davor dass ‚ethtool‘ installieren:

apt-get install ethtool

Und um zu sehen ob der Befehl ‚ethtool -s enp3s0 wol g‘ das Wake-On-LAN bei meiner LAN-Schnittstelle ‚enp3s0‘ überhaupt aktiviert rufen wir ‚ethtool enp3s0‘ auf:

Settings for enp3s0:
    Supported ports: [ TP ]
    Supported link modes:   10baseT/Half 10baseT/Full 
                            100baseT/Half 100baseT/Full 
                            1000baseT/Full 
    Supported pause frame use: No
    Supports auto-negotiation: Yes
    Advertised link modes:  Not reported
    Advertised pause frame use: No
    Advertised auto-negotiation: Yes
    Speed: 100Mb/s
    Duplex: Full
    Port: Twisted Pair
    PHYAD: 0
    Transceiver: internal
    Auto-negotiation: on
    MDI-X: Unknown
    Supports Wake-on: pg
    Wake-on: g
    Current message level: 0x0000003f (63)
                   drv probe link timer ifdown ifup
    Link detected: yes

Wenn da bei ‚Supports Wake-on‘ ‚g‘ steht, so kann die Netzwerkschnittstelle auf ein Magic Packet aufwachen.
Wenn nun bei ‚Wake-on‘ auch ‚g‘ steht, so ist das aufwachen auf ein Magic Packet aktiviert.

Nun kommt Part 2, der Raspberry muss sich (als root) auf meinem PC verbinden können ohne ein Passwort anzugeben.
Also der klassische SSH-Schlüsseltausch.

Auf dem Pi erzeugen wir einen Key für seinen User root:
(also davor evtl. ’sudo -i‘ damit wir root sind)

ssh-keygen -t rsa

Damit wird die Datei ‚/root/.ssh/id_rsa.pub‘ erzeugt, deren Inhalt kopieren wir jetzt auf meinem PC in die Datei ‚/root/.ssh/authorized_keys‘.
Ist die Datei nicht da legen wir sie als root an.

Nun natürlich vom Pi aus einmal mittels ’ssh root@mycomp -p 1234′ verbinden damit die Hostinformationen ausgetauscht sind und wir wissen ob das Verbinden als root ohne Passwort auch sauber klappt.

Nachdem wir die externe Platte angesteckt haben (und im ‚dmesg‘ als ‚/dev/sda‘ identifiziert haben) wird sie mit ‚fdisk‘ partitioniert und mit ‚mkfs.ext4‘ kommt in die einzige große Partition ‚/dev/sda1‘ ein ext4 Filesystem rein.

Auf dem Pi legen wir den mountpoint ‚/media/backup‘ an, und auf der neuen Platte den Ordner ‚mycomp‘.
Nun bauen wir uns ein Script ‚/root/bin/backupcomp.sh‘ welches die Platte einhängt, meinen Rechner aufweckt, die Dateien synct und den Rechner wieder schlafen legt:

#!/bin/bash

echo "Waking up" $(date)
/usr/sbin/etherwake bc:xx:c5:dc:xx:f3

echo "Sleeping" $(date)
sleep 60

echo "Mounting Disk" $(date)
mount /dev/sda1 /media/backup

echo "Syncing" $(date)
rsync --delete --ignore-errors -avz --delete-excluded --exclude=/dev/ --exclude=/proc/ --exclude=/sys/ --exclude=/tmp/ --exclude=/run/ --exclude=/mnt/ --exclude=/media/ --exclude=/lost+found/ -e 'ssh -p 1234' root@mycomp:/ /media/backup/mycomp

echo "Shutting down" $(date)
ssh root@mycomp -p 1234 "shutdown -h now"

echo "Unmounting Disk" $(date)
cd /
umount /dev/sda1

(Man sieht schön dass mein Computer für SSH den Port 1234 nimmt – sollte SSH bei euch noch nicht installiert sein so hilft ein ‚apt-get install openssh-server‘ und in der Datei ‚/etc/ssh/sshd_config‘ könnt ihr den Port ändern unter dem SSH horcht. Ein ’systemctl restart sshd‘ startet den SSH Dienst danach neu und der neue Port wird aktiv. Bei einem Rechner zuhause braucht man den Port eigentlich nicht groß ändern denn SSH Zugriffe kommen ja nicht durch den Router, aber schaden tut es auch nicht…)

Und das rufen wir jetzt als crontab unter dem User root (‚crontab -e‘) jeden Sonntag morgen um 1 Uhr auf:

12      1       *       *       7       /root/bin/backupcomp.sh > /root/backupcomp.log 2>&1

Fertig. So einfach eigentlich 🙂

3 Antworten auf „Mein Backup zuhause“

  1. Dein Script hat einen kleinen Makel. Falls du mal mit weiteren Wechseldatenträgern an deinem Pi experimentierst kann es unter Umständen vorkommen, das deine Backup Festplatte nicht unter /dev/sda zu erreichen ist, sondern vllt. /dev/sdb. Es wäre unschön deswegen ein Backup einer ganzen Woche zu verlieren. Du solltest die Platte lieber über die entsprechende UUID mounten, damit ist es gleichgültig unter welchem Namen sie unter /dev geführt wird. Infos dazu solltest du im ubuntuusers Wiki finden z.B. im fstab Artikel.

    1. Hallo Anonymous,

      da hast du natürlich vollkommen Recht.

      So kriegt man die UUID der aktuellen Festplatte ‚/dev/sda‘ raus:

      blkid

      Wir brauchen dabei die folgende Angabe:

      /dev/sda1: UUID="d2a00240-8f4a-42d9-9571-f5e64619a72b" TYPE="ext4" PARTUUID="99ec693b-01"

      Entsprechend ändern wir nun den mount Befehl in unserem Script ab, er bekommt die UUID der Partition ‚/dev/sda1‘:

      mount /dev/disk/by-uuid/d2a00240-8f4a-42d9-9571-f5e64619a72b /media/backup

      Und den umount Befehl ändern wir auch:

      umount /media/backup

      Fertig!

      Danke für den Tipp, Anonymous 🙂

      Thomas

  2. Eine kleine Änderung gab es noch. Ich musste den Pfad zu ‚etherwake‘ komplett ins Script schreiben. Der Cronjob hat sonst ‚/usr/sbin/etherwake‘ nicht gefunden!

    Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.