rsync - allg. 'beste' Einstellungen + backup-dir

W

wilder

GNU/Linux Anfänger
Hallo,

seit ein paar Wochen nutze ich rsync, um mein home-Verzeichnis auf ein USB-HD zu sicher. Ich nutze auch die Option backup-dir, durch die es leider zu einer starken Verschachtelung (viele Unterverzeichnisse) kommt. Das möchte ich einschränken, notfalls abschalten.

Mit folgenden Optionen rufe ich rsync auf:
rsync --force --ignore-errors --delete --delete-excluded --backup --backup-dir=.Backup/$(date '+%y%m%d') --progress -av /home/user /media/USB-SAVE/user

Die Option "--backup-dir=.Backup/$(date '+%y%m%d')" bewirkt bei mehrfachem Update eine Unterordnerstruktur z.B. wie folgt: .Backup/071212/.Backup/071212/.Backup/071212/.Backup/071212/[etc.]

Wie kann ich einstellen, dass es nicht zu dieser Verschachtelung kommt? Oder gibt es einen schlaueren Umgang mit den Optionen? Ist die Backup-Option nötig bzw, kann ich sie einschränken? Kenne mich mit Backup-Techniken nicht so gut aus.

Gruß, W.
 
Hallo,

(1) habe bisher zu obigem "Problem" keine Lösung gefunden. Da durch die Option --backup-dir= ein Verzeichnis mit vielen Unterverzeichnissen in der Form von /.Backup/[Datum]/.Backup/[Datum]/..etc. entsteht und wenn ich zum 100. Mal ein Backup durchführe, wird ein 200fach verschachteltes Verzeichnis von rsync angelegt.. Ich kenne mich nicht sehr gut mit Linux aus, doch stößt das System nicht irgendwann an seine Grenzen? Nautilus muss ab dem 20. Unterverzeichnis länger laden.. wenn ich nicht etwas Grundlegendes falsch mache, muss ich sagen, dass diese Option "stümperhaft" wirkt..


(2) Ich will auch einige Verzeichnisse aus dem Backup-Vorgang ausschließen. Mit der Option "--exclude-from=FILE" soll das funktionieren.
Code:
rsync --force --ignore-errors --delete --delete-excluded --backup --backup-dir=.Backup/$(date '+%y%m%d') --progress -av --exclude-from=$AUSNAHMEN /home/user /media/USB-SAVE/user | grep -v "files..." >> $LOGVERZ$DATUM"_"$VERZ01".log"
Hier "--exclude-from=$AUSNAHMEN" wobei diese Datei die Liste enthält:
Code:
AUSNAHMEN="/home/user/backup_ausnahmeliste"
Sie sieht bei mir so aus:
Code:
#
# Ausnahme-Dateiliste für Backup-Script
#
*~
*/.Trash
*/Downloads/Ordner1*
Die letzte Zeile wird nicht berücksichtigt für die Ausnahme, da es logischerweise keinen Ordner oder keine Datei gibt die "*/Downloads/Ordner1*" heißt, es müsste heißen "Ordner1*". Aber dann werden nicht nur die Ordner1* im Verzeichnis Downloads ignoriert, sondern alle die unterhalb des Backup-Ordners liegen. Kann ich irgendwie festlegen, dass nur bestimmte Verzeichnisse in einem anderen bestimmten Verzeichnis ignoriert werden?

Gruß, W.
 
Wenn es dir darum geht, dass deine Backups als Ordner-Namen das Datum enthalten, musst du nicht --backup-dir verwenden, sondern kannst einfach folgendes Konstrukt nutzen:

Code:
rsync [parameter] /home/user /media/USB-SAVE/user/backup-`date +%d.%M.%Y`

Wichtig: Backticks beim date-Befehl benutzen und keine einfachen Anführungsstriche.

Deine Exclude-Liste wirst du leider so genau wie möglich spezifizieren müssen. Mit '--exclude-from' hab ich allerdings auch eher schlechte Erfahrungen gemacht und verwende daher nur noch das einfach '--exclude', das man ja auch mehrfach angeben kann.
 
Hallo,

also folgende Ziele will ich mit rsync grob erreichen:
1. ein komplettes Backup von QUELLE auf ZIEL (USB-HD) sichern
2. neue Versionen von Dateien und neue Dateien von QUELLE auf ZIEL (USB-HD) sichern, dann alte Versionen von Dateien in ZIEL in anderem Verzeichnis (mit Datum im Namen) sichern
3. gelöschte Dateien aus QUELLE im ZIEL (USB-HD) in ein anderes Verzeichnis (mit Datum im Namen) verschieben

