¿Cómo puedo usar rsync (pero ni rsnapshot ni rdiff-backup ni ninguna otra aplicación) para crear undiferencial¿Copia de seguridad de un directorio ubicado en mi disco local en otro directorio ubicado en ese mismo disco local?
F. Hauri publicó lo siguiente enuna respuesta a¿Cómo crear una copia de seguridad local?:
#!/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
Parece que el guión anterior se acerca bastante a lo que quiero, pero, francamente, a pesar de pasar aproximadamente una hora estudiandoCopias de seguridad sencillas y automatizadas tipo instantánea con Linux y RsyncTodavía tengo una vaga idea de cómo hacer que rsync haga lo que quiero.
Aquí está mi caso de uso:
Estoy editando un video localmente en mi máquina. La suma de los cientos de archivos asociados con ese vídeo será inferior a 5 GB (cinco gigabytes).
Actualmente, uso Grsync para hacer una copia de seguridad de mi disco interno en una unidad USB externa. Aunque en realidad descubrí cómo realizar la misma tarea usando rsync, prefiero usar Grsync porque simplemente necesito iniciarlo y luego hacer clic en un botón para hacer una copia de seguridad de mi directorio interno que contiene mis archivos de video en mi unidad USB externa. Todo el proceso es suave como la seda.
Cada pocas horas, quiero una manera bastante sencilla de hacer una copia de seguridad de los datos mencionados anteriormente asociados con mi video en mi cuenta de Google Drive. No me importa elegir cargar manualmente una carpeta en Google Drive. De hecho, prefiero tener que hacerlo porque me ayudaría a garantizar que la copia de seguridad realmente se esté realizando.
Cada pocas noches, antes de irme a la cama, copio toda la carpeta que contiene los archivos de vídeo, que contiene muchos gigas de datos, en mi cuenta de Google Drive.
Prefiero las copias de seguridad diferenciales a las incrementales porque, en caso de que tuviera que restaurar mis datos desde Google Drive, probablemente podría hacerlo manualmente sin confundirme.
Tenga en cuenta que ciertamente no soy un administrador de sistemas Unix en una gran corporación que brinda soporte a cientos de usuarios. Soy simplemente una persona que quiere un método fácil, pero no necesariamente un método completamente automatizado, para hacer una copia de seguridad de sus datos fuera del sitio cada pocas horas en caso de una pérdida catastrófica de datos, que probablemente se deba al robo de mi computadora. . Estoy casi seguro de que rsync puede hacer lo que quiero. Por tanto, soy reacio a instalar otra aplicación.
Respuesta1
¡Aqui tienes!
#!/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
Por ejemplo, mi directorio actual tiene 3 archivos de 8k:
$ ls -1sk
total 24
8 seg1
8 seg2
8 seg3
Mi copia de seguridad completa aún no existe, llamemos a ese directorio full_bak
ls ../full_bak
ls: ../full_bak: No such file or directory
Primero necesitamos una copia de seguridad completa desde la cual hacer diferenciales. Copié el script en mi directorio $HOME/bin como test123.sh. Cuando ambos argumentos son iguales, esencialmente se realiza una copia de seguridad completa.
$HOME/bin/test123.sh ../full_bak ../full_bak
salidas de script
.
seg1
seg2
seg3
Ahora mira ../full_bak
$ ls -1sk ../full_bak
total 24
8 seg1
8 seg2
8 seg3
Haz algunos cambios
dd if=/dev/zero of=seg2 bs=512 count=11
Confirme que hay diferencias:
$ diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Ahora crea un diferencial
$ $HOME/bin/test123.sh ../full_bak ../differential1
seg2
Mire el diferencial que tiene solo el archivo que es diferente de la última copia de seguridad completa.
$ ls -1sk ../differential1/
total 8
8 seg2
hacer otro cambio
dd if=/dev/zero of=seg4 bs=512 count=10
Comprueba qué es diferente
diff -q . ../full_bak
Files ./seg2 and ../full_bak/seg2 differ
Only in .: seg4
y vemos que tenemos un archivo nuevo que no está en nuestra copia de seguridad completa y un archivo modificado desde antes.
Hacer otro diferencial a otro directorio
$ $HOME/bin/test123.sh ../full_bak ../differential2
.
seg2
seg4
y vea que el nuevo diferencial tiene el primer diferencial así como el nuevo archivo
$ ls -1sk ../differential2
total 16
8 seg2
8 seg4
Copias de seguridad diferenciales
Aquí hay un contenedor de copia de seguridad completa que usa test123.sh:
#!/bin/bash
FULLDIR=/media/mydisk/home
SRCDIR=/home/user
$HOME/bin/test123.sh $FULLDIR $FULLDIR $SRCDIR
Aquí hay un script diferencial que crea subdirectorios según la hora:
#!/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