Website-Icon HOPPLIN GmbH [dev] Blog

Raspberry Pi SD-Karten Image erstellen und komprimieren

Raspberry PI with Cases
5/5 - (1 vote)

Aktuell befasse ich mich mit Docker-/Kubernetes Cluster. Dazu habe ich ein spannendes Projekt gefunden – Hypriot OS – mit diesem kann ich meine aktuell 4 beschäftigungslosen Raspberry Pi 3B mit Arbeit versorgen und 2 neue Raspberry Pi 4 der Familie hinzufügen. Dazu muss ich ein Image für die Raspberry Pi auf eine SD Karte erstellen. Weil ich kein 64GB Image vorhalten möchte, habe ich eine Möglichkeit gefunden, das Basis-Image auf minimale Größe zu komprimieren und so belegt sie mit 2GB nur einen Bruchteil der Original-Größe.

Für diesen Artikel verwendete Produkte

Für diesen Artikel wurden folgende Produkte verwendet:

Erstellung des Master Images

Für die Erstellung des Master Images wird das Hypriot Image heruntergeladen:
blog.hypriot.com/downloads/

Aktuell ist bei mir die Version 1.10.0.

auf blog.hypriot.com/downloads/ oder github.com/hypriot

Nach dem Herunterladen startest du das vorher installierte ApplePI Baker und kopierst das frische Image auf die SD Karte.

Anschließend kommt die SD Karte in einen Raspberry Pi und dieser wird mit Monitor, Tastatur und Netzwerk gestartet.

Ich habe das Netzwerk eingerichtet und alle Software-Updates installiert, so dass die Installation auf dem neuesten Stand ist. Außerdem habe ich den Piraten-Benutzer entfernt und einen eigenen neuen Benutzer hinzugefügt.

pirate@hypriot: sudo apt update && sudo apt dist-upgrade -y
...
pirate@hypriot: sudo useradd demouser

Achtung: Für den Benutzer müssen Superufer-Rechte eingerichtet werden, bevor der Pirat gelöscht wird. Sonst hast du keine Möglichkeit mehr eine privilegierte Aufgabe auszuführen. Dazu kannst du für den Benutzer eine neue Datei im Verzeichnis /etc/sudoers.d anlegen. Ich gebe der Datei den gleichen Namen wie dem Benutzer: demouser und dann bekommt die Datei folgenden Inhalt:

demouser ALL=(ALL) NOPASSWD: ALL

oder mit Passwort-Eingabe als Sicherheitsstufe:

demouser ALL=(ALL:ALL) ALL

Anschließend als demouser in der Konsole anmelden und testen, ob mittels sudo reboot -n der Raspberry Pi neu gestartet werden kann.

Ich empfehle dir, sämtliche Caches und temporäre Daten im System zu löschen. Dazu helfen dir Befehle wie:

demouser@hypriot: sudo apt autoclean

Raspberry Pi SD Karte als Master erstellen

Sofern das System jetzt dem entspricht, was du haben wolltest, kannst du den Raspi herunterfahren und die Karte herausnehmen. Das Image, das wir jetzt erstellen, ist erstmal genauso groß, wie die SD Karte. Also in meinem Fall 64 GB. Bitte beachte, dass du für das Erstellen des Images jetzt 64 GB freien Speicher brauchst.

Dabei führst du den gleichen Schritt aus, wie beim Erstellen der SD-Karte, allerdings in gedrehter Reihenfolge.

Nun hast du ein Image, meines heißt: myHypriot.img
Jetzt musst du die Datei öffnen und erstmal den leeren Bereich der Platte mit Nullen überschreiben, dazu führst du folgende Schritte aus:

user@ubuntu: mkdir -p ~/img
user@ubuntu: mount -t udf myHypriot.img ~/img -o loop 
user@ubuntu: lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
 loop0                       7:0    0  88,4M  1 loop /snap/core/7169
 loop1                       7:1    0  54,4M  1 loop /snap/core/1055
 loop2                       7:2    0  88,5M  1 loop /snap/core/7270
 loop3                       7:3    0  97,1M  1 loop /snap/core/2435
 loop4                       7:4    0  95,3M  1 loop /snap/core/1054
 loop5                       7:5    0  54,4M  1 loop /snap/core/1049
 loop6                       7:6    0  59,5G  0 loop
 ├─loop6p1                 259:0    0    64M  0 part
 └─loop6p2                 259:1    0  59,4G  0 part
 mmcblk0                   179:0    0  58,2G  0 disk
 ├─mmcblk0p1               179:1    0   512M  0 part /boot/efi
 ├─mmcblk0p2               179:2    0     1G  0 part /boot
 └─mmcblk0p3               179:3    0  56,8G  0 part
   ├─ubuntu--vg-ubuntu--lv 253:0    0  54,8G  0 lvm  /
   └─ubuntu--vg-swap0      253:1    0     2G  0 lvm  [SWAP]

In meinem Fall ist das Image unter loop6 gemountet. Heißt, ich führe jetzt einen Füllprozess aus, der den leeren Image-Platz mit dem Füllen einer Datei beschreibt. Anschließend wir diese Datei gelöscht. So habe ich einen komplett leeren Platz in dieser Datei. Die erscheinenden Fehler einfach ignorieren.

user@ubuntu: for part in /dev/loop6p*; do mount $part /mnt; dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M; rm /mnt/filler; umount /mnt; done
 dd: error writing '/mnt/filler': No space left on device
 25+0 records in
 24+0 records out
 25853952 bytes (26 MB, 25 MiB) copied, 0,16626 s, 156 MB/s
 rm: remove regular file '/mnt/filler'? yes
 dd: Fehler beim Schreiben von '/mnt/filler': Auf dem Gerät ist kein Speicherplatz mehr verfügbar
 56069+0 Datensätze ein
 56068+0 Datensätze aus
 58791837696 Bytes (59 GB, 55 GiB) kopiert, 1526,08 s, 38,5 MB/s
 rm: Normale Datei '/mnt/filler' entfernen? yes

So, wir sind leider noch nicht fertig, allerdings haben wir jetzt in der Datei myHypriot.img den leeren Bereich aus dem Festplatten-Image in den nicht allokierten Bereich geschoben. Mittels dem Tool gparted können wir diesen Bereich aus der Datei entfernen und haben so den leeren Speicherbereich aus der Datei entfernt.

Mit dem Klick auf den nicht allokierten Bereich kannst du diesen Bereich löschen. Anschließend klickst du auf übernehmen um die Änderungen zu schreiben.

Die Datei wird jetzt entsprechend der Änderung angepasst und hat nach dem Anpassen die Größe, die mit Daten belegt sind. Diese Datei hat bei mir knapp 3 GB und ist schneller auf eine neue SD Karte kopiert.

Übrigens: Beim Starten vergrößert das System automatisch seinen Speicher auf die Größe der SD Karte. Allerdings kannst du dieses Image jetzt auch auf kleinere Karten (> 4GB) kopieren und laufen lassen. Cool oder?

Die mobile Version verlassen