ubuntuusers.de

Rsync-Skript aus Wiki für Backup von Borg-Repositories funktioniert nicht

Status: Ungelöst | Ubuntu-Version: Kubuntu 20.04 (Focal Fossa)
Antworten |

Joon

Anmeldungsdatum:
17. Februar 2021

Beiträge: Zähle...

Liebes Forum, ich möchte für ein externes Backup (USB) von zwei Borg-Repositories das Script aus dem Wiki Backup mit RSYNC verwenden, Leider funktioniert es hinten und vorne nicht. Das Umfeld ist: HD (gpt/ext4) von localhost(Kubuntu 20.04), USB-Laufwerk (gpt/ext4) via USB 3 angedockt, HD (gpt/ext4) via SSH (Ubuntu Server 20.04). HD von localhost und USB sind gemountet via /media/sabe/.. und haben den gleichen Owner. Das Skript ist hat folgende Berechtigung: 600. Es ist so angepasst:

# Simple backup with rsync
# local-mode, tossh-mode, fromssh-mode

SOURCES=(/media/sabe/BackUp/rechner1_backup/borg laika@192.168.120.xx:/media/hd_backup/server_backup/borg )
TARGET="/media/sabe/Verbatim"

# edit or comment with "#"
#LISTPACKAGES=listdebianpackages        # local-mode and tossh-mode
MONTHROTATE=monthrotate                 # use DD instead of YYMMDD

RSYNCCONF=(--delete)
MOUNTPOINT="/media/sabe/Verbatim"               # check local mountpoint
MAILREC="backup@meinedomain"

SSHUSER="laika"
FROMSSH="192.168.120.xx"
#TOSSH="tossh-server"
SSHPORT=22

### do not edit ###

MOUNT="/bin/mount"; FGREP="/bin/fgrep"; SSH="/usr/bin/ssh"
LN="/bin/ln"; ECHO="/bin/echo"; DATE="/bin/date"; RM="/bin/rm"
DPKG="/usr/bin/dpkg"; AWK="/usr/bin/awk"; MAIL="/usr/bin/mail"
CUT="/usr/bin/cut"; TR="/usr/bin/tr"; RSYNC="/usr/bin/rsync"
LAST="last"; INC="--link-dest=$TARGET/$LAST"

LOG=$0.log
$DATE > $LOG

if [ "${TARGET:${#TARGET}-1:1}" != "/" ]; then
  TARGET=$TARGET/
fi

if [ "$LISTPACKAGES" ] && [ -z "$FROMSSH" ]; then
  $ECHO "$DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 | $TR '\n' ' '" >> $LOG
  $DPKG --get-selections | $AWK '!/deinstall|purge|hold/'|$CUT -f1 |$TR '\n' ' '  >> $LOG  2>&1 
fi

if [ "$MOUNTPOINT" ]; then
  MOUNTED=$($MOUNT | $FGREP "$MOUNTPOINT");
fi

