Bash-Script: Raspberry Pi 3 Migration von SD auf SSD

Von | Juli 30, 2025

SD Karten halten bei mir immer nicht so lange, so dass mein Raspberry Pi 3, der 500km von Zuhause seine Arbeit verrichtet schon zweimal tot war. Glücklicherweise hatte ich ein Backup über raspibackup gemacht aber die ausserplanmäßige Reise ist trotzdem lästig gewesen.

Also habe ich mich entschlossen von SD Karte auf eine externe USB SSD umzusteigen. Hierzu dieses kleine Script:

#!/bin/bash
set -e
# Zielgerät
SSD_DEV="/dev/sda"
MOUNTPOINT="/mnt/ssd"

# Prüfen, ob Zielgerät existiert
if [ ! -b "$SSD_DEV" ]; then
  echo "Gerät $SSD_DEV nicht gefunden. Bitte überprüfe die Verbindung."
  exit 1
fi

echo "SSD wird vorbereitet: $SSD_DEV"
# Partitionieren (boot + root)
echo "Partitionieren..."
sudo parted --script "$SSD_DEV" \
  mklabel msdos \
  mkpart primary fat32 1MiB 256MiB \
  mkpart primary ext4 256MiB 100%

# Warten bis Kernel neue Partitionen sieht
sleep 2

BOOT_PART="${SSD_DEV}1"
ROOT_PART="${SSD_DEV}2"

# Formatieren
echo "Formatieren..."
sudo mkfs.vfat -F 32 "$BOOT_PART"
sudo mkfs.ext4 "$ROOT_PART"
# Mounten
echo "Mounten..."
sudo mkdir -p "$MOUNTPOINT"
sudo mount "$ROOT_PART" "$MOUNTPOINT"
sudo mkdir -p "$MOUNTPOINT/boot"
sudo mount "$BOOT_PART" "$MOUNTPOINT/boot"

# Rsync System
echo "Kopiere System (dies kann einige Minuten dauern)..."
sudo rsync -aAXv / "$MOUNTPOINT" --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/boot/*"}

# Boot-Dateien kopieren separat
sudo rsync -aAX /boot/ "$MOUNTPOINT/boot/"

# PARTUUIDs ermitteln
# Neue PARTUUIDs auslesen
ROOT_PARTUUID=$(sudo blkid -s PARTUUID -o value "$ROOT_PART")
BOOT_PARTUUID=$(sudo blkid -s PARTUUID -o value "$BOOT_PART")

echo "Neue PARTUUIDs:"
echo "  Root: $ROOT_PARTUUID"
echo "  Boot: $BOOT_PARTUUID"

# fstab anpassen
echo "Aktualisiere fstab..."
FSTAB="$MOUNTPOINT/etc/fstab"
sudo sed -i "s|PARTUUID=.* /boot|PARTUUID=$BOOT_PARTUUID /boot|" "$FSTAB"
sudo sed -i "s|PARTUUID=.* / |PARTUUID=$ROOT_PARTUUID / |" "$FSTAB"

# cmdline.txt anpassen
CMDLINE="$MOUNTPOINT/boot/cmdline.txt"
sudo sed -i "s|root=PARTUUID=[^ ]*|root=PARTUUID=$ROOT_PARTUUID|" "$CMDLINE"
echo "Migration abgeschlossen. Du kannst nun das System herunterfahren:"
echo
echo "  sudo shutdown -h now"
echo 
echo "Anschliessend entferne die SD Karte und starte das System. Es sollte jetzt von der SSD booten"

Wenn es anschließend nicht bootet, dann kann es daran liegen, dass das OTP Bit nicht gesetzt ist:

Überprüfen kannst du das mit:
vcgencmd otp_dump | grep 17:
→ Wenn Bit 0x3020000a gesetzt ist, ist USB-Boot aktiviert.

Im Zweifelsfall kannst du nach der Migration auch die SD-Karte mit nur /boot weiter nutzen, d.h. die erste Bootstufe wird noch von der SD Karte ausgeführt, danach läuft das System aber von der SSD.

Oder aber Du setzt das OTP Bit:

⚠️ Warnung:

Das OTP-Bit kann nur einmal gesetzt werden – der Vorgang ist irreversibel. Das ist in der Regel unkritisch, aber du solltest es wissen.

Anleitung:

  1. Editiere die Datei /boot/config.txt

    sudo nano /boot/config.txt
   2. Füge ganz am Ende hinzu:

program_usb_boot_mode=1

3. Speichern und neu starten:

sudo reboot

4. Nach dem Neustart, prüfe wieder:

vcgencmd otp_dump | grep 17:

→ Wenn du nun z. B. 17:3020000a siehst, ist USB-Boot aktiviert ✅

5. Jetzt wieder entfernen, um das Setzen nicht bei jedem Boot zu wiederholen:

sudo nano /boot/config.txt

→ Entferne oder kommentiere program_usb_boot_mode=1

Schreibe einen Kommentar

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