Aber ich weiß nicht, da ich mich mit Backup-Techniken nicht gut auskenne, welche Einstellung mit rsync (mit Backup allg.) die schlausten Einstellungen sind. Wollte ich in diesem Thread herausfinden.

Dein Vorschlag zielt in die Richtung, bei jedem Backup-Vorgang ein komplettes Backup durchzuführen?

edit: zum Thema "--backup-dir"
Vielleicht macht es Probleme, dass ich für den backup-dir-Pfad "--backup-dir=.Backup/$(date '+%y%m%d')" erstens ein / im Pfad hab (also ein weiteres Unterverzeichnis) anlege und zweitens, dass sich der backup-dir-Pfad mit jedem Tag "$(date '+%y%m%d')" ändert..? Oder der backup-dir-Pfad darf nicht im ZIEL-Verzeichnis liegen, sondern muss außerhalb sein/über diesem liegen...?

Gruß, W.
 
Zuletzt bearbeitet:
hallo zusammen,

mein backup-skript sieht jetzt folgendermaßen aus. es kann gerne von anderen genutzt werden. keine haftung bei problemen. :)

teils erklären die kommentare das script. zu erwähnen wäre noch eine einleitung. das script sichert mehrere verzeichnisse im home-verzeichnis des angegebenen benutzers, die im array VERZEICHNISSE gelistet werden. der mount-punkt der USB-Partition auf die gesichert werden soll, muss unter USBHD angegeben werden.
bei jedem backupvorgang wird je verzeichnis eine log-datei erstellt. für diese log-dateien muss auch ein verzeichnis angegeben werden (LOGVERZ). darin sind alle gesicherten dateinen gelistet.
dann gibt es noch eine ausnahmeliste, diese ist in einer externen text-datei gesichert (AUSNAHMEN). sieht bei mir folgend aus:
Code:
#
# Ausnahme-Dateiliste für Wilders-Backup-Script-2008
#
# Jede Zeile entspricht einem Verzeichnis/einer Datei, das/die beim Backup nicht berücksichtigt (ignoriert) werden soll.
# Angabe mit komplettem Pfad; komplettes Verzeichnis ausnehmen mit /* hinter den Verzeichnisnamen. Oder nur Teil des Namens und mit Wildcats, *, ?
#
*~
*/.Trash*
alle dateien/verzeichnisse die auf "~" enden und mit ".Trash" beginnen werden nicht berücksichtigt.

hier das backup-script:
Code:
#!/bin/sh

#
# Wilders-Backup-Script-2008
# Das Skript sichert folgende Verzeichnisse auf eine USB-Festplatte: ...
#

# Benutzername angeben:
BENUTZER="user"

# mount-Verzeichnis des externen USB-HD
USBHD="/media/USB-HD"

# Array für zu sichernde Verzeichnisse; Abruf über ${VERZEICHNISSE[0]}, ${VERZEICHNISSE[1]} usw.
VERZEICHNISSE=("Verzeichnis01" "Verzeichnis02")

# Vom Backup ausgenommenen Verzeichnisse und Dateien, siehe backup_ausnahmeliste
AUSNAHMEN="/home/$BENUTZER/Scriptverzeichnis/backup_ausnahmeliste"

# Dateumabfrage für Backup-Verzeicnis-Namen; ausführbare Kommandos werden immer in $(...) geschrieben, hier "date '+%y%m%d'"
DATUM=$(date '+%y%m%d')

# Log-Dateien-Verzeichnis; ein abschließendes / ist nötig, s.u.
LOGVERZ="/home/$BENUTZER/Scriptverzeichnis/backup-logs/"


