Homeserver: Backupstrategie #2

Im vorigen Beitrag habe ich meine Idee für ein Backup meiner Daten vorgestellt. Im Folgenden möchte ich die Shell-Skripte vorstellen, die die eigentliche Arbeit machen.

Insgesamt nutze ich vier Shell-Skripte:

  1. backup-rsync.sh
  2. backup-rotate-server.sh
  3. backup-rotate-client.sh
  4. backup-now.sh

Skript 1 wird mit der IP-Adresse meines Servers, dem über FreeNAS auf dem Server angelegtem RSync-Modul sowie dem Pfad auf meinem Macbook, der gesichert werden soll, aufgerufen. Die wichtigsten Zeilen in diesem Skript beziehen sich auf den Aufruf von RSync. Ich nutze RSync von den MacPorts. Diese Version ist neuer und soll mehr Features besitzen als die von Apple gelieferte.

$RSYNC -az --numeric-ids --delete --delete-excluded
      	     --exclude-from="$EXCLUDES" $EXTRAOPT	        
      	     $BACKUP_PATH $SERVER::$MODULE

RSync wird mit den obigen Zeilen mit den Optionen az (archive, compress) aufgerufen. Mit diesen Optionen wird RSync angewiesen möglichst alle Dateiattribute, wie Benutzer und Gruppe, sowie Links zu konservieren. Weiterhin soll der zu sichernde Ordner rekursiv verarbeitet und die Daten während der Übertragung komprimiert werden. Außerdem sollen irrelevante Dateien sowie auszuschließende Dateien (delete, delete-excluded) gelöscht werden. Mittels der Option exclude-from kann eine Datei angegeben werden, die eine Liste von Mustern auszuschließender Dateien und Ordnern enthält. So kann beispielsweise die allseits beliebte .DS_STORE Datei umgangen werden, die Mac OS X so gerne anlegt. Schließlich wird mit der Variable BACKUP_PATH das zu sichernde Verzeichnis und mit SERVER:MODULE der RSync-Server sowie das dort angelegte Modul übergeben.

Für meine Uni-Daten habe ich auf meinem Server mit ZFS ein File System angelegt. Das vereinfacht das sichern der Daten mit ZFS Bordmitteln (Stichwort: Snapshots). Skript 2 wird auf dem Server ausgeführt. Zunächst wird geprüft ob der höchste Snapshot existiert. Dazu nutze ich den Befehl zfs list -t snapshot. Falls er vorhanden ist, wird er gelöscht, denn ich möchte nur eine gewisse Anzahl von Backups halten. Das Löschen wird mit dem Befehl zfs destroy eingeleitet.

SNAP_REG="#$FILE_SYSTEM@weekly.3#!d"
CHECK_SNAP=`zfs list -t snapshot | sed -e "$SNAP_REG"`

if [ "$CHECK_SNAP" ] ; then
  zfs destroy $FILE_SYSTEM@weekly.3
fi

Anschließend werden alle anderen Snapshots um eine Nummer „nach oben geschoben“. Dazu werden sie mit dem Befehl zfs rename umbenannt.

for OLD in 2 1 0 ; do
  SNAP_REG="#$FILE_SYSTEM@weekly.$OLD#!d"
  CHECK_SNAP=`zfs list -t snapshot | sed -e "$SNAP_REG"`

  if [ "$CHECK_SNAP" ] ; then
    NEW=$[ $OLD + 1 ]
    zfs rename $FILE_SYSTEM@weekly.$OLD @weekly.$NEW
  fi
done

Schließlich wird ein aktueller Snapshot angelegt:

SNAP_REG="#$FILE_SYSTEM@weekly.0#!d"
CHECK_SNAP=`zfs list -t snapshot | sed -e "$SNAP_REG"`

if [ -z "$CHECK_SNAP" ] ; then
  zfs snapshot $FILE_SYSTEM@weekly.0
fi

