SD-Karte_im_Schraubstock

RaspberryPi-Image verkleinern mit PiShrink

Bisher habe ich in unregelmäßigen Abständen die Speicherkarte meiner Raspberry Pis dadurch gesichert, dass ich den Raspi heruntergefahren, die Speicherkarte herausgenommen, selbige an meinem Windows-Rechner mittels Win32DiskImager ausgelesen und die entstandene Imagedatei auf meinem NAS gespeichert habe. So konnte ich im Notfall diese Imagedatei mittels Win32DiskImager auf eine SD-Karte schreiben und hatte einen älteren Stand des Systems damit griffbereit. Allerdings hat diese Methode ein paar Nachteile:

  1. In der Zeit des Auslesens ist der Raspi natürlich aus und damit nicht verfügbar, da ihm ja sein Betriebssystem zu diesem Zeitpunkt fehlt.
  2. Die entstandene Imagedatei ist genau so groß wie die Speicherkarte selbst, auch wenn große Teile der Speicherkarte keine Daten enthalten. Dieses Backup nimmt also auf meinem NAS unnötig viel Platz weg.
  3. Da die Speicherkarten selbst bei gleicher Speicherangabe geringfügig unterschiedliche Speicherkapazitäten haben, kann es vorkommen, dass die Imagedatei auf eine vermeintlich gleich große Speicherkarte nicht drauf passt.

Den ersten Punkt kann man dadurch lösen, indem man das Erstellen der Imagedatei nicht mittels Win32DiskImager unter Windows macht, sondern den Raspberry Pi selbst dazu bringt, eine Kopie von sich selbst anzulegen.

Auf der GitHub-Seite github.com/Drewsif/PiShrink/ kann man das geniale Script PiShrink herunterladen, dass dafür sorgen wird, dass unsere Imagedatei verkleinert wird. Und es gibt ein weiteres Gimmick, beim ersten Start des verkleinerten Images wird die Partition automatisch wieder auf die volle Größe der SD-Karte ausgedehnt und damit der komplett verfügbare Speicherplatz genutzt. Da ich bisher noch Windows-Nutzer bin, steht mir zum Ausführen des (Linux-)Scripts nur der Raspberry Pi selbst zur Verfügung. Meine Lösung besteht darin, dass ich auf dem Raspi ein Verzeichnis auf meinem NAS mounte, im laufenden Betrieb des Raspi die laufenden Dienste wie Webserver oder fhem stoppe, und dann eine 1:1-Sicherung des Systems erstelle, die auf dem NAS-Verzeichnis gespeichert wird. Nach dem Erstellen des Backups werden die gestoppten Dienste automatisch wieder gestartet. Als Ergebnis liegt dann eine Imagedatei auf meinem NAS. Wie das genau gemacht wird, habe ich in meinem Beitrag RaspberryPi – Backup im laufenden Betrieb beschrieben.

Fangen wir also an dem Punkt an, das wir bereits ein Image unseres Raspberry Pi haben (entweder mittels Win32DiskImager oder durch ein direktes Backup unter Linux erstellt). Da ich wie gesagt keinen weiteren „großen“ Linux-Rechner habe, auf dem ich genügend Platz hätte, um die Imagedatei zu verarbeiten, muss ich auch wieder meinen Raspi nutzen, das NAS-Verzeichnis mounten und das Script auf die Datei in dem gemounteten Verzeichnis loslassen.

Auf dem NAS habe ich ein Verzeichnis //pibackup für einen Nutzer raspberry freigegeben, dessen Passwort geheim ist (Natürlich habe ich ein Passwort gewählt, dass sicher ist und geheim ist nur ein Pseudonym). Dort liegt die Imagedatei, die wir verkleinern wollen.

Um auf dieses Verzeichnis vom Raspberry Pi aus zugreifen zu können, muss es gemountet werden. Unter Linux gibt es keine Laufwerksbuchstaben wie unter Windows üblich. Man kann durch das Mounten Verzeichnisse von anderen Freigaben mehr oder weniger irgendwo einhängen. Wir legen also im Nutzerverzeichnis unseres Nutzers pi ein Unterverzeichnis an und nennen es backup:

Nun hängen wir in dieses Verzeichnis backup das auf dem NAS befindliche Verzeichnis pibackup ein.

Wenn wir nun in das Verzeichnis backup wechseln und uns den Inhalt anzeigen lassen, sollten wir die Dateien sehen, die sich auf dem NAS im Verzeichnis pibackup befinden (im Folgenden gehen wir davon aus, dass meine dort befindliche Imagedatei raspibackup.img heißt):

Erfolgreich? Dann weiter!

Nun laden wir uns das Script PiShrink herunter und speichern es ab. Ich habe mir dazu im Homeverzeichnis des Nutzers ein Verzeichnis /bin angelegt.

Anschließend sorgen wir dafür, dass die Datei ausführbar wird:

Das Script hat wenige Optionen. Ein Aufruf ohne Parameter

führt dazu, dass PiShrink eine kleine Hilfe ausgibt:

Das bedeutet also, dass man mindestens einen Dateinamen angeben muss, damit PiShrink etwas tut. Ist ja auch logisch, woher sollte das Script sonst wissen, welche Datei es verkleinern soll.

Optional kann man auch den zweiten Parameter newimagefile.img mit angeben. Der sorgt dafür, dass die Verkleinerung nicht auf der Original-Datei sondern auf einer Kopie erfolgt.

Der optionale Parameter -s sorgt dafür, dass PiShrink nicht die Anweisung in die Datei /etc/rc.local einbaut, nach dem ersten Starten des Images die Partition zu vergrößern. Diesen Schalter sollte man setzen, wenn es sich nicht um Raspbian-basierte Images handelt (z.B. OpenELEC). Diese Distributionen haben eine leicht andere Verzeichnisstruktur und die Datei /etc/rc.local existiert dort nicht.

Rufen wir also folgendes auf

dann sollte PiShrink anfangen, die Datei raspibackup.img in die Datei raspibackup-kleiner.img zu kopieren. Je nach Größe dauert das eine Weile. Ist die Kopie erstellt, dann beginnt die Komprimierung. Es wird noch mal geprüft, ob es Probleme in der Verzeichnisstruktur gibt. Am Ende sollte die Kopie um einiges kleiner sein als das Original, je nach dem, wie viel ungenutzter Platz in dem Image vorher verfügbar war.

Anschließend kann die verkleinerte Imagedatei z.B. mittels Win32DiskImager auf eine kleinere SD-Karte kopiert werden. Sicherheitshalber sollte man diese SD-Karte dann mal in den Raspi stecken und booten. Läuft alles wieder? Wenn ja – Glückwunsch!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.