Es ist ratsam für seine Persönlichen Daten ein Backup zu haben. Manche nutzen dafür und zum Teilen von Daten einen Cloud Service von einem Anbieter. Ich habe sehr viele Daten, die zwischen verschiedenen Geräten geteilt
werden müssen. Daher entschied ich mich dafür die Daten im Netzwerk zwischen den Rechnern zuhause zu teilen. Dafür habe ich einen eigenen Rechner, der die Daten hosted. Doch natürlich stellt sich auch dafür die
frage ein Backup zu haben. NAS Server haben ja schon durch RAID ein Backup und machen oft zusätzlich noch ein automatisiertes externes Backup. Doch ich habe ja kein NAS im Netzwerk zu stehen. Daher stellte ich mir die Frage, wie man
das Backup der Daten managen könnte. Denn es sind nicht nur ein paar wenig Gigabyte, die in eine Cloud passen. Es sind halt doch Terabyte.
Ich dachte auch länger schon über eine Festplatte im Netzwerk nach, auf die man dann nur noch die Daten regelmäßig kopieren braucht. Doch eine extra Festplatte, die 24/7 Strom verbrauchte, nur um da einmal im Monat zu
zugreifen fand ich doof. Es wäre schön gewesen, diese nur für den Backup moment bereit zu stellen und danach wieder zu trennen. Dafür müsste man aber eine externe Platte am Stromnetz schalten können. Wie man so
etwas prinzipiell baut, weiß ich durch meine Ausbildungen. Nur fehlte mir erst die Idee, wie mein Rechner das Schalten ausführen sollte.
Irgendwann kam mir die Idee. Ich suchte schon lange Beschäftigung für einen meiner Raspberry Pi. Weiter hatte ich in einem Set für Aktoren / Sensoren die man mit Raspberry Pi oder Arduino benutzen können sollte ein
Relais.
Bei diesem war mir gleich Aufgefallen, dass es nicht einfach nur für Gleichspannung und eventuell bis =< 24V zu gebrauchen war. Nein es war bis 230V~ @10A ausgelegt. Und trotzdem Primär mit 5V Gleichspannung aus einem der
beiden kleinen Systeme steuerbar.
Also dachte ich mir, dass ich das Relais mit dem Raspberry Pi über dessen GPIO Schnittstelle zum Ein- und Aus- Schalten der externen Festplatte nutzen kann. Zu jeder entsprechenden Aktion musste nur das Dateisystem entweder gemounted
oder eben unmounted werden. Schon steht der Speicher remote schaltbar bereit. Dann noch freigeben und schon kann jeder darauf Backup machen - wenn er die Festplatte anfordert. Für das Backup zeigte sich rsync als hilfreich. Später
stellte ich sogar auf rsync daemon um.
Wichtig war eben, dass andere Computer die Festplatte schalten können. Und zwar Linux Computer und unbeobachtet. Mir waren zwar smarte Steckdosen bekannt, aber mir war nicht bekannt, dass ich hätte einen Befehl per curl schicken
können, damit diese dann schalten. Ich kannte nur das man diese per App steuern kann. Das war aber hierbei nicht mein Interesse. Und da ich ein Relais hatte und der Raspberry Pi eh das Ziel des Backups sein sollte, lag es nahe, ihn zum
schalten mithilfe des Relais zu nehmen.
Die Funktion einer smarten Steckdose wurde nunmal trotzdem benötigt. Im Prinzip hatte ich vor, den elektronischen Schalter einer solchen smarten Steckdose nach zu bauen. Nur diese haben für gewöhnlich einen kleinen eingebetten Controller, der irgendwie per Funk angeschlossen wird (z.B. per WLAN als neues Netzwerkgerät). Selbst wenn man eine mit WLAN hat steuert man diese dann über eine App auf dem Smartphone. Doch das Schalten sollen hier meine Computer Remote tun, um Nachts das Backup zu machen. Und dafür werde ich nachts keine App bedienen. Außerdem wusste ich nicht, ob man eine solche Steckdose so steuern könnte, wie ich es hier gebaut habe, also sollte der Raspberry Pi dies nun übernehmen.
Um die Festplatte schalten zu können, habe ich mir einen Zwischenstecker besorgt, an dem man selbst einen Schalter anbauen kann. Dadurch brauchte ich nur ein kurzes Stück Leitung ausführen, das an die Klemmen des Relais angeschlossen wurden. Über einen zweiten Draht geht dann der Stromweg wieder zurück zum Zwischenstecker. Das Netzteil wird also ebenfalls nur in den Zwischenstecker gesteckt und das Schalten erfolgt per Relais respektive Raspberry Pi. Dieser ist mit 5V, GND und einer Signalleitung an die Steuerkontakte des Relais angeschlossen. Was nicht so übersichtlich ist, dass man eine Versorgungspannung anlegen muss, und die Signalleitung in Realität tatsächlich die 5V leitung kreutzt. Weiter ist das Relais ein Wechselkontakt. Jedoch ist das nicht gut zu sehen bzw. beschriftet. Das habe ich erst durch Test mit dem Durchgangstester herrausgefunden. Denn das Datenblatt dazu fehlte mir. Die Festplatte wurde für die Daten dann einfach per USB verbunden.
Damit das Schalten nun geht, braucht man noch ein bisschen Software. Leider habe ich zu der Zeit noch nicht gewusst, wie einfach man ein Programm in C dafür schreiben kann. Aber eine Lösung mit Shell Befehlen kannte ich. Deswegen habe ich das hier so gelöst. Damit der Raspi am GPIO das Relais schalten kann, muss man dafür den Pin als Ausgang schalten. Da das jedesmal nach dem Reboot passieren muss, muss das beim init augeführt werden. So findet sich folgender Befehl in der /etc/rc.local:
gpio export 2 out
Soll die Platte nun aktiviert werden wird ein script mit einem Parameter aufgerufen. Das Script soll ja schließlich wissen, welche aktion ausgeführt werden soll. Da hier nicht so viel Platz ist, erspare ich mir die steuer anweisungen, die die Anzahl der Parameter, sowie den übermittelten Parameter überwachen. Zum aktivieren wird als Parameter String "reqhd" übergeben. Dann wird zunächst der GPIO Pin geschaltet und anschließend 15s gewartet. Diese Zeit braucht die Platte um Anzulaufen. Anschließend wird ein mountbefehl abgesetzt, der die Platte Mounten tut (dafür wurde ein eintrag in der /etc/fstab vorgenommen).
gpio -g write 2 1
sleep 15s
mount /mnt/sark &> /home/pi/sarkmount/mnt-msg.txt
echo "mnt result: $?" >> /home/pi/sarkmount/mnt-msg.txt
Das deaktivieren der Platte ist nicht komplizierter. Hier wird der Parameter "finhd" übergeben, der zunächst das Dateisystem Sync ausführen lässt und extra 10 Sekunden wartet. Das ist extra, damit die Platte Zeit hat alles fertig zu schreiben. Erst dann wird der unmount gemacht. Mit der -l Option wird der auch immer durchgeführt, dafür muss vorher auf sync geachtet werden. Ist der unmount versuch fertig, wird eigentlich noch geprüft, ob das auch wirklich geplappt hat - was hier aus platzgründen fehlt. Hat alles gelkappt, muss nur noch der GPIO Pin abgeschaltet werden.
sync
sleep 10s
umount -l /mnt/sark &> /home/pi/sarkmount/umnt-msg.txt
echo "umnt result: $?" >> /home/pi/sarkmount/umnt-msg.txt
echo -n 0 > /home/pi/sarkmount/reg.txt
gpio -g write 2 0
echo 2
Die Steuerung auf Remoteseite sollte per Webaufruf erfolgen, also am Linux Server mit "curl". Da dies nicht mit fertigen smarten Steckdosen geht, musste ich diese Steuerung per Web auch nachbauen. Leider muss ich auch hier sagen,
hätte ich vorher gewusst, wie einfach man mit einem C Programm als CGI Script im Webserver alles steuern kann, hätte ich es so nicht gelöst.
Um den Status zu übermitteln, geben die Schaltenden Scripte status Zahlen aus, die der Webserver dann zurück schickt. Das ganze war ursprünglich so, das auf dem Raspberry Pi ein Apache Server mit PHP installiert war und
dieser den Shellscript aufruf selber ausführte. Das PHP Script bekam den Schalter einfach per HTTP GET geschickt und gab ihn an das Shell Script weiter. Doch später verschäfte man bei Debian Sicherheitskonzepte, weswegen der
Mount- Zustand nicht nach dem Ablauf des PHP Aufrufs erhalten blieb. Doch weiterhin sollte die Webschnittstelle erhalten bleiben. Deswegen habe ich dann PHP eine SSH Verbindung über "localhost" aufbauen lassen, worüber
dann der Befehl weiter gegeben wird.
Falls man mal einfach so auf die Platte schauen möchte, habe ich die im Bild gezeigte Weboberfläche zusammen gebaut. Klickt man auf einen der Bildbuttons, wird im Grunde der selbe Aufruf am Server ausgelöst. Die Seite ruft
sich sogar erst selber mit dem Befehl auf (sie ist ebenfalls PHP) und das führt vor dem Zusammenbau und Rückgabe an den Browser zum aufruf des PHP Scripts, welches die eigentliche Aktion ist.
Es ist möglich, das mehr als eine Anmeldung passiert. So kann man wärend des Backups einfach sich als Parallel User am System anmelden. Dann wird berücksichtigt, ob die Platte bereits aus gemacht werden kann oder ob nur die
Anzahl der User korrigiert wird. Um sich diese Anzeigen zu lassen, kann mit dem "Meter" Button die Anzahl der Registrierten Clients abgerufen werden.
Auf dem Client der ein Automatisches Backup machen möchte, findet sich einfach ein Script, welches per curl den Aufruf am Server durchführt und den zurückgegebenen Wert auswertet. Ein Script Kapselt den Aufruf zum Aktivieren der Festplatte und Speichert den Steuerwert, der per HTTP zurück kommt, in einer Datei:
curl -X GET http://backupserver/com.php?str=reqhd > bu_stat.txt
Das ganze gibt es dann noch einmal für das Deaktivieren:
curl -X GET http://backupserver/com.php?str=finhd > bu_stat.txt
if [ $(cat bu_stat.txt) -eq 0 ]
then
rsync -rhtEl --partial --inplace --chmod=D755,F644 --delete --force $2 /media/sda1/ rsync://backupserver/bu/pi_sda1
sleep 60s && /root/bu_fin.sh
else
echo "Not working"
fi
Das eigentliche Script wertet dann den Steuerwert aus, um zu bestimmen, ob die Festplatte zur Verfügung steht. Sagt der Wert, dass alles wie erwartet ist, wird rsync benutzt um die Daten zu spiegeln. Es lassen sich beliebig viele rsync Befehle hinein schreiben, um zum Beispiel mehrere Volumen zu sichern. Anschließend wird einfach der Befehl zum beenden der Platte abgesetzt und der Job ist fertig. Das ganze wird aber als User "root" ausgeführt, da Datein von verschieden Ownern gesichert werden müssen und rsync auch aktionen wie das übernehmen von Zeitsempeln machen soll.
Auf dem Notebook von mir findet sich auch so ein Script. Weil dieses nicht 24/7 online ist, wird hier das Script von mir manuell gestartet (ein start per Aanacron wäre nicht sinnvoll möglich gewesen).
Auf dem Server wiederum ist für das Script ein Eintrag im crontab hinterlegt, der das Script nun jeden ersten Tag eines Monats um Mitternacht aufruft. Somit wird pünktlich zum Monatsende der letzte Stand gesichert. Soll die Frequenz der sicherungen erhöht werden, stelle ich den Interval in cron einfach feiner ein. Soll nur etwas bestimmtes geschichert werden, mit eigenem Intervall, kopiere ich das Script, passe die rsync Anweisung entsprechend an und trage das zusätzliche Script mit dem gewünschten Interval einfach in crontab ein. Es ist auch die Option vorgesehen, das Shell Script im Terminal von Hand zu starten und einen zweiten Parameter zu übergeben. Dabei dachte ich an den rsync schalter --progress, um auch beim manuellen ausführen Infos über die Kopiervorgänge zu erhalten.