In letzter Zeit habe ich immer mal wieder mit Betriebssystemen für den Raspberry Pi herum gespielt. Neben dem klassischen Raspbian habe ich mir beispielsweise Volumio und LibreElec angesehen, um den Rechner wahlweise als Musikspieler oder als Mediencenter zu nutzen. Ubunte Mate steht noch auf meiner Todo-Liste. Bislang ist nämlich noch keine Version erschienen, die mit dem Raspberry Pi 3 B+ kompatibel ist.
Um nicht ständig neue Micro-SD-Karten besorgen zu müssen, nur um ein Betriebssystem auszuprobieren, habe ich angefangen, Backups von den einzelnen Installationen anzulegen. Angesichts der begrenzten Haltbarkeit von SD-Karten hat sich das ohnehin als eine gute Idee erwiesen. In diesem Post stelle ich vor, wie sich unter Linux oder MacOS solch ein Backup vom Raspberry Pi anlegen lässt.
Genügend Speicherplatz. Das Backup ist für gewöhnlich genauso groß wie die eigentliche SD-Karte. Ich speichere deswegen das Backup-Image auf meinem NAS.
Außerdem benötigt man einen SD-Kartenleser. Da hiermit auch die SD-Karten beschrieben werden, um Noobs oder ein anderes System auf dem Raspberry Pi zu installieren, sollte das gute Stück eh in greifbarer Nähe sein.
Zuerst hatte ich versucht, mithilfe von ApplePi-Baker ein Backup auf einem Netzlaufwerk meines NAS abzulegen. Das hat aber kein einziges Mal funktioniert, weil jede noch so kleine Unterbrechung der WLan-Verbindung zu einem Fehler geführt hat. Ärgerlich. Also zurück zur guten, alten Kommandozeile!
Zuerst muss man den Raspberry Pi ausschalten und die SD-Karte herausnehmen. Ein Backup während des laufenden Betriebs gilt, nach allem was ich gelesen habe, als unfassbar langwierig und fehleranfällig. Deswegen steckt man die SD-Karte in ein Lesegerät und schließt das an den Rechner an, auf dem das Backup erstellt werden soll.
Da ich nicht die ganze Festplatte meines MacBooks aufbrauchen wollte, habe ich die SD-Karte kurzerhand in den Slot meines NAS gesteckt. Es ist aber auch möglich, die Sicherungskopie auf einem normalen Rechner zu erstellen.
Als nächstes muss man herausfinden, wie das jeweilige Betriebssystem die SD-Karte benennt. Unter Linux kann man dafür zum Beispiel lsblk
nutzen, das alle Speichergeräte auflistet. Ich habe mich für df -h
entschieden. Damit lässt sich der freie Speicherplatz (‘display free…’) anzeigen. Die Option -h
bewirkt, dass die Angaben menschenfreundlich, also in GB, MB, KB etc. dargestellt werden. Solch eine Auflistung kann wie folgt aussehen:
Filesystem Size Used Avail Use% Mounted on
/dev/md0 2.4G 1.3G 1021M 56% /
none 348M 0 348M 0% /dev
/tmp 350M 1.5M 349M 1% /tmp
/run 350M 5.1M 345M 2% /run
/dev/shm 350M 4.0K 350M 1% /dev/shm
/dev/vg1000/lv 2.7T 1.4T 1.4T 50% /volume1
/dev/sdq1 1.6G 1.5G 97M 95% /volumeUSB1/usbshare1-1
Interessant ist hier der letzte Eintrag: /dev/sdq
ist die übergreifende Bezeichnung für die SD-Karte in meinem NAS. Auf meinem Mac sieht das beispielsweise so aus:
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk1s1 33Gi 214Gi 16Gi 94% 3701636 9223372036851074171 0% /
devfs 93Ki 193Ki 0Bi 100% 668 0 100% /dev
/dev/disk1s4 33Gi 3.0Gi 16Gi 17% 3 9223372036854775804 0% /private/var/vm
map -hosts 0Bi 0Bi 0Bi 100% 0 0 100% /net
map auto_home 0Bi 0Bi 0Bi 100% 0 0 100% /home
/dev/disk4s1 30Gi 2.4Mi 30Gi 1% 0 0 100% /Volumes/NO NAME
Hier geht es um /dev/disk4
. Die weiteren Zahlen nach ‘sdqX’ bzw. ‘disk4X’ geben an, um welche Partition es sich handelt. An beiden Ausgaben wird auch ersichtlich, unter welchem Mount-Punkt die Geräte in den Verzeichnisbaum eingehängt sind.
Damit es keine Fehler während und nach dem Lese- und Schreibvorgang gibt, empfiehlt es sich, die SD-Karte auszuhängen. Unter Linux nutzt man dafür umount /dev/sdq
, wenn ‘sdq’ die Bezeichnung für die SD-Karte ist. Da alle möglicherweise vorhandenen Partitionen auf der Karte ausgehängt werden sollen, kann man auf die Index-Nummer verzichten.
Auf einem Mac erreicht man dasselbe, indem man auf der Kommandozeile diskutil umountDisk /dev/disk4
eingibt und ausführt. Auch hier handelt es sich bei ‘disk4’ um die gesamte SD-Karte, so dass auf ‘disk4s1’ verzichtet werden kann.
Als nächstes muss man auf dem Mac das Programm installieren, mit dem sich Backups à la Linux erstellen lassen. Dafür braucht man allerdings Homebrew, einen Paketverwalter, der es kinderleicht macht, diverse Werkzeuge aus der Linux-Welt auf MacOS heimisch einzurichten. Homebrew installiert man über /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
. Anschließend kann mit brew install TOOL
das Werkzeug installiert werden, das man gerade braucht. Für Backups ist das gdd
. Das heißt, ich habe brew install gdd
eingegeben und abgewartet, bis Homebrew alles dafür Notwendige heruntergeladen und an einem sicheren Ort in meinem System eingerichtet hat.
Dann kommt das eigentliche Backup! Unter Linux nutzt man dd
, unter MacOS das mit Homebrew installierte gdd
. Der Aufruf folgt dem Muster [g]dd if=Pfad_zur_SD-Karte of=Pfad_zur_Sicherungsdatei status=progress bs=4M
. ‘if’ meint dabei die Kennung, die oben unter Schritt 2 herausgefunden wurde. ‘of’ gibt den Pfad und Dateinamen an, unter dem das Backup erstellt werden soll. Mit ‘status=progress’ lässt man sich auf dem Laufenden halten – das Ganze kann nämlich eine Weile dauern. ‘bs=4M’ gibt an, dass dd
immer 4MB lesen und schreiben soll. Damit legt man also die Geschwindigkeit fest.
Auf meinem NAS habe ich eingegeben: dd if=/dev/sdq of=/volume1/Sicherung/RaspberryPi/2018-10-20-Raspbian.img status=progress bs=4M
.
Unter MacOS tippt man stattdessen zum Beispiel folgendes ein: gdd if=/dev/disk4 of=/Users/ramon/2018-10-20-Raspbian.img status=progress bs=4M
.
Es kann sein, dass noch die Administratorrechte dafür notwendig sind. Falls also eine entsprechende Fehlermeldung auftaucht, stellt man einfach ein sudo
voran und gibt das Administrator-Passwort an, wenn man dazu aufgefordert wird.
Wenn man etwas Speicherplatz sparen möchte, kann die Ausgabe von ‘dd’ bzw. ‘gdd’ an ein Packprogramm wie gzip übergeben werden: [sudo] [g]dd status=progress bs=4M if=/dev/sdq | gzip > raspbian.img.gz
.
Um eine Image-Datei auf eine SD-Karte zu schreiben, geht man umgekehrt vor. Wichtig ist dabei, dass bei dem Vorgang die ganze SD-Karte komplett gelöscht wird. Es ist also ratsam, gegebenenfalls vorher die Daten zu sichern. Ebenfalls sollte man, wie unter Schritt 3 beschrieben, mit umount
bzw. diskutil umountDisk
die SD-Karte vollständig aus dem Verzeichnispfad aushängen.
Diesmal ist die Input-Datei (‘if’) das Backup-Image, die Output-Datei (‘of’) die SD-Karte. Unter Linux sieht das zum Beispiel so aus: dd if=/volume1/Sicherung/RaspberryPi/2018-10-20-Raspbian.img of=/dev/sdq status=progress bs=4M
.
Auf einem Mac aber möglicherweise wie folgt: sudo gdd if=/Users/ramon/Downloads/ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img of=/dev/disk4 bs=4M status=progress
.
Falls das Image, das man auf die SD-Karte übertragen möchte, gepackt ist, entpackt man es zuerst und übergibt die Ausgabe dann via pipe an dd
bzw. gdd
: unxz ~/Downloads/ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz | sudo gdd bs=4m status=progress of=/dev/disk4
.
Als Ausgabe habe ich dabei beispielsweise folgendes erhalten:
5000000000 bytes (5,0 GB, 4,7 GiB) copied, 2172 s, 2,3 MB/s
1192+1 records in
1192+1 records out
5000000000 bytes (5,0 GB, 4,7 GiB) copied, 2171,89 s, 2,3 MB/s
Die eingelesenen Bytes entsprechen vollständig den geschriebenen. Es hat also alle geklappt.
Viel Spaß beim Experimentieren mit unterschiedlichen Betriebssystemen für den Raspberry Pi!