Hinweis: In diesem Artikel wird 1 GB als 1000 x 1000 x 1000 Byte verstanden. Das ist i.d.R. auch das, was die SD-Karten-Hersteller für die Angabe der Kartenkapazität verwenden. Ist 1024 x 1024 x 1024 Byte gemeint, verwende ich die Einheit GiB. Wenn für die gleiche Einheit insbesondere bei den Abbildungen unterschiedliche Werte angezeigt werden, liegt das häufig daran, dass einmal die eine und dann die andere Einheit verwendet wird.


Das Problem ist das Folgende: Ich habe mit viel Mühe einen Raspberry Pi so eingerichtet, dass ich als "Windows-beheimateter" damit einigermaßen gut zurecht komme. Und ich habe -wie es sich gehört- auch regelmäßig Datensicherung betrieben. Hierzu habe ich die vielfach empfohlene Methode benutzt, ein Image mit dem Win32 Disk Imager zu ziehen. Das hat auch super funktioniert. Selbst das zurückspielen hat gut geklappt.

Dann passierte das Malheur! Ich habe mich dumm angestellt und die SD-Karten geschreddert. Kein Problem, der nächste Schreibwarenladen hatte Ersatz. Als ich auf die neu erstandene Karte eine der Sicherungen aufspielen wollte, verweigerte Win32 Disk Imager den Dienst, mit der Meldung, dass die Karte zu klein für das Image sei. Tatsächlich war die neue Karte einige MB kleiner als die ursprüngliche SD-Karte.

Nun ja, eine zweite Karte eines anderen Typs besorgt: das gleiche Problem. Auch die Internet-Gemeinde wusste keinen Rat. Das ist ziemlich blöd, weil die Karte nur zu einem Bruchteil belegt war und die etwas kleinere Karte voll ausgereicht hätte.

Weil man immer damit rechnen muss, dass SD-Karten leicht unterschiedliche Kapazitäten besitzen, z.B. wegen möglicher fehlerhafter und ausgeblendeter Sektoren, verwende ich nun das im folgenden beschriebene Verfahren.

Für den oben aufgezeigten Fall gibt es aber auch häufig eine Lösung. Diese ist im Abschnitt Datenrettung beschrieben.

In­halts­ver­zeich­nis

1. Prinzip
2. Partition-Struktur auf der SD-Karte einrichten
2.A Linux "beschaffen"
2.B Partitionen mit Raspberry Pi einrichten
3. Datensicherung & -wiederherstellung
3.A Datensicherung
3.B Datenträger wiederherstellen
4. Datenrettung
4.A Abbild auf SD-Karte übertragen
4.B Partition-Tabelle reparieren

 

Hinweis II: URS SD Utility fordert beim Programmstart Administrator-Rechte an. Das ist normal! Ohne Administrator-Rechte kann nicht direkt, d.h. unter Umgehung des Dateisystems, auf einen Datenträger zugegriffen werden.

URS SD Utility
Download 
       
     Binary      Quellcode
  Binary   Quellcode

Hinweis III: Das Programm URS SD Utility ist noch nicht perfekt, erfüllt aber i.d.R. seinen Dienst. Ich werde es im Laufe der Zeit noch verbessern.


Prinzip

Durch eine entsprechend aufgebaute Struktur der SD-Karte wird Raspbian daran gehindert, den kompletten Speicherplatz zu nutzen. Es bleibt eine kleine, unbenutzte Reserve übrig, die den verschiedenen realen Kapazitäten der SD-Karten Rechnung tragen soll. Die Reserve ist so groß, bzw. der genutzte Speicherplatz so klein, dass der genutzte Bereich auf jeden Fall auf eine "schlechte" SD-Karte passt. Bei einer SD-Karte mit nominal 32 GB Kapazität habe ich eine Partitionsgröße von 30 Mrd. Bytes gewählt. 30 Mrd. Bytes sollten passen, egal ob 1 GB als 1000 x 1000 x 1000 Byte oder als 1024 x 1024 x 1024 Byte verstanden wird.

