Raspberry Pi SD-Karten-Backup über das Netzwerk erstellen

SD-Karten sind ein zentraler Bestandteil des Raspberry Pi, aber sie sind auch anfällig für Ausfälle. Regelmäßige Backups sind daher entscheidend, um Datenverluste zu vermeiden und eine schnelle Wiederherstellung zu ermöglichen. In diesem Beitrag wird beschrieben,

SD-Karten sind ein zentraler Bestandteil des Raspberry Pi, aber sie sind auch anfällig für Ausfälle. Regelmäßige Backups sind daher entscheidend, um Datenverluste zu vermeiden und eine schnelle Wiederherstellung zu ermöglichen. In diesem Beitrag wird beschrieben, wie man mithilfe eines Bash-Skripts über das Netzwerk ein Backup einer SD-Karte erstellen kann. Wir erklären Schritt für Schritt, wie das Skript funktioniert und wie Sie es an Ihre Bedürfnisse anpassen können.

Warum sind SD-Karten so anfällig?

Die meisten Raspberry-Pi-Geräte verwenden SD-Karten als primären Speicher. Diese Karten sind zwar kostengünstig und kompakt, haben aber folgende Schwachstellen:

  1. Begrenzte Lebensdauer: Jede Speicherzelle einer SD-Karte hat eine begrenzte Anzahl von Schreibzyklen.
  2. Korruption: Stromausfälle oder unsachgemäße Abschaltungen können zu Dateisystemfehlern führen.
  3. Defekte: Physische Beschädigungen oder minderwertige Qualität können die Lebensdauer erheblich verkürzen.

Durch regelmäßige Backups können Sie Ihre Daten und Konfigurationen sichern und bei einem Ausfall schnell wiederherstellen.


Ziel des Skripts

Das vorgestellte Bash-Skript:

  • Erstellt ein komprimiertes Backup der gesamten SD-Karte.
  • Speichert das Backup auf einem Netzwerk-Speicher (SMB-Share).
  • Beinhaltet Mechanismen zur Überwachung des Fortschritts und zur Fehlermeldung.

Voraussetzungen

  1. Netzwerk-Speicher: Ein Server oder NAS, der SMB/CIFS unterstützt.
  2. Berechtigungen: Zugriffsdaten (Benutzername und Passwort) für den SMB-Share.
  3. Tools: Das Skript verwendet übliche Linux-Tools wie dd, gzip und mount.
  4. Speicherplatz: Genügend freier Speicher auf dem Ziel-Backup-Speicher.

Das Bash-Skript im Detail

Hier ist das Skript, das wir analysieren werden:

#!/bin/bash

# Konfigurierbarer Backup-Name
BACKUP_NAME="zero1"  # Standardname für das Backup (kann angepasst werden)

# Setze die Variablen für Ziel und Quellverzeichnis
BACKUP_DIR="/mnt/backup_smb"
BACKUP_PATH="//192.168.178.xx/axel"
USER="xxx"
PASSWORD="xxxxxxxxxxxxx"
SOURCE="/dev/mmcblk0"

# Erstelle das Backup-Verzeichnis, falls es nicht existiert
if [ ! -d "$BACKUP_DIR" ]; then
    echo "Backup-Verzeichnis existiert nicht, versuche es zu erstellen..."
    mkdir -p "$BACKUP_DIR"
fi

# Mounten des SMB-Share
echo "Versuche, das SMB-Share zu mounten..."
mount -t cifs $BACKUP_PATH $BACKUP_DIR -o username=$USER,password=$PASSWORD

# Überprüfen, ob das SMB-Share erfolgreich gemountet wurde
if [ $? -ne 0 ]; then
    echo "Fehler: SMB-Share konnte nicht gemountet werden!"
    exit 1
fi

# Überprüfen, ob das Quellverzeichnis existiert
if [ ! -e "$SOURCE" ]; then
    echo "Fehler: Quellverzeichnis $SOURCE existiert nicht!"
    umount $BACKUP_DIR
    exit 1
fi

