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.