Bei der Datensicherung wird dann der Reserve-Speicherplatz nicht mit gesichert und auch nicht wieder hergestellt, sondern nur die sicher zu Verfügung stehenden Bereiche. Hierzu benutze ich ein selbst geschriebenes Programm URS SD Utility, das ähnlich wie Win32 Disk Imager funktioniert.

Zu guter Letzt wird hinter die Nutz-Partition eine kleine "Sperr"-Partition angelegt. Dieses hindert die raspi-config Option Expand Filesystem daran, die gesamte zur Verfügung stehende Datenträgerkapazität zu allokieren.

Partition-Struktur auf der SD-Karte einrichten

Die schlechte Nachricht: das Ganze ist etwas kompliziert (zumindest habe ich keine wirklich einfache Lösung gefunden). Die gute Nachricht ist, man muss es nur einmal machen.

Eine 32 GB SD-Karte, auf die man frisch ein Raspbian-Image (hier 2015-05-05-raspbian-wheezy.img) aufgespielt hat, hat die folgende Partition-Struktur:

Raspbian Partition Struktur

Datenträger 4 ist auf meinem PC der SD-Karten-Leser. Die erste Partition ist die Boot-Partition. Danach folgst die Linux-Partition. Der größte Teil der SD-Karte ist nicht zugeordnet.

Problem: Verwendet man nun Raspbian-Konfiguration-Programm raspi-config die Option 1 Expand Filesystem: Ensures that all of the SD card storage is available to the OS, wird der restliche freie Bereich der Speicherkarte der Linux-Partition zugeordnet.

raspi-config

Damit wäre Raspbian theoretisch in der Lage, die gesamte SD-Karte mit Nutzdaten zu beschreiben. Eine solche, vollständig belegte Karte kann man nicht ohne weiteres auf eine kleinere Karte kopieren. Das würde ggf. zu korrupten Datenstrukturen führen.

Als erstes muss man also verhindern, dass Linux die gesamte SD-Karte zur Verfügung steht. Dazu habe ich auf einem Linux-Rechner mit dem Linux-Programm (ich habe kein passendes Windows-Programm gefunden) gparted zunächst die Linux-Partition auf etwa 30 GB erweitert und dann danach eine sehr kleine "Sperr-Partition" von ca. 10 MB angelegt:

Linux ist nun nicht mehr in der Lage, die gesamte SD-Karte zu nutzen. Auch die in raspi-config enthaltene Erweiterungsoption schlägt nun fehl.

Linux "beschaffen"

Wie kommt man als "Windows-beheimateter" an einen "Linux-Rechner"? Da gibt es mehrere Möglichkeiten:

USB Card Reader Die einfachste Variante ist, man nutzt den Raspberry Pi selbst. Allerdings kann die SD-Karte, mit der das System gebootet wurde, verständlicherweise nicht bearbeitet werden. Man würde sich damit den Ast absägen, auf dem, man sitzt. Man kann aber eine zweite, ggf. schlechtere Karte präparieren und mit dieser booten. Die zu bearbeitende Karte, kann man dann über einen USB Card Reader dem System zur Verfügung stellen.

ubuntu Auch recht einfach ist die Benutzung einer "Rettungs-CD", die häufig Computer-Zeitschriften beiliegen oder anderweitig leicht beschafft werden kann. In der Regel handelt es sich um ein Linux-System (z.B. Ubuntu), das von der CD gestartet werden kann und den benötigten Speicherplatz über eine RAM-Disk bezieht.
Virtual Box Installation eines Linux-System in einer virtuellen Maschine, z.B. Oracle Virtual Box. Problematisch ist es hier, den schreibenden Direkt-Zugriff auf den Datenträger zu ermöglichen.
Jemanden fragen Man fragt jemanden, der es für einen macht. Wie gesagt, man muss diese Prozedur nur einmal durchlaufen.
Im Rahmen der Datensicherung und Wiederherstellung bleibt die Struktur erhalten. Man kann sie auch auf weitere SD-Karten kopieren.
gparted gparted kann man auch über sourceforge als ISO-Image beziehen, auf eine CD brennen und dann damit booten.