Skript 3 dient dazu Skript 2 auf dem Server über SSH aufzurufen. Dazu werden dem Skript der Benutzer zum Einloggen sowie die IP-Adresse des Servers und das zu sichernde ZFS File System übergeben. Der Rest funktioniert wie auf der Konsole:

SSH_CMD="~/script/backup/backup-rotate-server.sh $ZFS_FILE_SYSTEM"

ssh $SSH_USER@$SSH_HOST "$SSH_CMD"

Den Kennern ist sicherlich aufgefallen, dass ich kein Passwort benötige um den Befehl auf dem Server auszuführen. Darauf gehe ich in einem weiteren Artikel ein.

Skript 4 schließlich ist der Einstiegspunkt für das Backup. In diesem Skript wird zunächst mit dem Befehl ping geprüft ob der Server erreichbar ist. Falls nicht wird sofort abgebrochen. Ansonsten werden nacheinander Skript 3 und Skript 1 aufgerufen.

Sicherlich gibt es an einigen Stellen (wie immer) Verbesserungsbedarf. Trotzdem bin ich mit der jetzigen Lösung zufrieden, lasse mich aber gerne belehren. :)
Für diejenigen, die Interesse haben, sind im Anschluss die Skripte verlinkt.

Homeserver: Backupstrategie #1

In den folgenden Artikeln möchte ich auf die Backuplösung eingehen, die ich mit Hilfe meines Servers umgesetzt habe. Für das Systembackup meines Macbooks nutze ich Timemachine. Mit der aktuellen FreeNAS Version lässt sich ein AFP-Share für Timemachine verfügbar machen. Das klappt bis jetzt wunderbar. Jedoch möchte ich mich gerade bei wirklich wichtigen Daten, wie meinen Daten fürs Studium, nicht auf eine nicht von Apple abgesegnete Lösung verlassen.

Deshalb wollte ich RSync nutzen. FreeNAS bieten einen RSync-Server an, mit dem ein definierbarer Bereich auf der Platte als sogenanntes Module freigegeben werden kann. So muss beim Aufruf von RSync nicht mit Verzeichnissen hantiert werden. Die Angabe des Modules reicht, die Daten landen im richtigen Verzeichnis.

Ein weiterer wichtiger Punkt war die Haltung von mehreren Versionen meiner Daten. Ich wollte jede Woche ein Backup meiner Daten anlegen, einen Monat lang. Danach sollten die vorhandenen Backups rotieren: das Älteste kommt weg, die anderen werden weiter nach hinten geschoben. Natürlich sollte nicht nur einfach kopiert werden, sondern mittels Hardlinks auf Daten verwiesen werden um Plattenplatz zu sparen. Für diesen Einsatz gibt es rsnapshot. Leider kann mit rsnapshot nicht auf einen entfernten (wenn bei mir auch zwei Meter hinter mir stehenden) Server gebackupped werden. Also fiel die Möglichkeit schonmal aus.

Das Rotieren musste nun also „von Hand“ geschehen. Dabei habe ich mich etwas inspirieren lassen. Diese Shell-Skripte backuppen entfernte Server auf einen lokalen Rechner. Dabei werden die Backups rotiert und eine gewisse Anzahl Backups vorgehalten. Also fast, was ich gesucht habe. Die Skripte habe ich großzügig an meine Bedürfnisse angepasst.

Timemachine macht Backups automatisch, wenn das Backup-Volume verfügbar ist. So ungefähr sollte das auch beim Backup meiner Uni-Daten passieren. Unter Linux würde man wohl einen Cronjob anlegen, unter Mac OS X gibt es launchd. Dieser Daemon wird beim Systemstart als zweiter Prozess gestartet (siehe Aktivitätsanzeige) und soll verschiedene bekannte Starter (init, crond, etc.) ablösen und deren Aufgaben vereinheitlichen. Als weiteres Schmankerl wird launchd mit XML-Dateien konfiguriert. Wem das zu unübersichtlich ist, kann sich mit Lingon behelfen. Einen kleinen Einstiegsartikel zu Lingon findet man auf Apfeltalk.

