Blog Tinux Net
Publicado en
Shells commands (bash, zash)

Crear Backup incremental con rsync

Autor

Rsync: Copias Incrementales

El desarrollo de esta script es para hacer copias de seguridad que ademas cada cierto tiempo haga una copia completa y guarde un numero especifico de completas, eliminando las mas antiguas., pero también hacer como git en control de versiones pero sin ramificaciones.

0.- Creamos una variable del path que queremos hacer la copia de seguridad. printenv para ver variables printenv HOME devuelve el path home

1.- Creamos un directorio para la copia de seguridad:

mkdir /mnt/backup

dentro de ella creamos la main para la copia maestra

mkdir /mnt/backup/main

y otra para las incrementales

mkdir /mnt/backup/incrementals

2.- Utilizaremos varios parámetros de rsync para hacer una copia de seguridad distinta. Usa el comando rsync con las siguientes opciones clave:

  • -a: modo de archivo, preserva enlaces simbólicos, permisos, propietario, grupo, etc.
  • -b: hace una copia de seguridad de los archivos antes de actualizarlos.
  • --backup-dir: especifica el directorio donde se almacenarán las versiones anteriores de los archivos.
  • -u: actualiza solo archivos que han cambiado.
  • --delete: elimina archivos en el destino que ya no existen en el origen.
  • --exclude Los directorios o archivos que no queremos que se hagan copia de seguridad como por ejemplo los .git o los modules. Recomendable es crear un archivo de ficheros y/o directorios de exclusión exclude.txt Hay que tener cuidado con este Tip: si la ruta de destino no existe, rsync, la creará si tiene permisos, si se omite la barra al final del directorio «/», rsync, copiará el directorio de origen dentro del directorio de destino.

Preparando el directorio para las incrementales:

mkdir $(date +'%Y-%m-%d:%H%M')

Comando date para generar el directorio con la fecha y la hora como versión. Luego inyectar al comando mkdir para crear con la fecha: Quedaría algo parecido a: 2024-07-05:0914

Para respaldar el origen de la copia de seguridad. Podemos utilizar una variable para guardar la extensión del archivo y del directorio:

dateincr=$(date +'%Y-%m-%d:%H%M')

Para respaldar el directorio /home/origen/ al directorio /mnt/backup/ y almacenar versiones anteriores en un subdirectorio con la fecha:

rsync -ab --backup-dir=/mnt/backup/`date + %F%H%M`
 -u --delete
 --exclude=/mnt/backup/ /home/origen/
 /mnt/backup/incrementales/

Script final en zsh:

#!/bin/zsh
# 
# Black        0;30     Dark Gray     1;30
# Red          0;31     Light Red     1;31
# Green        0;32     Light Green   1;32
# Brown/Orange 0;33     Yellow        1;33
# Blue         0;34     Light Blue    1;34
# Purple       0;35     Light Purple  1;35
# Cyan         0;36     Light Cyan    1;36
# Light Gray   0;37     White         1;37

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White
Orange='\033[1;33m'     #Yellow        1;33

clear
BackupSource=$(printenv PWD)/Source/;
BackupMain=$(printenv PWD)/main/;
BackupIncrementals=$(printenv PWD)/incrementals/;
BackupDateIncrementals=$(date +'%Y-%m-%d:%H%M')

echo "La mecaniva de este script es la siguiente:";
echo "Del archivo Fuente (Source) hace previamente una copia inicial de diferencianasnteriores al archivo de incrementales de los archivos que se han detectado como Modificado ";
echo "Luego hace una actualizacion el archivo main con los nuevos cambios que se han detectado en el Source";
echo "la primera copia se denomina Full Backup";

echo '***************************************************';
echo '*                                                 *';
echo '*                                                 *';
echo "*     ${Green} Sistema de copia de Seguridad Incremental ${White}   *";
echo '*                                                 *';
echo "*    ${Purple}El directorio Origen:                        *";
echo "*     ${Cyan}$BackupSource            *";
echo '*                                                 *';
echo '*                                                 *';
echo '*    El directorio Main:                          *';
echo "*     $BackupMain              *";
echo '*                                                 *';
echo '*                                                 *';
echo '*    El directorio de Incrementales:              *';
echo "*     ${Orange}$BackupIncrementals      *";
echo '*                                                 *';
echo '*                                                 *';
echo '***************************************************';

echo 'Archivos en el directrio Fuente';
eza --color $BackupSource
echo 'Archivos en la Copia Main del Backup';
eza --color $BackupMain;
echo '______________________________________________________';
echo '\n';
echo 'Variable de generacion del la version de la Incremental';
echo 'BackupDateIncrementals: '$BackupDateIncrementals;
echo '\n';
echo 'Ejemplo de posible script hecho con la devolucion de variables:';
echo 'Crea el directorio para la Incremental:'
mkdir $BackupIncrementals/Backup-$BackupDateIncrementals;
rsync -avhb --delete --backup-dir=$BackupIncrementals/Backup-$BackupDateIncrementals $BackupSource $BackupMain;
# rsync -avhb --delete --backup-dir=/ruta/destino/copia_$(date +%d%m%Y%H%M) /ruta/origen/ /ruta/destino/ 
echo '\n';
echo 'Listado de directorio creados'
eza -al $BackupIncrementals;

echo 
echo '***************************************************';
echo '*                                                 *';
echo '*                                                 *';
echo '*                                                 *';
echo "*    ${Purple}Ficheros en Origen:                 *";
echo "*     ${Cyan}$BackupSource                       *";
echo "*      $(eza $BackupSource)                        *"; 
echo '*                                                 *';
echo '*                                                 *';
echo '*    Ficheros en la main del Backup:              *';
echo "*     $(eza  $BackupMain)                         *";
echo '*                                                 *';
echo '*                                                 *';
echo '*    Los ficheros Incrementados:              *';
echo "* $(eza $BackupIncrementals"Backup"-$BackupDateIncrementals )                  *";
echo '*                                                 *';
echo '*                                                 *';
echo '***********************