Erstellen Sie mit rsync ein differenzielles Backup eines Verzeichnisses auf meinem lokalen Laufwerk in ein anderes Verzeichnis auf demselben Laufwerk

Erstellen Sie mit rsync ein differenzielles Backup eines Verzeichnisses auf meinem lokalen Laufwerk in ein anderes Verzeichnis auf demselben Laufwerk

Wie kann ich mit rsync (aber weder mit rsnapshot noch mit rdiff-backup noch mit einer anderen Anwendung) einDifferentialSicherung eines Verzeichnisses auf meinem lokalen Laufwerk in ein anderes Verzeichnis auf demselben lokalen Laufwerk?

F. Hauri hat folgendes gepostet ineine Antwort aufWie erstelle ich ein lokales Backup?:

#!/bin/bash
backRepo=/media/mydisk
backSrce=/home/user
backDest=home
backCopy=copy
backCount=9

[ -d "$backRepo/$backDest" ] || mkdir "$backRepo/$backDest"

cd $backSrce || exit 1
rsync -ax --delete --exclude '*~' --exclude '.DStore' . "$backRepo/$backDest/."

cd $backRepo
[ -d "$backCopy.$backCount" ] && rm -fR "$backCopy.$backCount"
for ((i=$backCount;i--;));do
    [ -d "$backCopy.$i" ] && mv "$backCopy.$i" "$backCopy.$((i+1))"
  done
((i++))

cp -al $backDest $backCopy.$i

Es scheint, dass das obige Skript ziemlich nah an dem ist, was ich will, aber ehrlich gesagt, obwohl ich ungefähr eine Stunde damit verbracht habe,Einfache automatisierte Snapshot-Backups mit Linux und RsyncIch habe immer noch nur eine vage Vorstellung davon, wie ich rsync dazu bringe, das zu tun, was ich will.

Hier ist mein Anwendungsfall:

Ich bearbeite ein Video lokal auf meinem Computer. Die Summe aller Hunderte von Dateien, die mit diesem Video verknüpft sind, beträgt weniger als 5 GB (fünf Gigabyte).

Derzeit verwende ich Grsync, um mein internes Laufwerk auf einem externen USB-Laufwerk zu sichern. Obwohl ich herausgefunden habe, wie ich die gleiche Aufgabe mit rsync erledigen kann, bevorzuge ich Grsync, da ich es lediglich starten und dann auf eine Schaltfläche klicken muss, um mein internes Verzeichnis mit meinen Videodateien auf meinem externen USB-Laufwerk zu sichern. Der gesamte Vorgang läuft reibungslos ab.

Alle paar Stunden möchte ich die oben genannten, mit meinem Video verknüpften Daten auf relativ einfache Weise in meinem Google Drive-Konto sichern. Es macht mir nichts aus, einen Ordner manuell in Google Drive hochzuladen. Eigentlich ist es mir sogar lieber, dies tun zu müssen, weil ich so sicherstellen kann, dass die Sicherung tatsächlich durchgeführt wird.

Alle paar Nächte, bevor ich ins Bett gehe, kopiere ich den gesamten Ordner mit den Videodateien, der viele Gigabyte an Daten enthält, auf mein Google Drive-Konto.

Ich bevorzuge differenzielle Backups gegenüber inkrementellen, da ich im Falle einer erforderlichen Wiederherstellung meiner Daten aus Google Drive dies wahrscheinlich manuell tun könnte, ohne dass es zu Verwirrung kommt.

Bitte bedenken Sie, dass ich sicherlich kein Unix-Systemadministrator in einem großen Unternehmen bin, das Hunderte von Benutzern unterstützt. Ich bin nur ein einzelner Typ, der eine einfache, aber nicht unbedingt vollständig automatisierte Methode möchte, um seine Daten alle paar Stunden extern zu sichern, für den Fall eines katastrophalen Datenverlusts, der höchstwahrscheinlich durch den Diebstahl meines Computers verursacht würde. Ich bin fast sicher, dass rsync das kann, was ich will. Daher zögere ich, eine weitere Anwendung zu installieren.

Antwort1

Bitte sehr!

#!/bin/bash

# written by strobelight, you know who you are.
# license, MIT, go for it.

me=`basename $0`

EXCLUDES="\
    --exclude '*~'
    --exclude '.DS_Store'
"

CANDIDATES=/tmp/candidates