if [ -z "$MOUNTPOINT" ] || [ "$MOUNTED" ]; then
  if [ -z "$MONTHROTATE" ]; then
    TODAY=$($DATE +%y%m%d)
  else
    TODAY=$($DATE +%d)
  fi

  if [ "$SSHUSER" ] && [ "$SSHPORT" ]; then
    S="$SSH -p $SSHPORT -l $SSHUSER";
  fi

  for SOURCE in "${SOURCES[@]}"
    do
      if [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ]; then
        $ECHO "$RSYNC -e \"$S\" -avR \"$FROMSSH:$MOUNTPOINT$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC"  >> $LOG 
        $RSYNC -e "$S" -avR "$FROMSSH:\"$MOUNTPOINT$SOURCE\"" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC >> $LOG 2>&1 
        if [ $? -ne 0 ]; then
          ERROR=1
        fi 
      fi 
      if [ "$S" ]  && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
        $ECHO "$RSYNC -e \"$S\" -avR \"$MOUNTPOINT$SOURCE\" ${RSYNCCONF[@]} \"$TOSSH:$TARGET$TODAY\" $INC " >> $LOG
        $RSYNC -e "$S" -avR "$MOUNTPOINT$SOURCE" "${RSYNCCONF[@]}" "$TOSSH:\"$TARGET\"$TODAY" $INC >> $LOG 2>&1 
        if [ $? -ne 0 ]; then
          ERROR=1
        fi 
      fi
      if [ -z "$S" ]; then
        $ECHO "$RSYNC -avR \"$MOUNTPOINT$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC"  >> $LOG 
        $RSYNC -avR "$MOUNTPOINT$SOURCE" "${RSYNCCONF[@]}" "$TARGET"$TODAY $INC  >> $LOG 2>&1 
        if [ $? -ne 0 ]; then
          ERROR=1
        fi 
      fi
  done

  if [ "$S" ] && [ "$TOSSH" ] && [ -z "$FROMSSH" ]; then
    $ECHO "$SSH -p $SSHPORT -l $SSHUSER $TOSSH $LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG  
    $SSH -p $SSHPORT -l $SSHUSER $TOSSH "$LN -nsf \"$TARGET\"$TODAY \"$TARGET\"$LAST" >> $LOG 2>&1
    if [ $? -ne 0 ]; then
      ERROR=1
    fi 
  fi 
  if ( [ "$S" ] && [ "$FROMSSH" ] && [ -z "$TOSSH" ] ) || ( [ -z "$S" ] );  then
    $ECHO "$LN -nsf $TARGET$TODAY $TARGET$LAST" >> $LOG
    $LN -nsf "$TARGET"$TODAY "$TARGET"$LAST  >> $LOG 2>&1 
    if [ $? -ne 0 ]; then
      ERROR=1
    fi 
  fi
else
  $ECHO "$MOUNTPOINT not mounted" >> $LOG
  ERROR=1
fi
$DATE >> $LOG
if [ -n "$MAILREC" ]; then
  if [ $ERROR ];then
    $MAIL -s "Error Backup $LOG" $MAILREC < $LOG
  else
    $MAIL -s "Backup $LOG" $MAILREC < $LOG
  fi
fi

Das Ergebnis ist deprimierend:

Mi 20. Okt 22:49:43 CEST 2021
/usr/bin/rsync -e "/usr/bin/ssh -p 22 -l lynvia" -avR "192.168.120.xx:/media/sabe/Verbatim/media/sabe/BackUp/rechner1_backup" --delete /media/sabe/Verbatim/20 --link-dest=/media/sabe/Verbatim/last
Warning: Permanently added '192.168.120.xx' (ECDSA) to the list of known hosts.
receiving incremental file list
rsync: link_stat "/media/sabe/Verbatim/media/sabe/BackUp/rechner1_backup" failed: No such file or directory (2)

sent 8 bytes  received 126 bytes  4.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1677) [Receiver=3.1.3]
rsync: [Receiver] write error: Broken pipe (32)
/usr/bin/rsync -e "/usr/bin/ssh -p 22 -l lynvia" -avR "192.168.120.xx:/media/sabe/Verbatimlaikaa@192.168.120.xx:/media/hd_backup/server_backup_borg" --delete /media/sabe/Verbatim/20 --link-dest=/media/sabe/Verbatim/last
receiving incremental file list
rsync: link_stat "/media/sabe/Verbatimlaika@192.168.120.xx:/media/hd_backup/server_backup_borg" failed: No such file or directory (2)

sent 8 bytes  received 146 bytes  7.16 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1677) [Receiver=3.1.3]
rsync: [Receiver] write error: Broken pipe (32)
/bin/ln -nsf /media/sabe/Verbatim/20 /media/sabe/Verbatim/last
Mi 20. Okt 22:50:37 CEST 2021

Es scheint überhaupt nichts zu funktionieren außer das Mailen. Wo kann ich anfangen? Ist das Skript überhaupt in der Lage parallel sowohl von localhost, als auch von SSH-Server Backups zu transferieren? Hat jemand einen Tipp? Bin um jeden Rat dankbar! Joon

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Das Script ist ein wenig unleserlich. Wenn du in der Ausgabe schaust und siehst "192.168.120.xx:/media/sabe/Verbatimlaikaa@192.168.120.xx:/media/hd_backup/server_backup_borg dann ist schon klar daß das ganz und gar nicht stimmen kann. Der SOURCES wird automatisch was vorne dran gehängt was sich mit deiner Angabe laika@usw. eher beisst.