Partitionen mit Raspberry Pi einrichten

Hinweis IV: Ist die Speicherkarte nicht unbenutzt, sollte sie komplett gelöscht werden, bevor das Image aufgespielt wird. Dabei werden sämtliche Bytes in sämtlichen Sektoren der Karte durchgängig mit dem gleichen Wert "0" belegt. Wenn man dann später zur Datensicherung einen Abzug der SD-Karte macht, kann der hierfür benötigte Speicherplatz auf den wirklich benutzen Teil reduziert werden. Ein Komprimierungswerkzeug (RAR, ZIP, komprimiertes Laufwerk) kann dann die immer noch unbelegten Teil nahezu restlos komprimieren. Wer will schon nahezu 30 GB Nullen speichern? Aus dem gleichen Grund sollte man hin und wieder die unbelegten Bereiche der SD-Karte bereinigen (mit "0" beschreiben, z.B. mit KillDisk), um Sektoren mit Resten von gelöschten Dateien wieder optimal komprimierbar zu machen.

Die Initiale Löschung der SD-Karte, kann auch mit dem weiter unten vorgestellten Werkzeug erfolgen.

Im Folgenden beschreibe ich, wie man das Ganze nur mit einem Raspberry Pi bewerkstelligt.

Zunächst einmal muss gparted installiert werden:

~ $ sudo apt-get install gparted

Danach steckt man die zu bearbeitende SD-Karte in einen USB-Adapter und steckt diesen dann in einen freien USB-Slot des Raspberry PI. Sinnvollerweise schaut man sich zunächst einmal an, was der Raspberry alles an Speichermedien bereit hält:

~ $ sudo fdisk -l

Disk /dev/mmcblk0: 30.9 GB, 30908350464 bytes
4 heads, 16 sectors/track, 943248 cylinders, total 60367872 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa6202af7

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    58593750    29235435+  83  Linux
/dev/mmcblk0p3        58595328    58613759        9216    c  W95 FAT32 (LBA)

Disk /dev/sda: 31.9 GB, 31914983424 bytes
64 heads, 32 sectors/track, 30436 cylinders, total 62333952 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa6202af7

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/sda2          122880     6399999     3138560   83  Linux

 /dev/mmcblk0 ist das Boot-Laufwerk, das schon die oben aufgeführte Struktur besitzt. Die Laufwerksbezeichnungen habe ich mit rot hervorgehoben. /dev/sda ist das frisch aufgespielte Raspbian auf einer SD-Karte in einem SD-Card-Reader in einem USB-Slot, erkennbar an der Partition-Anzahl (Die Bezeichnung muss nicht zwangsläufig /dev/sda sein. Je nach Situation kann sie auch anders sein!) Dieser Karte will ich die oben beschriebene Struktur verpassen. /dev/sda1 und /dev/sda2 sind die Bezeichnung für die beiden Partitionen auf der Karte.

gparted benötig die grafische Oberfläche. Die folgenden Screenshot sind mit TightVNC Viewer gemacht. Also: grafische Benutzeroberfläche starten, Menüpunkt Run wählen und gparted starten. gparted benötigt Administrator-Berechtigungen, das Zauberwort ist gksudo.

gparted starten

Wenn gparted gestartet ist, muss zunächst das richtige Device ausgewählt werden.

Wird ein Speichermedium dem System per USB hinzugefügt, wird dieses automatisch eingehängt ("ge-mount-et"). Dies ist erkennbar am Schlüssel-Symbol in der Partition-Liste. Die Partition muss man zunächst aushängen:

Device auswählen und Partition aushängen

Danach verschwindet das Schlüssel-Symbol und der Menüpunkt Größe ändern/verschieben im Kontextmenü ist freigeschaltet.

Partition-Ändererung starten

Anschließend wird die gewünschte Größe in dem erscheinenden Dialogfeld eingestellt. Betätigt man die Schaltfläche Größe ändern/verschieben speichert diese Aufgabe (gparted führt Änderungsaufträge nicht direkt aus, sondern speichert sie als Aufgabe und erledigt alle Aufträge gemeinsam zum Schluss).

