[SOLVED] rsync backup-script funktioniert nicht mehr nach Umstieg auf PVE 8.0 bzw. Debian 12 Bookworm

anderl1969

Member
Jul 10, 2022
79
15
13
Ich nutze ein kleines Script, um mittels rsync die wichtigsten Konfigurationsdateien meiner PVE nodes auf mein zentrales NAS zu sichern. Das Script hat unter Debian 11 stets klaglos funktioniert.

Unter Debian 12 Bookworm läuft das Script leider nicht mehr!

Den Hauptaugenmerk im Script bitte ich auf folgende 2 Zeilen zu lenken (das komplette script steht am Ende im "Spoiler"):
Bash:
      $ECHO "$RSYNC -e \"$S\" -avR \"$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET\"" >> $LOG
      $RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"" >> $LOG 2>&1

Die erste Zeile ($ECHO = "/bin/echo") schreibt den zusammengesetzten rsync-Befehl ins Logfile. Die zweite Zeile führt den Befehl tatsächlich aus.

Im Logfile steht dann folgendes:
Bash:
Sat  8 Jul 09:20:41 CEST 2023
/usr/bin/rsync -e "/usr/bin/ssh -p 22 -l nasuser" -avR "/root" --delete "nas:/volume3/bkp_rsync/pve1"
sending incremental file list
rsync: mkdir "/volume1/homes/nasuser/"/volume3/bkp_rsync/pve1"" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(691) [Receiver=3.1.2]

Der per echo ausgegebene Befehl wurde korrekt zusammengebaut.
Der tatsächlich im Script abgesetzte Befehl generiert aber die Fehlermeldung bzgl. dieses seltsam zusammengeschusteren Ordners:
"/volume1/homes/nasuser/"/volume3/bkp_rsync/pve1""
Keine Ahnung, wo das herkommt!


Fun-Fact: Wenn ich aus dem Logfile den generierten Befehl /usr/bin/rsync -e "/usr/bin/ssh -p 22 -l nasuser" -avR "/root" --delete "nas:/volume3/bkp_rsync/pve1" rauskopiere und in der bash direkt ausführe, dann läuft er fehlerfrei durch.

Deshalb vermute ich, dass irgendetwas bei der Substition dieser Zeile schief läuft:
Bash:
      $RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"" >> $LOG 2>&1

Kann mir hier jemand weiterhelfen?

Bash:
#!/bin/bash
# Simple backup with rsync

SOURCES=(/root /etc/pve /etc/network/interfaces /etc/corosync /etc/resolv.conf /etc/hosts /etc/vzdump.conf )
TARGET="/volume3/bkp_rsync/"$(hostname)

RSYNCCONF=(--delete)

SSHUSER="nasuser"
TOSSH="nas"
SSHPORT=22

### do not edit ###

SSH="/usr/bin/ssh"
ECHO="/bin/echo"; DATE="/bin/date"
RSYNC="/usr/bin/rsync"

LOG=$0.log
$DATE > $LOG

TODAY=$($DATE +%y%m%d)
#TODAY=$($DATE +%d)

S="$SSH -p $SSHPORT -l $SSHUSER";

for SOURCE in "${SOURCES[@]}"
  do
    if [ -d "$SOURCE" ] || [ -f "$SOURCE" ]; then
      # run rsync only if $SOURCE exists
      $ECHO "$RSYNC -e \"$S\" -avR \"$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET\"" >> $LOG
      $RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"" >> $LOG 2>&1
      if [ $? -ne 0 ]; then
        ERROR=1
      fi
    else
      $ECHO "INFO: $SOURCE does not exists. Skipping." >> $LOG
    fi
done

$DATE >> $LOG
 
Um die Sache hier abzuschließen und falls mal jemand in ein ähnliches Problem stolpert...

Durch Trial&Error konnte ich das Problem lösen. Die zusätzlichen \" um $TARGET haben jedenfalls unter Bookworm einen anderen Effekt als unter Bullseye. Nachdem ich sie weggelassen habe, hat das Script wieder funktioniert.

Die obige Zeile muss also richtig lauten:
Bash:
      $RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:$TARGET" >> $LOG 2>&1

Und der Vollständigkeit halber nochmal das komplette, korrigierte Script:
Bash:
#!/bin/bash
# Simple backup with rsync

SOURCES=(/root /etc/pve /etc/network/interfaces /etc/corosync /etc/resolv.conf /etc/hosts /etc/vzdump.conf )
TARGET="/volume3/bkp_rsync/"$(hostname)

RSYNCCONF=(--delete)

SSHUSER="nasuser"
TOSSH="nas"
SSHPORT=22

### do not edit ###

SSH="/usr/bin/ssh"
ECHO="/bin/echo"; DATE="/bin/date"
RSYNC="/usr/bin/rsync"

LOG=$0.log
$DATE > $LOG

TODAY=$($DATE +%y%m%d)
#TODAY=$($DATE +%d)

S="$SSH -p $SSHPORT -l $SSHUSER";

for SOURCE in "${SOURCES[@]}"
  do
    if [ -d "$SOURCE" ] || [ -f "$SOURCE" ]; then
      # run rsync only if $SOURCE exists
      $ECHO "$RSYNC -e \"$S\" -avR \"$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET\"" >> $LOG
      $RSYNC -e "$S" -avR "$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:$TARGET" >> $LOG 2>&1
      if [ $? -ne 0 ]; then
        ERROR=1
      fi
    else
      $ECHO "INFO: $SOURCE does not exists. Skipping." >> $LOG
    fi
done

$DATE >> $LOG
 
  • Like
Reactions: oix

About

The Proxmox community has been around for many years and offers help and support for Proxmox VE, Proxmox Backup Server, and Proxmox Mail Gateway.
We think our community is one of the best thanks to people like you!

Get your subscription!

The Proxmox team works very hard to make sure you are running the best software and getting stable updates and security enhancements, as well as quick enterprise support. Tens of thousands of happy customers have a Proxmox subscription. Get yours easily in our online shop.

Buy now!