Bei solchen Scripten frag ich mich obs nicht sinnvoller ist, das selber zu schreiben und zwar nicht mit so viel Programmlogik sondern einfach die handvoll rsync-Befehle ausschreiben. Und möglichst für jede Quelle ein eigenes Zielverzeichnis festlegen bevor du da zwei ganz verschiedene borg-Verzeichnisse zusammenwirfst, das Ergebnis wär dann ziemlich kaputt.

Joon

(Themenstarter)

Anmeldungsdatum:
17. Februar 2021

Beiträge: 36

frostschutz schrieb:

Das Script ist ein wenig unleserlich. Wenn du in der Ausgabe schaust und siehst "192.168.120.xx:/media/sabe/Verbatimlaikaa@192.168.120.xx:/media/hd_backup/server_backup_borg dann ist schon klar daß das ganz und gar nicht stimmen kann. Der SOURCES wird automatisch was vorne dran gehängt was sich mit deiner Angabe laika@usw. eher beisst.

Ja, aber ich frag mich warum. Woher kommt das, dass das Script das macht? Wo ist der Unterschied zwischen:

SOURCES=(/root /etc /home /boot )

und

SOURCES=(/media/sabe/BackUp/rechner1_backup/borg laika@192.168.120.xx:/media/hd_backup/server_backup/borg )

Die Phade sind länger und der zweite ist die SSH Source. Ich hatte es auch mit Quellen nur von der 1. HD probiert. Es passiert das gleiche. Der Pfad wird einfach zusammengezogen.

Joon

(Themenstarter)

Anmeldungsdatum:
17. Februar 2021

Beiträge: 36

Diese zusammengezogenen Pfade liegen wohl hier dran:

$ECHO "$RSYNC -e \"$S\" -avR \"$FROMSSH:$MOUNTPOINT$SOURCE\" ${RSYNCCONF[@]} $TARGET$TODAY $INC"  >> $LOG 

allerdings steht über diesem Script-Part: "do not edit", Daher bin ich unsicher, was tun. Der Code zu mir ohnehin zu hoch. Kann es sein, dass sich im Wiki-Skript Fehler eingeschlichen haben?

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Joon schrieb:

Wo ist der Unterschied zwischen:

SOURCES=(/root /etc /home /boot )

Jedes ist ein absoluter Pfad und hat einen eindeutigen Namen

und

SOURCES=(/media/sabe/BackUp/rechner1_backup/borg laika@192.168.120.xx:/media/hd_backup/server_backup/borg )

Das eine ist ein Pfad das andere eine remote source (user@host:src). Beide haben den gleichen Namen (/borg).

Beides kann Ärger mit rsync machen. Das Script ist auf Sonderfällen augenscheinlich nicht ausgelegt.

Edit: das Namensproblem scheint mir rsync -R verhindert zu werden, aber wenn du mit Sources von verschiedenen Maschinen arbeitest, kann das trotzdem knallen. Tu dir den Gefallen und mach dir für jede unabhängige Source ein eigenes target-dir.

Auf der gleichen Wikiseite ist noch ein Scriptvorschlag Minimalvariante. Vielleicht lieber sowas in der Art das angehen. Wie gesagt, eine handvoll rsync Befehle kann man auch einfach mal so ausschreiben, ohne die ganze Logik drum herum zu basteln und dann nicht verstehen was das eigentlich machen wird.

Joon

(Themenstarter)

Anmeldungsdatum:
17. Februar 2021

Beiträge: 36

frostschutz schrieb:

Das eine ist ein Pfad das andere eine remote source (user@host:src). Beide haben den gleichen Namen (/borg).

Beides kann Ärger mit rsync machen. Das Script ist auf Sonderfällen augenscheinlich nicht ausgelegt.

Das hatte ich mich gefragt: ob beides zusammengeht? Dann wohl eher nicht. Vor allem Dingen wusste ich nicht, dass die Verzeichnisse nicht gleich heißen dürfen, obwohl sie von unterschiedlichen Sources kommen. Ich habe jetzt als Test nur eines von localhost. Allerdings bleibt