# Erstelle Dateinamen mit Datum und Uhrzeit (Backupbeginn und Backupende)
BACKUP_START=$(date "+%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/${BACKUP_NAME}_backup_${BACKUP_START}.img.gz"  # Backup-Datei mit gzip-Endung

# Hole die Gesamtgröße des Quelllaufwerks (in Bytes)
TOTAL_SIZE=$(sudo blockdev --getsize64 $SOURCE)  # Gesamtgröße des Quelllaufwerks in Bytes
TOTAL_SIZE_MB=$(($TOTAL_SIZE / 1048576))  # Umrechnung in MB

# Beginne mit dem Erstellen des Backups
echo "Backup gestartet: $BACKUP_START"

# Hole die Startzeit, um die verbleibende Zeit zu berechnen
START_TIME=$(date +%s)

# Führe dd mit gzip aus und berechne die Geschwindigkeit
{
    # Starte dd und komprimiere mit gzip, während Fortschritt ausgegeben wird
    sudo dd if=$SOURCE bs=4M status=progress conv=sparse oflag=sync | gzip | tee $BACKUP_FILE |
    while IFS= read -r line; do
        # Extrahiere die Anzahl der geschriebenen Bytes
        if [[ $line =~ ([0-9]+)\ bytes ]]; then
            BYTES_WRITTEN="${BASH_REMATCH[1]}"
        fi

        # Berechne die Geschwindigkeit in MB/sec
        if [[ -n "$BYTES_WRITTEN" ]]; then
            ELAPSED_TIME=$(($(date +%s) - START_TIME))  # Verstrichene Zeit in Sekunden
            SPEED_MBSEC=$((BYTES_WRITTEN / 1048576 / ELAPSED_TIME))  # Geschwindigkeit in MB/sec

            # Zeige die Fortschrittsanzeige
            PROGRESS=$(($BYTES_WRITTEN / 1048576))  # In MB
            echo "Fortschritt: $PROGRESS MB von $TOTAL_SIZE_MB MB (${PROGRESS * 100 / TOTAL_SIZE_MB}% abgeschlossen)"
            echo "Aktuelle Geschwindigkeit: $SPEED_MBSEC MB/sec"
        fi
    done
} &

# Warten, bis dd abgeschlossen ist
wait  # Warten, bis dd abgeschlossen ist

# Überprüfen, ob das Backup erfolgreich war
if [ $? -eq 0 ]; then
    echo "Backup erfolgreich abgeschlossen: $BACKUP_FILE"
else
    echo "Fehler: Backup konnte nicht abgeschlossen werden!"
    umount $BACKUP_DIR
    exit 1
fi

# Mounten des SMB-Share aushängen
echo "Unmounten des SMB-Share..."
sudo umount $BACKUP_DIR

# Überprüfen, ob das Unmounten erfolgreich war
if [ $? -ne 0 ]; then
    echo "Warnung: SMB-Share konnte nicht erfolgreich ungemountet werden!"
    exit 1
else
    echo "SMB-Share erfolgreich ungemountet."
fi

Schritt-für-Schritt-Erklärung

1. Konfiguration

Die ersten Variablen definieren die wichtigen Parameter:

  • BACKUP_NAME: Der Name des Backups.
  • BACKUP_DIR: Lokales Verzeichnis, in das das SMB-Share gemountet wird.
  • BACKUP_PATH: Netzwerkpfad des SMB-Shares.
  • USER und PASSWORD: Anmeldedaten für den Netzwerk-Speicher.
  • SOURCE: Pfad zur SD-Karte, die gesichert werden soll.

2. Erstellung des Backup-Verzeichnisses

Das Skript überprüft, ob das lokale Backup-Verzeichnis existiert, und erstellt es bei Bedarf:

if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi

3. Mounten des SMB-Shares

Das SMB-Share wird gemountet, damit die Backup-Datei über das Netzwerk gespeichert werden kann:

mount -t cifs $BACKUP_PATH $BACKUP_DIR -o username=$USER,password=$PASSWORD

4. Überprüfen der Quelle

Vor dem Start wird sichergestellt, dass die SD-Karte erreichbar ist:

if [ ! -e "$SOURCE" ]; then
    umount $BACKUP_DIR
    exit 1
fi

5. Backup-Dateiname erstellen

Die Backup-Datei wird mit einem Zeitstempel versehen, um verschiedene Backups zu unterscheiden:

BACKUP_FILE="$BACKUP_DIR/${BACKUP_NAME}_backup_${BACKUP_START}.img.gz"

6. Backup mit dd

Das Backup wird erstellt, indem die SD-Karte mit dd gelesen und die Daten direkt mit gzip komprimiert werden:

sudo dd if=$SOURCE bs=4M status=progress conv=sparse oflag=sync | gzip > $BACKUP_FILE

7. Unmounten des SMB-Shares

Nach Abschluss wird das SMB-Share sauber ausgehängt:

sudo umount $BACKUP_DIR

Vorteile des Skripts

  • Automatisierung: Kein manuelles Kopieren der SD-Karte notwendig.
  • Kompression: Durch die Verwendung von gzip wird Speicherplatz gespart.
  • Fehlermanagement: Das Skript bricht sauber ab, wenn ein Fehler auftritt.
  • Fortschrittsanzeige: Dank status=progress und eigener Berechnungen bleibt man über den Fortschritt informiert.

Fazit

Dieses Skript bietet eine robuste Möglichkeit, SD-Karten zu sichern und potenziellen Datenverlust zu vermeiden. Durch die Nutzung eines Netzwerk-Speichers bleibt das Backup auch bei Hardware-Ausfällen sicher. Stellen Sie sicher, dass Sie das Skript regelmäßig ausführen, um Ihre Daten zu schützen.

Leave a Reply

Your email address will not be published. Required fields are marked *

wetransco.de
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.