Partitiongröße einstellen

gparted zeigt nun die neue Partition-Struktur an. Im nicht zugeteilten Bereich kann nun eine neue Partition (die "Sperr-Partition", s.o.) angelegt werden.

Sperr-Partition anlegen

Sperr-Partition einrichten

gparted hat sich alle Aufträge gemerkt. Die Schaltfläche Alle Operationen ausführen startet die Anpassung der Partition-Tabelle:

Anpassung durchführen

gparted rattert eine Weile und meldet sich dann (hoffentlich!) mit der Bestätigung der erfolgreichen Durchführung der Anpassungen.

Erfolgsmeldung

PERFECTUM EST ! (Zitat aus Latein für Angeber )

Erfolgsmeldung

 

Datensicherung & -wiederherstellung

Die folgenden Abschnitte beschreiben, wie Datensicherung & -wiederherstellung mit URS SD Utility (Download des Tools am Anfang dieser Seite) funktioniert. In den Beispielen wird mit einer SD-Karte gearbeitet. Das Ganze funktioniert genauso mit einem USB-Speicher-Stick oder anderen Wechseldatenträgern. Die Dateien die URS SD Utility benutzt, sind 1:1-Speicherabbilder. Es wird einfach Sektor für Sektor übertragen. Es wird nichts hinzugefügt oder verändert. Die im Netz bereitstehenden Images zum initialen Aufspielen eines Betriebssystem sind ebenfalls einfache Speicherabbilder und können von URS SD Utility verwendet werden.

Der erste Schritt ist immer die Auswahl des zu bearbeitenden Datenträgers.

Datenträger auswählen

Ist dies geschehen, werden wesentliche Eckdaten des Datenträgers angezeigt und die Schaltflächen zu dessen Bearbeitung freigegeben. Damit man sich nicht versehentlich sein System zerschießt, geschieht die Freischaltung der Schaltflächen nur dann, wenn ein Wechseldatenträger (Removable Media) ausgewählt wurde.

Eckdaten des Datenträger und Aktionsauswahl

Es stehen vier Aktionen zur Verfügung:

Schaltfläche Funktion
Datenträger sichern Der Inhalt des ausgewählten Wechseldatenträgers wird in eine Datei kopiert. Details hierzu s.u.
Datenträger wiederherstellen Der Inhalt einer Datei wird auf den ausgewählten Wechseldatenträger kopiert. Diese Aktion eignet sich auch zum initialen Aufspielen des Betriebssystems. Details zur Datenträgerwiederherstellung hierzu s.u.
Partition-Table löschen Wurde auf eine SD-Karte bereits einmal ein Raspbian aufgespielt, sieht Windows nur noch die ca. 60 MB große Boot-Partition. Diese Aktion löscht die Partition-Table des Datenträgers (Die ersten beiden Sektoren werden mit "0" beschrieben). Danach lässt sich der Datenträger unter Windows formatieren.
Datenträger löschen Der gesamte Datenträger wird mit "0" beschrieben.

Datensicherung

Bei der Datensicherung wird der ausgewählte Datenträger 1:1 in eine Datei kopiert. Hierbei kann man aussuchen, ob der gesamte Datenträger kopiert werden soll oder ob ungenutzte Bereiche am Ende des Datenträgers ausgelassen werden sollen. Letzteres ist die Voreinstellung. Die Auslassung ungenutzter Bereiche ermöglicht die sichere Nutzung evtl. etwas kleinerer Datenträger (s.o.).

Dateiauswahl zur Datensicherung

Nach Drücken der Schaltfläche OK geht es dann los:

Fortschrittsanzeige Datensicherung

Datenträger wiederherstellen

bei dieser Aktion wird eine Speicherabbilddatei auf den Datenträger kopiert. Diese Option eignet sich auch zum initialen Aufspielen eines im Netz verfügbaren Betriebssystem-Images.

Beim Start-Dialog für diese Aktion wird zunächst die Image-Datei ausgewählt:

Dateiauswahl zur Datenträgerwiederherstellung

