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
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