# prüfe, ob $USBHD existiert; ob USB-Festplatte angeschlossen ist.
if [ -e $USBHD ]; then

  # PBELEGT enthält Zahl, wie viel Prozent belegt sind; wenn größer als 96%, dann Abbruch (siehe if-Anweisung)
  # ausführbare Kommandos werden immer in $(...) geschrieben, hier "df $USBHD ..."
  PBELEGT=$(df $USBHD | tail -n1 | sed -e 's/.* \([0-9]\{1,3\}\)%.*/\1/')
  
  # prüfe, ob genug Festplattenplaz auf USB-SAVE frei ist (min 5%)
  if [ $PBELEGT -lt 96 ]; then

    # Beginne Schleife für das Array VERZEICHNISSE; @ bewirkt Zugriff auf komplettet Array
    for i in ${!VERZEICHNISSE[@]}
    do

    VERZ=${VERZEICHNISSE[i]}

    # prüfe, ob Verzeichnis auf externer USB-HD angeschlossen ist
    if [ -e $USBHD/$VERZ ]; then

      echo ""
      echo "*** Start von Backup-\""$VERZ"\" ***"
      # Datums- und Zeitstempel in Logdatei eintragen; Option -e, damit die Backslash-Operatoren funktionieren, z.B. \n für neue Zeile
      echo -e "\n\n**********************************************************************\n******************** "$(date)" ********************\n**********************************************************************" >> $LOGVERZ$DATUM"_"$VERZ".log"
      # Sichert Verzeichnis /home/$BENUTZER/$VERZ und erstelle Log-Datei DATUM_$VERZ.log in ./backup-logs.
      # Dateiausgabe mit > in txt-Datei umleiten (alte überschreiben), mit >> umleiten und an alte anhängen
      rsync --force --ignore-errors --delete --delete-excluded --backup --backup-dir=../.Backup/$(date '+%y%m%d')_$VERZ --progress -av --exclude-from=$AUSNAHMEN /home/$BENUTZER/$VERZ/ $USBHD/$VERZ | grep -v "files..." | grep -v "    " >> $LOGVERZ$DATUM"_"$VERZ".log"
      echo "*** Ende  von Backup-\""$VERZ"\" ***"
      echo ""

    fi
    # Ende von prüfe auf externes USB-HD

    done
    # Ende der Schleife für das Array VERZEICHNISSE

  else

    echo ""
    echo "Es ist nicht mehr ausreichend Speicherplatz auf"
    echo "$USBHD vorhanden. $PBELEGT % sind belegt."
    echo ""

  fi
  # Ende Speicherplatz-Test

else

  echo ""
  echo "Bitte USB-Festplatte mit Partition \"$USBHD\" anschließen."
  echo ""

fi
# Ende von prüfe auf $USBHD

wenn ihr noch vorschläge zur verbesserung oder vereinfachung gibt, bitte schreiben? bin kein bash-kenner und kann sein, dass ich da etwas übersehen hab. bei mir funktioniert das script mit rsync wunderbar.

in den rsync-optionen habe ich das backup-dir außerhalb des basis-backup-verzeichnisses angelegt, damit es nicht mehr zu einer unendlichen verschachtelung kommen kann. nachteil: nur noch einmaliges sichern pro tag, denn sonst wird im backup-dir überschrieben.
Code:
rsync --force --ignore-errors --delete --delete-excluded --backup --backup-dir=../.Backup/$(date '+%y%m%d')_$VERZ --progress -av --exclude-from=$AUSNAHMEN /home/$BENUTZER/$VERZ/ $USBHD/$VERZ | grep -v "files..." | grep -v "    " >> $LOGVERZ$DATUM"_"$VERZ".log"

grüße,w.
 
Zuletzt bearbeitet:
Hallo wilder und unixboard,

ich hab dein script mal eiskalt abgekupfert :-) und meinen bedürfnissen angepasst.

leider entsteht mir ein unerklärliches problem. im home verzeichnis des nutzers A funktioniert alles. ich kann alle verzeichnisse sichern oder nur einzelne angegebene (VERZEICHNISSE=("linux") ).

kopiere ich das script aber in die gleiche verzeichnisstruktur des Nutzers B springt er an der stelle "if [ -e $USBHD/$VERZ ]; then" aus der Schleife und führt kein backup durch.

Code:
#!/bin/sh

#
# B-Backup-Script-2008
# Das Skript sichert folgende Verzeichnisse auf eine USB-Festplatte: ...
#

# Benutzername angeben:
BENUTZER="B"

# mount-Verzeichnis des externen USB-HD
USBHD="/mnt/homebackup/$BENUTZER"

# Array für zu sichernde VERZEICHNISSE; Abruf über ${VERZEICHNISSE[0]}, ${VERZEICHNISSE[1]} usw.
VERZEICHNISSE=("v")

# Vom Backup ausgenommenen VERZEICHNISSE und Dateien, siehe backup_ausnahmeliste
AUSNAHMEN="/home/$BENUTZER/backupscript/backup_ausnahmeliste"

# Datumabfrage für Backup-Verzeicnis-Namen; ausführbare Kommandos werden immer in $(...) geschrieben, hier "date '+%y%m%d'"
DATUM=$(date '+%d%m%y')

# Log-Dateien-Verzeichnis; ein abschließendes / ist nötig, s.u.
LOGVERZ="/home/$BENUTZER/backupscript/backup-logs/"


