Zielstellung
Erstelung eines Backups einer SD-Karte am Beispiel Raspberry Pi.
Reduzierung des benötigten Speicherplatzes auf dem Host.
Ergebnis
Device |
Größe in GB |
Größe in 1M-Blöcke |
SD-Karte |
15G |
56M + 14484M |
backup.img |
15G |
14840M |
backup.tar.gz |
5.0G |
5019M |
backup.img(1) |
7.5G |
7598M |
backup.tar.gz(1) |
4.5G |
4601M |
(1) Mit verkleinerter rootfs Partition.
Zur Anzeige der Größe in 1M-Blöcken, wurden folgende Kommandos verwendet.
#für Verzeichnisse
ls --block-size=M -l
#für Device X
df --block-size=M /dev/sdbX
Hintergrund
Eine SD-Karte für das Raspberry Pi enthält zwei Partitionen.
Die Erste ist die s.g. Boot Partition, welche den Bootloader, das Kernel Image usw. enthält.
Die Zweite enthält das Rootfs mit den eigentlichen Daten.
Mit dem tool raspi-config, kann die zweite Partition auf die Größe der verwendeten SD-Karte erweitert werden.
Die folgende Ausschrift wurde mittels fdisk (vom HOST aus) erstellt und enthält den Inhalt einer 16GB SD-Karte, welche hier als Beispiel genommen wird.
#das verwendete device muss an das eigene System angepasst werden
$sudo fdisk -l /dev/sdb
Disk /dev/sdb: 15.6 GB, 15560867840 bytes
64 Köpfe, 32 Sektoren/Spur, 14840 Zylinder, zusammen 30392320 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x00092fac
Gerät boot. Anfang Ende Blöcke Id System
/dev/sdb1 8192 122879 57344 c W95 FAT32 (LBA)
/dev/sdb2 122880 30392319 15134720 83 Linux
Mit dem Tool df kann der freie Speicherplatz angezeigt werden.
$df -h /dev/sdb1
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb1 56M 23M 34M 40% /media/boot
$df -h /dev/sdb2
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sdb2 15G 6,8G 6,8G 51% /media/rootfs
Wie man sieht wurde das rootfs auf die volle Größe der SD-Karte erweitert und ist zur Hälfte befüllt.
Backup erstellen
Um das Backup zu erstellen, kann am einfachsten auf dd zurückgegriffen werden. Dieses erzeugt ein vollständiges Abbild der gesamten SD-Karte, d.h. es wird ein Image mit der selben Größe wie die der SD-Karte angelegt, egal ob das rootfs auf die gesamte Größe erweitert wurde. Zum Lesen des SD-Karten Devices werden root Rechte benötigt, um das Image anschließend zu bearbeiten, müssen die Rechte entsprechend geändert werden.
#das verwendete device muss an das eigene System angepasst werden
$sudo dd if=/dev/sdb of=backup.img
$sudo chown user:usergroup backup.img
Standardmäßig zeigt dd keinen Fortschritt an, dies kann aber wie folgt "ergänzt" werden. Hiermit wird dd zyklisch ein Signal gesendet, in Folge dessen es den aktuellen Stand des Kopierprozesses ausgibt.
$ sudo dd if=/dev/sdb of=backup.img&
[1] pid
$ sudo watch --interval 10 kill -USR1 pid
Alle 10,0s: kill -USR1 6068
...
5121777+0 Datensätze ein
5121776+0 Datensätze aus
2622349312 Bytes (2,6 GB) kopiert, 54,0639 s, 48,5 MB/s
...
#Am Ende muss watch noch mit STRG+C beendet werden.
Schaut man sich jetzt die Größe des Backups an, sieht man das es wie die SD-Karte 15GB groß.
Speicherplatz reduzieren
Der erste Ansatz die Größe des Backups zu reduzieren, ist das Image zu komprimieren.
tar -czf backup.tar.gz backup.img
Als Ergebnis reduziert sich die Größe von 15GB auf 5GB. Wenn das ausreichend ist, kann an dieser Stelle aufgehört werden.
Optimierung
Wenn man die komprimierte Größe weiter reduzieren möchte, können folgende Punkte berücksichtigt werden.
Rootfs Partition verkleinern
Um ein SD-Karten Image unter Linux mit gparted zu bearbeiten, muss zuvor ein loop device angelegt werden.
Dazu wird das tool losetup benötigt. Falls das loop modul als ladbares Kernel Modul verwendet wird, muss dieses zunächst geladen werden. Dieser Ansatz kann auch dafür verwendet werden, wenn man das Image auf einer kleineren SD-Karte (z.b. 16GB -> 8GB) verwenden möchte.
Als Zweites muss das erste freie loop device herausgesucht werden.
Angenommen das erste freie loop device ist /dev/loop0, wird dieses verwendet, um dieses mit dem SD-Karten Image einzurichten.
sudo losetup /dev/loop0 backup.img
Im Nächsten Schritt wird die Partitions Tabelle des loop devices (eigentlich des SD-Karten Images) dem System bekannt gemacht.
sudo partprobe /dev/loop0
Jetzt können die Partitionen des SD-Card images mit gparted geändert (verkleinert/vergrößert) werden. Dazu die neue Größe so anlegen, dass diese etwas Größer ist, als der belegte Speicher des rootfs. An der Größe der boot Partition darf NICHTS geändert werden.
Am Ende kann das loop device mit folgendem Befehl wieder gelöscht werden.
sudo losetup -d /dev/loop0
Bis jetzt hat sich aber an der Image Größe noch Nichts geändert, nur die Partition des rootfs ist jetzt kleiner geworden. Das Ergebnis kann man sich wieder mittels fdisk ansehen.
$fdisk -l backup.img
Disk backup.img: 15.6 GB, 15560867840 bytes
255 Köpfe, 63 Sektoren/Spur, 1891 Zylinder, zusammen 30392320 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x00092fac
Gerät boot. Anfang Ende Blöcke Id System
backup.img1 8192 122879 57344 c W95 FAT32 (LBA)
backup.img2 122880 15560703 7718912 83 Linux
Um jetzt auch das Image zu verkleinern, kann dieses mit truncate auf die geänderte Größe der Partionen angepasst werden.
#truncate --size=$[(Ende+1)*sector size] backup.img
truncate --size=$[15560704*512] backup.img
In meinem Beispiel konnte die Größe des Image auf 7.5GB und komprimiert auf 4.5GB reduziert werden. Außerdem besteht so die Möglichkeit das Image ggfls. auch auf einer 8GB SD-Karte zu verwenden.
Rootfs aufräumen
Ein recht einfacher Weg die Größe zu reduzieren, ist nicht benötigte Daten zu löschen. Zuerst wird wie im Schritt "Rootfs Partition verkleinern" beschrieben, ein loop device angelegt, welches anschließend gemounten und bearbeitet werden kann.
mkdir rootfs
sudo mount /dev/loop0p2 rootfs
#löschen nicht benötigter Daten etc.
sudo umount rootfs
Komprimierung verbesseren
Zur Verbesserung der Komprimierung, kann der freie Speicherplatz mit NULL beschrieben werden, dazu kann das Tool zerofree verwendet werden. Dies ist Notwendig, da gelöschte Daten nicht physikalisch gelöscht werden, sondern nur der Eintrag im Dateisystem. Dies führt bei der Komprimierung dazu, dass dieser Bereich nicht optimal verkleinert werden kann. Wie stark der Effekt ist, hängt natürlich vom verwendeten Image ab. Be
Zuerst, wie im Schritt "Rootfs Partition verkleinern" beschrieben ein loop device anlegen, dann zerofree anwenden und am Ende das Image komprimieren.
sudo zerofree -n /dev/loop0p2
Powered by Pelican. Theme blueidea, inspired by the default theme.