Ja nach dem, wie groß die ausgewählte Datei im Bezug zur Kapazität des Datenträgers ist, gilt es, zwischen unterschiedlichen Möglichkeiten auszuwählen.

Datei kleiner als Datenträgerkapazität

Es kann bestimmt werden, was mit dem unbenutzten Rest des Datenträgers geschehen soll. Die Voreinstellung ist, diese zu löschen, d.h. mit "0" zu überschreiben.

Startdialog bei Datei kleiner als Datenträgerkapazität

Datei größer als Datenträgerkapazität

Diese Situation zu umgehen, ist eigentlich Sinn dieses Artikels. Die Schaltfläche OK ist sicherheitshalber blockiert. Wie man dennoch etwas retten kann, ist im nachfolgenden Abschnitt Datenrettung beschrieben.

Startdialog bei Datei größer als Datenträgerkapazität

Datenrettung

Ist es dann doch aus irgendwelchen Gründen passiert, dass man ein Image hat, dass nicht auf eine SD-Karte passt (siehe Problembeschreibung zu Anfang), hat eine große Chance, aus einem gesicherten Abbild eine etwas kleinere, lauffähige SD-Karte herzustellen. Das Ganze klappt natürlich nur dann, wenn der real genutzte Bereich auf die kleinere Karte passt. Ist das nicht der Fall, ist man als Laie praktisch chancenlos.

Im folgenden Bespiel habe ich eine Datensicherung von einer 32 GB SD-Karte mit einem relativ frisch aufgespielten Raspbian auf eine 8 GB Karte zum Laufen gebracht. "Relativ frisch aufgespielt" heißt, es wurden eine Reihe von Einstellungen vorgenommen (z.B. WLAN-Konfiguration) aber noch keine nennenswerte weitere Software oder Daten aufgespielt. Der real genutzte Bereich sollte also nur etwas größer sein, als das ursprünglich installierte Raspbian-Image, d.h. etwa 3 GB. Vom Speicherplatz her sollte es also problemlos möglich sein, sämtliche Nutzdaten auf die 8 GB Karte zu transferieren. Versucht man dies mit dem Win32 Disk Imager, erhält man folgende Fehlermeldung:

Win32 Disk Imager Fehlmeldung

Die Datenrettung erfolgt in drei Schritten:

Abbild auf SD-Karte übertragen

URS SD Utility (Download am Anfang dieser Seite) zeigt an, wenn das Speicherabbild zu groß für den Datenträger ist.

Speicherabbild übertsteigt Datenträgerkapazität

Man muss den Haken bei "Datei größer als Datenträgerkapazität" setzen, um die OK-Schaltfläche freizuschalten. Drückt man dann OK, wird die SD-Karte ganz normal beschrieben. Nach dem teilweisen Aufspielen des Abbilds ist die Karte nicht nutzbar. Z.B. zeigt die Datenträgerverwaltung unter Windows an, dass sich auf der SD-Karte eine einzige Partition mit der Gesamt-Speicherkapazität befindet, und schlägt vor, diese zu formatieren.

Ungültige Partition-Tabelle nach dem teilweisen Aufspielen der Abbild-Datei

Partition-Tabelle reparieren

Hier hilft TestDisk. Man wählt das richtige Laufwerk aus und startet die Analysefunktion. Wenn alles gut geht, macht TestDisk einen Vorschlag, wie die Partitionen strukturiert werden sollen.

TestDisk Vorschlag

Mit Enter bestätigt man den Vorschlag. Nach ein paar weiteren Sicherheitsabfragen schreibt TestDisk dann die neue Partition-Tabelle weg. Und siehe da, die Datenträgerverwaltung zeigt die richtige Struktur.

Von TestDisk reparierte Partition-Tabelle

Mit dieser SD-Karte kann man nun prüfen, on ein Raspberry damit bootet. Ist dies der Fall, sollte man die Partition-Struktur wie oben beschrieben, manuell bearbeiten.

Hinweis V: Beim Test der SD-Karte in einem Raspberry darf auf keinen Fall die Option "1 Expand Filesystem" im raspi-config Menü gewählt werden (s.o.)!