Ayuda script simple en bash para copias de seguridad

2 respostas [Última entrada]
deshecho humano
Desconectado
Joined: 10/15/2016

Hola, he probado muchas herramientas para hacer copias de seguridad y ninguna ha funcionado como quería. Así que he decidido ir a lo simple y seguro con rsync.

He visto muchos ejemplos para conectarme por ssh a una máquina remota y hacer la copia y para hacerla automática y peródicamente mediante crontab. Pero lo que yo quiero es hacer la copia en un disco externo local. Así que me gustaría tener un script que montase el disco y ejecutase varias instrucciones de rsync (para distintos directorios) uno tras otro.

El problema es que no tengo ni idea de bash script.

Lo básico que necesito es que el script compruebe que el disco esté montado y luego ejecutase rsync. He encontrado este ejemplo que se parece bastante a lo que quiero (en el apartado The rsync backup script) [www.bobulous.org.uk/misc/rsync-backup.html]. Lo estoy intentando editar, sin embargo me he quedado atascado en el primer paso. Ya que me dice siempre que el disco no está montado aunque lo esté.

Esta es la salida:
#####
Usage:
mountpoint [-qd] /path/to/directory
mountpoint -x /dev/device

Check whether a directory or file is a mountpoint.

Opciones:
-q, --quiet quiet mode - don't print anything
-d, --fs-devno print maj:min device number of the filesystem
-x, --devno print maj:min device number of the block device

-h, --help display this help and exit
-V, --version output version information and exit

For more details see mountpoint(1).
Mounting the external USB drive.
Mountpoint is /media/nombredeusuario/TOSHIBA\ EXT
mount: mount point EXT does not exist
An error code was returned by mount command!

Parece ser que hay un problema con el nombre del directorio ya que es "TOSHIBA EXT" e intenta montar "EXT".
En el código he puesto esto:
mount_point='/media/nombredeusuario/TOSHIBA\ EXT'

Por último, tengo una duda sobre rsync. He leído que el parámetro -a es ideal para copias de seguridad, pero esto omite los enlaces duros (hard links). Y esto me hace dudar, ¿hay alguna razón por la que no deba copiar enlaces duros en la copia de respaldo? En el peor de los casos si no se copia la carpeta a la que hace referencia será un enlace roto, pero apenas ocupa espacio. Así que tener el enlace roto y no tenerlo es casi lo mismo.

Gracias por vuestra atención.
Saludos.

deshecho humano
Desconectado
Joined: 10/15/2016

Vale he conseguido hacer la parte de montar el disco automáticamente la primera parte otro código que he encontrado (frustratedtech.com/post/52316736743/bash-script-mount-drive-automatically-to-backup)

deshecho humano
Desconectado
Joined: 10/15/2016

Más o menos lo he conseguido, pero tengo un problema y es que cuando el rsync actúa sobre una carpeta muy grande se demora mucho y para la siguiente instrucción me pide la contraseña de sudo y se queda parado hasta que la introduzco. Podría ejecutar el script como root y quitar el sudo de "sudo rsync" pero no sé si es la mejor forma. ¿Alguna sugerencia?

Por cierto, el script me ha quedado más o menos así. Aunque me gustaría pulirlo para que me haga log de errores y muestre el tiempo transcurrido entre otras cosas:

#!/bin/bash

#backup harddrive variables
UUID='FA00B5BE00B581E5'
DATE=`date +%d-%m-%Y`
FULLDATE=`date '+%d-%m-%Y %H:%M:%S'`
USERNAME='xxxx'
BACKUPROOT='/media/'$USERNAME'/Archie/'
BACKUPDIR=$BACKUPROOT'rsync/'$DATE
#PARTITION=`/usr/bin/readlink -f /dev/disk/by-uuid/$UUID`
PARTITION=`readlink -f /dev/disk/by-uuid/$UUID`
TIMER=3

#############################################################
echo $FULLDATE
echo 'UUID: ' $UUID
echo 'Drive Partition: ' $PARTITION;

#check drive and partiton match
if /sbin/blkid | grep -s "$PARTITION" | grep -q "$UUID"; then
echo 'Drive and partition match...'
else
exit
fi

#if [ -z "$DIRECTORY" ]; then
# echo 'No directory present...'
#fi

#check if drive mounted
echo 'Check if drive mounted..'
if grep -qs $PARTITION /proc/mounts; then
#its already mounted
MOUNTED='1'
echo 'Drive already mounted...'
#BACKUPDIR=`grep $PARTITION /proc/mounts | awk '{ print $2 }'`
echo 'Directory: ' $BACKUPDIR
else
#not mounted
MOUNTED='0'
echo 'Mounting drive...'
sudo mkdir -p "$BACKUPROOT"
sudo mount /dev/disk/by-uuid/$UUID "$BACKUPROOT"
echo 'Mounted: ' $BACKUPROOT
fi

#countdown before sync
printf "\nStarting Backup..."
until [ $TIMER = 0 ]; do
printf "$TIMER..."
TIMER=`expr $TIMER - 1`
sleep 1
done
echo ''

#perform home backup
mkdir -p "$BACKUPDIR"
echo "Created backup directory "$BACKUPDIR

sudo rsync -avzHP --stats --delete --human-readable /home $BACKUPDIR
sudo rsync -avzHP --stats --delete --human-readable --exclude 'tmp' --exclude 'cache' --exclude 'run' /var $BACKUPDIR
sudo rsync -avzHP --stats --delete --human-readable /etc $BACKUPDIR
sudo rsync -avzHP --stats --delete --human-readable /usr/local $BACKUPDIR
sudo rsync -avzHP --stats --delete --human-readable /opt $BACKUPDIR
sudo rsync -avzHP --stats --delete --human-readable /media/$USERNAME/Trabajo $BACKUPDIR
sudo rsync -avzHP --stats --delete --human-readable /media/$USERNAME/Multimedia $BACKUPDIR
sudo rsync -avzHP --stats --delete --human-readable /media/$USERNAME/Otros $BACKUPDIR
sudo rsync -avzHP --stats --delete --human-readable --exclude 'Pelis' --exclude 'Series' /media/$USERNAME/Descargas $BACKUPDIR

#clean up
if [ $MOUNTED = 0 ]; then
#unmount and remove dir
echo 'Unmounting drive...'
sudo umount "$PARTITION"
sudo rmdir "$BACKUPROOT"
else
echo 'Leaving drive mounted...'
fi