usage() {
    cat <<EOF

$me last_diff_dir new_diff_dir [ dir_to_copy ]

where:
    last_diff_dir  is the directory containing the last differential
    new_diff_dir   is the directory you want files saved to
    dir_to_copy    is optional and is the directory to copy from (default .)

cd directory_to_backup
Full backup: $me full_back full_back
Diff backup: $me full_back diff_1
Diff backup: $me full_back diff_2

EOF
    exit 1
}

get_dir() {
    HERE=`pwd`
    cd $1
    x=`pwd`
    cd $HERE
    echo $x
}

if [ $# -lt 2 ]; then
    usage
fi

LAST_DIR="$1"
NEW_DIR="$2"
DIR_TO_COPY="${3:-.}"

mkdir -p "$LAST_DIR" || exit 1
mkdir -p "$NEW_DIR" || exit 1

[ -d "$LAST_DIR" ] || usage
[ -d "$NEW_DIR" ] || usage
[ -d "$DIR_TO_COPY" ] || usage

LAST_DIR=`get_dir "$LAST_DIR"`
NEW_DIR=`get_dir "$NEW_DIR"`
DIR_TO_COPY=`get_dir "$DIR_TO_COPY"`

# get list of what's different
eval rsync -v --dry-run -axH --delete --update $EXCLUDES "$DIR_TO_COPY/" "$LAST_DIR" | awk '
    /building file list/ { next }
    /^$/ {next}
    /bytes.*received/ { nextfile }
    {
        for(i=5;i<NF;i++) {
            printf("%s ",$i)
        }
        printf("%s\n",$NF)
    }
    ' | sed 's:/$::' > $CANDIDATES
#cat $CANDIDATES

# use list to backup 
eval rsync --files-from=$CANDIDATES -lptgoDxH --delete $EXCLUDES ${DIR_TO_COPY}/ $NEW_DIR

Mein aktuelles Verzeichnis enthält beispielsweise drei 8K-Dateien:

$ ls -1sk
total 24
 8 seg1
 8 seg2
 8 seg3

Mein vollständiges Backup existiert noch nicht, nennen wir das Verzeichnis full_bak

ls ../full_bak
ls: ../full_bak: No such file or directory

Zuerst benötigen wir ein vollständiges Backup, von dem wir Differenziale erstellen können. Ich habe das Skript als test123.sh in mein $HOME/bin-Verzeichnis kopiert. Wenn beide Argumente gleich sind, wird im Wesentlichen ein vollständiges Backup durchgeführt.

$HOME/bin/test123.sh ../full_bak ../full_bak

Skriptausgaben

.
seg1
seg2
seg3

Schauen Sie sich jetzt ../full_bak an

$ ls -1sk ../full_bak
total 24
 8 seg1
 8 seg2
 8 seg3

Nehmen Sie einige Änderungen vor

dd if=/dev/zero of=seg2 bs=512 count=11

Bestätigen Sie, dass Unterschiede bestehen:

$ diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ

Erstellen Sie nun ein Differential

$ $HOME/bin/test123.sh ../full_bak ../differential1
seg2

Sehen Sie sich die Differenzialsicherung an, in der nur die Datei enthalten ist, die sich von der letzten vollständigen Sicherung unterscheidet.

$ ls -1sk ../differential1/
total 8
 8 seg2

Eine weitere Änderung vornehmen

dd if=/dev/zero of=seg4 bs=512 count=10

Prüfen Sie, was anders ist

diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Only in .: seg4

und sehen Sie, wir haben eine neue Datei, die nicht in unserem vollständigen Backup ist, und eine zuvor geänderte Datei.

Führen Sie eine weitere Differenzialdiagnose in ein anderes Verzeichnis durch.

$ $HOME/bin/test123.sh ../full_bak ../differential2
.
seg2
seg4

und sehen Sie, das neue Differential hat das 1. Differential sowie die neue Datei

$ ls -1sk ../differential2
total 16
 8 seg2
 8 seg4

Differenzielle Backups

Hier ist ein Fullbackup-Wrapper mit test123.sh:

#!/bin/bash

FULLDIR=/media/mydisk/home
SRCDIR=/home/user

$HOME/bin/test123.sh $FULLDIR $FULLDIR $SRCDIR

Hier ist ein Differenzierungsskript, das stundenbasiert Unterverzeichnisse erstellt:

#!/bin/bash

FULLDIR=/media/mydisk/fullbackup/home
DIFFDIR=/media/mydisk/differentials/home
SRCDIR=/home/user
DIFFSUB=`date '+BAK_%H'`

$HOME/bin/test123.sh $FULLDIR $DIFFDIR/$DIFFSUB $SRCDIR

verwandte Informationen