Meine erste Idee war, einen AFP-Share zu nutzen und für jede Version meiner Daten einen Ordner (wie weekly.0, weekly.1 etc.) anzulegen. Beim Rotieren dieser Versionen wollte ich mit cp und Hardlinks arbeiten. Leider funktionierte das auch mit der GNU-Version von cp (über Macports bezogen) nicht. Woran genau es lag, kann ich nicht sagen. Vielleicht war AFP Schuld, vielleicht auch ZFS. Aber Moment… ZFS! Mit ZFS kann man von einem File System ohne großen Aufwand einen Snapshot (also quasi ein zeitliches Abbild eines File Systems) anlegen. Das wollte ich letztendlich tun.

Die Umsetzung dieser Idee und die Probleme, auf die ich gestoßen bin, kommen im nächsten Artikel. Bis dahin schöne Feiertage und so. ;)

Klimabilanz

Morgen (7.12.2009) beginnt in Kopenhagen der weltweite Klimagipfel. An der Uni besuche ich den Kurs Wissenschaftsphilosophie. Dort hat im Tutorium jeder Teilnehmer eine Patenschaft übernommen. Kein Tier oder ähnliches. Wir betreuen über das Semester ein Thema, dass wissenschaftlich in der Öffentlich diskutiert wird. Mein Thema ist nicht der Klimawandel, Jedoch hat ein anderer Teilnehmer dieses Thema gewählt und berichtet seit drei Wochen über den nun startenden Klimagipfel.
Aus diesem Grund werde auch ich nebenbei oder konkret durch dieses Thema angesprochen und lasse mich auch mal dazu hinreißen einen etwas längeren Artikel zu lesen. In der letzten Ausgabe des SPIEGEL (49/2009) sowie der jetzigen Wochenendausgabe der Berliner Zeitung war viel zu lesen über den Klimagipfel. Ich möchte hier nicht zitieren, was woanders geschrieben wurde. Ich möchte aber auf Dinge eingehen, über die ich, angeregt durch die Artikel, selbst nachgedacht habe.

Was verursacht wieviel? Wieviel verursache ich?

Interessant fand ich insbesondere Statistiken über den persönlichen CO2-Ausstoß und welche Produkte mit welchen Anteil daran beteiligt sind. In der Berliner Zeitung haben die Redakteure jeweils ihre eigene CO2-Bilanz aufgestellt. Das kann ich im Moment nicht machen, aber ich versuche es nachzuholen. Was besonders auffiel, waren Reisen. Menschen, die viel unterwegs sind, vor allem mit dem Flugzeug, verursachen einen erhöhten CO2-Ausstoß. Rund 15% der Emissionen werden dadurch verursacht.
Ich persönlich glaube, dass ich eine ziemlich weiße Weste trage in diesem Bereich. Ich bin in meinem Leben erst einmal geflogen. In den letzten Jahren bin ich nur wenig im Urlaub gewesen und habe diesen zumeist in meinem Heimatland oder nicht weit außerhalb verbracht. Das sind auch die einzigen Male, dass ich persönlich ein Auto benutze. Ich wohne in einer Stadt und ein Auto zu nutzen, macht für mich wenig Sinn. Ich fahre kürzere Strecken mit dem Fahrrad und für längere nehme ich die öffentlichen Verkehrsmittel. Projekte wie in Berlin, mit denen der Einsatz des privaten Autos zurückgehen soll, kann ich nur unterstützen. Morgens sehe ich viele Leute, die alleine in ihrem Auto sitzen. Wozu sind noch drei bis vier Plätze leer? Vielleicht mindert das auch nachhaltig die Lärmbelästigung und schont die Nerven der meisten Autofahrer. Dazu muss jedoch der öffentliche Nahverkehr weiter ausgebaut werden, der Fahrintervall der Verkehrsmittel erhöht werden. Denn mit vielen anderen Menschen in einer warmen, miefenden Bahn zu stehen, ist kein Anreiz sie zu nutzen.