Do 21. Okt 02:07:17 CEST 2021
/usr/bin/rsync -avR "/media/sabe/Verbatim/media/sabe/BackUp/rechner1_backup" --delete /media/sabe/Verbatim/21 --link-dest=/media/sabe/Verbatim/last
sending incremental file list
rsync: link_stat "/media/sabe/Verbatim/BackFall/jokerworks_backup" failed: No such file or directory (2)
--link-dest arg does not exist: /media/sabe/Verbatim/last

sent 18 bytes  received 73 bytes  182.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1207) [sender=3.1.3]
/bin/ln -nsf /media/sabe/Verbatim/21 /media/sabe/Verbatim/last
Do 21. Okt 02:07:17 CEST 2021

erhalten, weil immer noch die Pfade zusammen gezogen werden. Außerdem wird nichts gespeichert.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Das scheint jetzt $MOUNTPOINT$SOURCE zu sein und in den Beispielen war MOUNTPOINT nie gesetzt.

Jetzt stehen im ganzen Script keine Kommentare so daß man nur raten kann was MOUNTPOINT sein soll.

Wenn MOUNTPOINT gesetzt ist wird hier eine weitere Variable MOUNTED gesetzt:

if [ "$MOUNTPOINT" ]; then
  MOUNTED=$($MOUNT | $FGREP "$MOUNTPOINT");
fi

Mal ab davon daß das ne gefährliche Art ist festzustellen ob irgendwas gemountet ist... wird MOUHNTPOINT dann einfach für den Sourcepfad verwendet

$RSYNC -e "$S" -avR "$FROMSSH:\"$MOUNTPOINT$SOURCE\"" "${RSYNCCONF[@]}" "$TARGET"$TODAY ...

OK, mal wild geraten: MOUNTPOINT ist zu setzen wenn sich alle SOURCES relativ zum Mountpoint beziehen und das Script nur rennen soll, wenn dieser Mountpoint tatsächlich auch gemountet ist gerade.

Du scheinst es andersrum haben zu wollen also MOUNTPOINT ist dein Target und du willst es nur laufen lassen wenn das Target gemountet ist, aber das sieht das Script so gar nicht vor. MOUNTPOINT bezieht sich ausschließlich auf Source und TARGET wird nicht geprüft.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

Joon schrieb:

ich möchte für ein externes Backup (USB) von zwei Borg-Repositories das Script aus dem Wiki Backup mit RSYNC verwenden,

Du meinst Skripte/Backup mit RSYNC nehme ich an. Ich mag das aus verschiedenen Gründen nicht, wie ich öfters schon mal angemerkt habe. Ich weiß nicht, wie effizient und sicher das Kopieren eines Borg-Repos via rsync ist. Du kannst ja auch ein Borg-Backup zu einem remote Repo machen.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

Borg empfiehlt glaube ich selbst, das Repo nicht zu kopieren sondern das einfach Remote nochmal als ein separates Repo abzuackern.

Generell ist das Kopieren mit rsync sicher (ein Borg Repo ist einfach nur eine Sammlung von Dateien), es setzt jedoch voraus, daß das Repo nicht in Benutzung ist, während rsync läuft. Da rsync eben die Lockingmechanismen von Borg ignoriert.

Zur Effizienz kann es vorkommen daß eine große Borg-Archivdatei (Borg macht da sowas wie 500MB Splits) erneut übertragen wird auch wenn sich nur ein Teil geändert hat. Auf der anderen Seite hat es natürlich auch seinen Overhead, das Borg Repo neu zu erstellen, insb. wenn Komprimierung/Verschlüsselung noch oben drauf kommt. Je nachdem welche Resource knapper ist (Bandbreite oder Rechenleistung) ist das eine oder andere effizienter.

Joon

(Themenstarter)

Anmeldungsdatum:
17. Februar 2021

Beiträge: 36

frostschutz schrieb:

Generell ist das Kopieren mit rsync sicher (ein Borg Repo ist einfach nur eine Sammlung von Dateien), es setzt jedoch voraus, daß das Repo nicht in Benutzung ist, während rsync läuft. Da rsync eben die Lockingmechanismen von Borg ignoriert.

