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.
Inhaltsverzeichnis
1. Prinzip
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 |
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.
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.
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:
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.
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.
Wie kommt man als "Windows-beheimateter" an einen "Linux-Rechner"? Da gibt es mehrere Möglichkeiten:
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. |
|
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. |
|
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. | |
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 kann man auch über sourceforge als ISO-Image beziehen, auf eine CD brennen und dann damit booten. |
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.
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:
Danach verschwindet das Schlüssel-Symbol und der Menüpunkt Größe ändern/verschieben im Kontextmenü ist freigeschaltet.
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).
gparted zeigt nun die neue Partition-Struktur an. Im nicht zugeteilten Bereich kann nun eine neue Partition (die "Sperr-Partition", s.o.) angelegt werden.
gparted hat sich alle Aufträge gemerkt. Die Schaltfläche Alle Operationen ausführen startet die Anpassung der Partition-Tabelle:
gparted rattert eine Weile und meldet sich dann (hoffentlich!) mit der Bestätigung der erfolgreichen Durchführung der Anpassungen.
PERFECTUM EST ! (Zitat aus Latein für Angeber )
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.
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.
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. |
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.).
Nach Drücken der Schaltfläche OK geht es dann los:
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:
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.
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.
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.
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:
Die Datenrettung erfolgt in drei Schritten:
URS SD Utility (Download am Anfang dieser Seite) zeigt an, wenn das Speicherabbild zu groß für den Datenträger ist.
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.
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.
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.
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.)!