Ein weiterer großer Faktor für den CO2-Ausstoß ist die Massentierhaltung (18%). Die Tiere bekommen Nahrung, dass aus Sojabohnen besteht, für die Wald gerodet wird. Nicht nur das, die Tiere stoßen selbst Methangase aus, die viel gefährlicher als Kohlendioxid sind. Laut SPIEGEL kommen auf ein Kilo Rindfleisch so 36 Kilogramm CO2, dass in der Atmosphäre landet. Jeder Deutsche soll 88 Kilo im Jahr essen. Was da zusammenkommt, kann jeder selbst nachrechnen.

Weiter ist der Anbau von Ölpalmen ein Klimakiller. Für den Anbau werden ebenso Wälder gerodet. Das Öl scheint in so ziemlich allem zu sein, auf dem „Pflanzenöl“ draufsteht: Bratöl, Kekse, Fertiggerichte, Kosmetik, …
Allgemein scheint die massenhafte Landwirtschaft nicht vorteilhaft für die CO2-Bilanz zu sein. Blumen aus Holland, in Gewächshäusern angebaut, hinterlassen eine größere CO2-Spur als Blumen aus Afrika.
Ich kann zwar nicht behaupten darauf zu achten, in welchen Produkten Palmöl enthalten ist, aber ich esse wenig Fleisch, ernähre mich viel pflanzlich. Noch besser wäre es natürlich, wenn ich nur pflanzliche Produkte aus der Umgebung essen würde. Bei Äpfeln tue ich es, die wachsen nichtmal 50 km von zu Hause. Auch Erdbeeren und Kirschen pflücke ich in der Saison oft selbst. Hier besteht für mich also Verbesserungsbedarf.
Die Großteil des CO2-Ausstoßes geht auf Energiegewinnung und das Heizen unserer Wohnungen. Hier kann ich auch nicht behaupten mich besonders vorteilhaft zu verhalten. Ich mache zwar das Licht aus, wenn ich es nicht brauche, schalte die Heizung zurück, wenn ich nicht da bin, bin eher Kurzduscher und Baden kommt nur vor, wenn ich kränkel. Trotzdem würde ich wohl noch mehr anders machen in der eigenen Wohnung.

Worauf ich den letzten Jahren weniger geachtet habe, ist der Konsum. Jedes Gerät, jedes noch so kleine Gadget, muss hergestellt werden. Dafür ist meist eine große Menge an Energie von Nöten. Noch schlimmer ist es das Gerät nach nur kurzer Zeit wegzuschmeißen und wegen „Technikgeilheit“ ein neues zu kaufen. Ich will nicht behaupten, dass ich das regelmäßig getan habe. Trotzdem gab es das eine oder andere Gerät, dass funktionierte und ich trotzdem umsteigen wollte. Trotzdem habe ich versucht die Geräte nicht wegzuschmeißen, sondern habe versucht sie zu verkaufen. Auch habe ich versucht, wenn möglich, nicht zu alte Gebrauchtgeräte zu kaufen. Ein neues Gerät belastet die Umwelt mehr.
Wenn es wirklich vorkommen sollte, dass ein Gerät nicht mehr zum verkauf geeignet war, habe ich es nicht einfach in den Hausmüll geworfen, sondern gerecht entsorgen lassen. Genauso verfahre ich bei Batterien und Druckerpatronen. Meinen alten PC, der beim Nichtstun schlappe 120W verbrauchte, habe ich gegen ein Notebook ausgetauscht, dass weniger als ein Fünftel dessen benötigt. Meinen Server habe ich mit Stromspargedanken im Hinterkopf zusammengestellt. Trotzdem habe ich die Komponenten neu gekauft. Ich gestehe.
In der Zukunft werde ich versuchen Geräte länger zu nutzen und an neue Gadgets denken und sie mir dann aus dem Kopf schlagen. Schont auch die Geldbörse. :)