Das wäre bei meinem Backup-Konzept kein Problem. Die Borg-Backups laufen per cron routinemäßig.

Zur Effizienz kann es vorkommen daß eine große Borg-Archivdatei (Borg macht da sowas wie 500MB Splits) erneut übertragen wird auch wenn sich nur ein Teil geändert hat. Auf der anderen Seite hat es natürlich auch seinen Overhead, das Borg Repo neu zu erstellen, insb. wenn Komprimierung/Verschlüsselung noch oben drauf kommt. Je nachdem welche Resource knapper ist (Bandbreite oder Rechenleistung) ist das eine oder andere effizienter.

Den Absatz versteh ich nicht ganz: Welche Variante ist wann besser? Und welche verbraucht weniger Speicherplatz?

Ich wollte das Skript aus dem Wiki verwenden, weil es prüft, ob USB gemountet ist. Ich möchte partout vermeiden, dass Riesen-Backupdateien irgendwohin geschrieben werden. Leider kann ich selbst (noch) keine Skripte schreiben. Es geht nur leicht verändern. Gibt es irgendwo Skripte, die ich evt. zusammen"patchen" kann?

Was ich suche, ist ein Skript, das prüft, ob 1. USB gemountet ist, 2. von zwei PCs (Localhost + Remote-Server) die Borg-Repositories zieht und 3. möglichst wenig Platz verbraucht. Für die Borg-Backups hatte ich ein Skript von Decatec https://decatec.de/linux/backup-strategie-fuer-linux-server-mit-borg-backup/, das ich variieren konnte. Gibt es für diese Anforderung auch irgendwas?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13213

frostschutz schrieb:

Borg empfiehlt glaube ich selbst, das Repo nicht zu kopieren sondern das einfach Remote nochmal als ein separates Repo abzuackern.

Richtig, jetzt erinnere ich das auch wieder. 👍 Das steht hier.

Generell ist das Kopieren mit rsync sicher (ein Borg Repo ist einfach nur eine Sammlung von Dateien), es setzt jedoch voraus, daß das Repo nicht in Benutzung ist, während rsync läuft. Da rsync eben die Lockingmechanismen von Borg ignoriert.

Mit "sicher" in diesem Fall meinte ich, dass das Repo auch noch remote funktioniert. Es könnte ja sein, dass es ein Problem dadurch gibt, dass das Repo an einer Stelle / Pfad erstellt wurde und dann (nach dem Kopieren) an einer anderen Stelle zugegriffen wird.

Zur Effizienz kann es vorkommen daß eine große Borg-Archivdatei (Borg macht da sowas wie 500MB Splits) erneut übertragen wird auch wenn sich nur ein Teil geändert hat. Auf der anderen Seite hat es natürlich auch seinen Overhead, das Borg Repo neu zu erstellen, insb. wenn Komprimierung/Verschlüsselung noch oben drauf kommt.

Der Overhead dürfte deutlich geringer sein.

Je nachdem welche Resource knapper ist (Bandbreite oder Rechenleistung) ist das eine oder andere effizienter.

Man kann davon ausgehen, dass die Bandbreite der limitierende Faktor ist. Siehe auch hier.

Joon schrieb:

frostschutz schrieb:

Generell ist das Kopieren mit rsync sicher (ein Borg Repo ist einfach nur eine Sammlung von Dateien), es setzt jedoch voraus, daß das Repo nicht in Benutzung ist, während rsync läuft. Da rsync eben die Lockingmechanismen von Borg ignoriert.

Das wäre bei meinem Backup-Konzept kein Problem. Die Borg-Backups laufen per cron routinemäßig.

Ich denke doch: Wenn Du z.B. ein remote Repo gemountet hast, wenn rsync loslegt, dann kann sonstwas passieren.

Den Absatz versteh ich nicht ganz: Welche Variante ist wann besser? Und welche verbraucht weniger Speicherplatz?

Ich würde davon ausgehen, dass die Methode mit einem zweiten Borg-Backup besser ist als rsync.

Ich habe leider im Moment nicht so viel Zeit, sonst würde ich mal mein Skript für Dein Szenario anpassen. ☹

Antworten |