# prüfe, ob $USBHD existiert; ob USB-Festplatte angeschlossen ist.
if [ -e $USBHD ]; then

  # PBELEGT enthält Zahl, wie viel Prozent belegt sind; wenn größer als 96%, dann Abbruch (siehe if-Anweisung)
  # ausführbare Kommandos werden immer in $(...) geschrieben, hier "df $USBHD ..."
  PBELEGT=$(df $USBHD | tail -n1 | sed -e 's/.* \([0-9]\{1,3\}\)%.*/\1/')
  
  # prüfe, ob genug Festplattenplaz auf USB-SAVE frei ist (min 5%)
  if [ $PBELEGT -lt 96 ]; then

    # Beginne Schleife für das Array VERZEICHNISSE; @ bewirkt Zugriff auf komplettet Array
    for i in ${!VERZEICHNISSE[@]}
    do

    VERZ=${VERZEICHNISSE[i]}

    #prüfe, ob Verzeichnis auf externer USB-HD angeschlossen ist
	if [ -e $USBHD/$VERZ ]; then

	  echo ""
      echo "*** Start von Backup-\""$VERZ"\" ***"
 	  # Datums- und Zeitstempel in Logdatei eintragen; Option -e, damit die Backslash-Operatoren funktionieren, z.B. \n für neue Zeile
      echo -e "\n\n**********************************************************************\n******************** "$(date)" ********************\n**********************************************************************" >> $LOGVERZ$DATUM"_"$VERZ".log"
      # Sichert Verzeichnis /home/$BENUTZER/$VERZ und erstelle Log-Datei DATUM_$VERZ.log in ./backup-logs.
      # Dateiausgabe mit > in txt-Datei umleiten (alte überschreiben), mit >> umleiten und an alte anhängen
      rsync --force --ignore-errors --delete --delete-excluded --backup --backup-dir=./.Backup/$(date '+%d%m%y')_$VERZ --progress -av --exclude-from=$AUSNAHMEN /home/$BENUTZER/$VERZ/ $USBHD/$VERZ | grep -v "files..." | grep -v "    " >> $LOGVERZ$DATUM"_"$VERZ".log"
	  echo "*** Ende  von Backup-\""$VERZ"\" ***"
      echo ""

    fi
    # Ende von prüfe auf externes USB-HD

    done
    # Ende der Schleife für das Array VERZEICHNISSE

  else

    echo ""
    echo "Es ist nicht mehr ausreichend Speicherplatz auf"
    echo "$USBHD vorhanden. $PBELEGT % sind belegt."
    echo ""

  fi
  # Ende Speicherplatz-Test

else

  echo ""
  echo "Bitte USB-Festplatte mit Partition \"$USBHD\" anschließen."
  echo ""

fi

# Ende von prüfe auf $USBHD

Das Verzeichnis "v" existiert. gebe ich kein verzeichnis an, springt er in die schleife. rechte habe ich kontrolliert.

wenn jemand bitte einen tip hat!

Danke Euch
 
vielleicht mit -d prüfen ob das verzeichnis existiert bzw. ob die hd eingehängt ist. für die berechnung der festplattengröße habe ich in meinen bashtools eine methode entwickelt wie man das überprüfen kann.
 
Hallo tuxlover,

danke für den denkanstoß. ich hab es jetzt rausgefunden. nicht das Script nutzer B war falsch sondern das von A habe ich falsch benutzt. naja.

Scheinbar ist im script ein Fehler oder ich verstehe es falsch, denn die Stelle
Code:
if [ -e $USBHD/$VERZ ]; then
wertet aus, ob am Ziel mein angegebenes Verzeichnis(se)

Code:
VERZEICHNISSE=("v")

existiert. Wenn nicht führt es kein backup durch - unlogisch.
Gebe ich kein Verzeichnis an, führt es ein komplettes backup durch - logisch
gebe ich dann ein spezielles verzeichnis an, existiert das ja auf dem backupmedium und wird gesichert - logisch, widerspricht aber dem 1. punkt.

Wozu eigentlich diese Prüfung? Ob die Platte da ist wird ja vorher schon geprüft.

Grüße und Danke

Matthias
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

rsnapshot und ein Rechteproblem?

rsync: Problem - Verzeichnisse mit Suffix umbenennen - nach 2.6.9

rsync: Quelle größer als Ziel => "Archiv" aufteilen/splitten

Backup Skript automatisch ausführen mit udev

Zurück
Oben