ubuntuusers.de

Backup eines ZFS

Status: Ungelöst | Ubuntu-Version: Server 24.04 (Noble Numbat)
Antworten |

homeserver_wacken

(Themenstarter)

Anmeldungsdatum:
1. März 2025

Beiträge: 25

Skripte zu schreiben ist mit LLMs heutzutage gar kein Problem mehr.

Hier mal ein Auszug aus dem neuen Script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/bash
set -e  # Beendet das Skript bei jedem Fehler

# Variablen
LOG_FILE="/var/log/backup_script.log" # Pfad zur Log-Datei
POOL="Toshiba_1x_18TB_Pool/Nextcloud"  # Ersetze dies mit dem Namen deines ZFS-Pools und Datasets
POOL_BAK="Backup_Pool"  # Name des ZFS-Pools
BACKUP_POOL="Backup_Pool/Nextcloud"  # Ersetze dies mit dem Namen deines Ziel-ZFS-Pools
SNAPSHOT_PREFIX="Nextcloud"  # Prefix für den Snapshot-Namen

# Finde die höchste laufende Nummer aus den bestehenden Snapshots
LAST_NUMBER=$(zfs list -t snapshot -o name | grep "$POOL@$SNAPSHOT_PREFIX" | \
    sed -E "s/^.*@${SNAPSHOT_PREFIX}_([0-9]{1,3})_.*/\1/" | sort -n | tail -n 1) #([0-9]{1,3}): Dieser reguläre Ausdruck sucht nach einer Zahl, die zwischen 1 und 3 Ziffern lang ist. Das bedeutet, dass er sowohl einstellige (1), zweist>
echo "$(date +"%Y-%m-%d %H:%M:%S"): Die Nummer des letzten Snapshots des Datasets $POOL ist: $LAST_NUMBER" >> $LOG_FILE

if [ -z "$LAST_NUMBER" ]; then
    NEW_NUMBER=1
else
    NEW_NUMBER=$((10#$LAST_NUMBER + 1))  # Entferne führende Nullen mit 10#
fi

SNAPSHOT_NAME="${SNAPSHOT_PREFIX}_$(printf "%03d" "$NEW_NUMBER")_$(date +%Y%m%d%H%M%S)"  # Erstelle einen Namen für den Snapshot mit laufender Nummer und Datum
echo "$(date +"%Y-%m-%d %H:%M:%S"): Der nächste Snapshot heißt: $SNAPSHOT_NAME" >> $LOG_FILE

# Erstelle den Snapshot
zfs snapshot $POOL@$SNAPSHOT_NAME >> $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
    echo "$(date +"%Y-%m-%d %H:%M:%S"): Snapshot erstellt: $SNAPSHOT_NAME" >> $LOG_FILE
else
    echo "$(date +"%Y-%m-%d %H:%M:%S"): ERROR: Dieser Snapshot konnte NICHT erstellt werden: $SNAPSHOT_NAME" >> $LOG_FILE
    exit 1
fi


# Überprüfe, ob bereits ein letztes Backup existiert
if zfs list -t snapshot | grep -q "$BACKUP_POOL" >> $LOG_FILE 2>&1; then
    # Wenn ja, lese den Namen des letzten Snapshots
    LAST_SNAPSHOT=$(zfs list -t snapshot -o name -s creation | grep "$BACKUP_POOL@$SNAPSHOT_PREFIX" | tail -n 1)
    # Protokolliere 
    echo "$(date +"%Y-%m-%d %H:%M:%S"): Es gibt ein Backup. Der vollständige Pfad zum letzten Backup ist: $LAST_SNAPSHOT" >> $LOG_FILE
    #NAME_SNAPSHOT="$POOL${LAST_SNAPSHOT/$BACKUP_POOL/}"
    #echo "Name letztes backup=$NAME_SNAPSHOT"
    # Sende den inkrementellen Snapshot (nur die Änderungen seit dem letzten Snapshot)
    #zfs send -i $NAME_SNAPSHOT $POOL@$SNAPSHOT_NAME | zfs receive $BACKUP_POOL
    zfs send -i "$POOL${LAST_SNAPSHOT/$BACKUP_POOL/}" $POOL@$SNAPSHOT_NAME | zfs receive $BACKUP_POOL >> $LOG_FILE 2>&1
    # Überprüfen des Exit-Status
    if [ $? -eq 0 ]; then
        echo "$(date +"%Y-%m-%d %H:%M:%S"): Das inkrementelle Backup war erfolgreich." >> $LOG_FILE
    else
        echo "$(date +"%Y-%m-%d %H:%M:%S"): ERROR: Das inkrementelle Backup ist fehlgeschlagen." >> $LOG_FILE
        exit 1
    fi
else
    # Wenn kein letztes Backup existiert, sende den vollständigen Snapshot
    zfs send $POOL@$SNAPSHOT_NAME | zfs receive -F $BACKUP_POOL >> $LOG_FILE 2>&1
    # Überprüfen des Exit-Status
    if [ $? -eq 0 ]; then
        echo "$(date +"%Y-%m-%d %H:%M:%S"): Es wurde ein neues vollständige Backup erfolgreich erstellt." >> $LOG_FILE
    else
        echo "$(date +"%Y-%m-%d %H:%M:%S"): ERROR: Es konnte KEIN neues vollständiges Backup erstellt werden." >> $LOG_FILE
        exit 1
    fi
fi

# Protokolliere den Abschluss des Backups
echo "$(date +"%Y-%m-%d %H:%M:%S"): Backup-Routine abgeschlossen. Letzter Snapshot: $LAST_SNAPSHOT, Neuer Snapshot: $SNAPSHOT_NAME" >> $LOG_FILE

Ich habe es jetzt wiederholt aber nicht immer gehabt, dass der send/receive mit folgendem Fehler fehlschlägt:

1
2
cannot receive incremental stream: destination Backup_Pool/Nextcloud has been modified
since most recent snapshot

Mir ist nicht bewusst, dass ich an dem Backup irgendwas geändert habe.

  • Kann es noch andere Ursachen für den Fehler geben?

  • Können Hintergrundprozesse soetwas machen, und welche kommen da am ehesten in Frage?

  • Wie kann ich identifizieren was für Änderungen wann erstellt wurden?

  • Gibt es eine einfache Möglichkeit das Problem zu beheben, und wenn ja wie.

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 692

Wohnort: Hamburg

Mögliche Ursachen

  1. Automatisches Mounten: Wenn das Backup-Dataset automatisch gemountet wird, können Systemdienste darauf zugreifen und Änderungen vornehmen.

  2. Hintergrundprozesse: Verschiedene Systemprozesse könnten Metadaten ändern, wenn das Dataset gemountet ist:

    • Automatische Snapshot-Tools (wie zfs-auto-snap oder autozsys)

    • Quota-Abfragen (zfs userspace)

    • Indexierungsdienste oder andere Hintergrunddienste

  3. Mountpoint-Änderungen: Selbst das einfache Mounten des Datasets zum Überprüfen des Backups kann es verändern.

Da wir deine Installation nicht kennen, können wir da nichts machen (und ich Persönlich nutze ZFS unter TrueNAS)

homeserver_wacken

(Themenstarter)

Anmeldungsdatum:
1. März 2025

Beiträge: 25

Die Punkte kann ich realistisch ja gar nicht unterbinden oder? Wenn schon alleine das Mounten die Daten verändert. Wie wird das normalerweise gemacht? Spielt man vor dem nächsten Backup, den letzten Snapshot wieder ein?

Antworten |