Upgrade auf größere Speicherkarte im Rasperry Pi (ohne Datenverlust)
Seit einiger Zeit habe ich einen Raspberry Pi im Einsatz, welcher verschiedene Aufgaben erledigt. (Backups, Strom Monitoring, Cups usw.) Bisher habe ich das Modell 3 B genutzt, welches ich aber aufgrund der nicht vorhandenen USB 3.0 und Gigabit Ethernet Schnittstelle früher oder später ersetzen wollte.
Vor kurzem habe ich mir dann einen Pi 4 mit satten 4GB RAM und einer 32 GB SD Karte zugelegt, um meinen Pi 3 + 16GB SD zu ersetzen. Damit ich nicht alles mögliche neu installieren musste, habe ich die Daten von der alten auf die neue SD Karte migriert. Welche Schritte ich hierfür durchführen musste, werde ich in diesem Artikel kurz erläutern.
Alles was hierfür benötigt wird, ist eine gängige Linux Distro und ein Gerät, welches einen Einschub für die SD Karten bietet.
Image erstellen
Um die Daten der bestehenden SD zu sichern, kann ein komplettes Image von dieser erstellt werden. Hierzu eignet sich das Tool „dd“.
Es gibt hierbei zwei verschiedene Ansätze, um das Image zu erstellen. Sollte der Pi nur eine möglichst kurze Downtime haben, kann das Image erstellt werden, während er noch eingeschaltet ist. Dies gelingt zum Beispiel mit folgendem Kommando per SSH:
$ ssh root@192.168.178.130 "dd if=/dev/mmcblk0 " | dd of=/tmp/pi-image.img status=progress
Dieses Kommando bewirkt, dass sich per SSH zum Pi mit der IP 192.168.178.130 verbunden wird und alles aus dem Device /dev/mmcblk0 in die Lokale Datei unter „/tmp/pi-image.img“ geschrieben wird.
Der zweite und wahrscheinlich simplere Weg wäre es, die SD Karte in einen Linux Rechner zu stecken und mit folgendem Kommando ein Image zu erstellen:
$ sudo dd if=/dev/mmcblk0 of=/tmp/pi-image.img status=progress
Image aufspielen
Im nächsten Schritt muss das eben erstellte Image auf die neue SD Karte aufgespielt werden. Wenn die SD Karte auch wieder dem Device Namen „/dev/mmcblk0“ zugewiesen wurde, sieht das Kommando zum aufspielen des Image wie folgt aus:
$ sudo dd if=/tmp/pi-image.img of=/dev/mmcblk0 status=progress
Partition vergrößern
Nachdem das Image aufgespielt wurde, muss die Partition und das Dateisystem noch an die neue Speichergröße angepasst werden. Das vergrößern der Partition gelingt wie folgt:
Aufrufen der SD mittels „fdisk“:
$ sudo fdisk /dev/mmcblk0
Ausgeben der Partitionstabelle und hierbei notieren des Startsektors der zweiten Partition (bei mir 540672):
Command (m for help): p
Disk /dev/mmcblk0: 28.94 GiB, 31046238208 bytes, 60637184 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 Disklabel type: dos Disk identifier: 0x8005b581 Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 8192 532480 524289 256M c W95 FAT32 (LBA) /dev/mmcblk0p2 540672 31116287 30575616 14.6G 83 Linux
Löschen der zweiten Partition:
Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 has been deleted.
Erstellen einer neuen Partition (hierbei muss als First Sector der eben notierte Sektor eingegeben werden):
Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p Partition number (2-4, default 2): First sector (2048-60637183, default 2048): 540672 Last sector, +/-sectors or +/-size{K,M,G,T,P} (540672-60637183, default 60637183): Created a new partition 2 of type 'Linux' and of size 28.7 GiB. Partition #2 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: N
Die Änderungen auf die SD Karte schreiben und somit auch fdisk beenden:
Command (m for help): w The partition table has been altered. Syncing disks.
Dateisystem vergrößern
Als letztes muss noch das Dateisystem vergrößert werden. Dies gelingt mit den folgenden Kommandos:
Unmounten des bestehenden Dateisystems, wenn dieses gemountet sein sollte:
$ sudo umount /dev/mmcblk0p2
Durchführen eines Dateisystem-Checks:
$ sudo e2fsck -f /dev/mmcblk0p2
e2fsck 1.45.5 (07-Jan-2020) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information rootfs: 123411/915408 files (0.2% non-contiguous), 725189/3821952 blocks
Vergrößerung durchführen:
$ sudo resize2fs /dev/mmcblk0p2
resize2fs 1.45.5 (07-Jan-2020) Resizing the filesystem on /dev/mmcblk0p2 to 7512064 (4k) blocks. The filesystem on /dev/mmcblk0p2 is now 7512064 (4k) blocks long.
Ende
Nachdem ich die beschriebenen Schritte bei mir durchgeführt hatte, konnte ich meinen neuen Raspberry Pi ohne jegliche Probleme und mit allen bisher vorhandenen Dateien booten.
Viel Spaß beim nachmachen. 🙂