Cómo automatizar una memoria USB en Ubuntu para hacer copias de seguridad
Primera norma al realizar cualquier tarea informática que implique trabajar con archivos: haz copia de seguridad. Siempre.
Pero no nos engañemos, a la hora de la verdad es raro que nos dediquemos a hacer copias de seguridad de los archivos sobre los que estamos a punto de trabajar: porque se nos olvida, por las prisas, o simplemente por pereza. Y a veces, esa pereza se paga muy cara..
Por este motivo, hoy os proponemos un sencillo pero potente script realizado para GNU/Linux, que facilita y agiliza esta rutinaria tarea, manteniendo nuestros archivos a salvo en una memoria USB y, además, conservando no una, sino las 10 últimas copias de seguridad realizadas (por si no arrepentimos de los cambios que hicimos el día anterior, por ejemplo), borrando de forma automática los backups más antiguos para no saturar inútilmente el espacio disponible en la memoria USB. Por si esto no fuera ya suficiente, se nos mostrará información de la capacidad de almacenamiento disponible y se nos permitirá controlar el proceso de forma cómoda e intuitiva, convirtiendo así nuestro pendrive en una "memoria USB inteligente".
- Sistema operativo GNU/Linux, preferiblemente basado en Debian (en nuestro ejemplo usaremos Ubuntu).
- Una memoria USB: conviene que sea de gran capacidad, lo ideal sería disponer de una memoria USB de 10 veces mayor capacidad (o más) que el tamaño que ocupen habitualmente los archivos de la ruta en la que trabajamos.
Pasos a seguir:
Para comenzar, debemos asegurarnos de tener instalado gvfs, usbmount o algún otro programa que permita que las memorias USB
que conectemos al ordenador se monten de forma automática (en Ubuntu esta acción está habilitada por defecto, por lo que no necesitaremos preocuparnos de ello), y zenity, un programa que nos permite interactuar con el entorno gráfico de forma sencilla (en algunas versiones antiguas de GNU/Linux, en lugar de zenity, se utilizaba Xdialog).Una vez aclarado esto, procedemos a identificar en Linux una memoria USB que acabemos de conectar al ordenador. Tal y como ya explicamos en el tutorial sobre cómo "convertir una memoria USB en la llave de acceso a tu ordenador", el método que más nos interesa es mediante la lectura de /etc/mtab:
En nuestro ejemplo, obtendremos el siguiente resultado: /media/A031-C74A
Ya tenemos la ruta de destino para nuestros backups. Como ruta de origen, supondremos que queremos guardar copias de todo el contenido de "/home/webmaster/proyectos".
El script que usaremos es el siguiente. Para facilitanos a nostros mismos la modificación de las rutas de origen y destino, lo aislaremos al inicio del script en las variables $USB (para el punto de montaje de nuestra memoria USB) y $FILES (para la ruta de archivos de la que queremos realizar el backup).
# Rutas que se usaran para el backup
USB="/media/A031-C74A";
FILES="/home/webmaster/proyectos"
mkdir $USB/backups 2>/dev/null
# Se asegura de que el pendrive está realmente montado sobre esa ruta
if((`cat /etc/mtab|grep $USB|wc -l`<1));then
zenity --error --title "Operacion cancelada" --text "El dispositivo "$USB" no esta montado."
else
# Comrprueba el espacio disponible para backups
DISK=`df -h|grep $USB|tr " " "\n"|grep "%"|tr -d "%"`
if((DISK>70));then
zenity --warning --text "ATENCION: "$USB" lleno al "$DISK"%"
fi
zenity --question --text "Deseas realizar una copia de seguridad de "$FILES" en "$USB"?"
if [ "$?" == "0" ];then
# Borra backups anteriores a 10 dias
cd $USB/backups
CONT=1
NUM=`ls|wc -l`
for A in `ls`;do
if((CONT<NUM-10));then
rm -Rf $A
fi
((CONT=CONT+1))
done
# Genera backups por fecha
Day=`date +%a`
DIR=`date "+%Y.%m.%d_%H.%M"`
mkdir $USB/backups/$DIR
QUANT=`ls $FILES|wc -l`
CONT=1;ERRORS=0
(
sleep 1
while((CONT$lt;QUANT));do
for A in `ls $FILES|head -$CONT|tail -1`;do
echo "# Copiando "$A" .."
mkdir $USB/backups/$DIR/$A
cp -Rpf $FILES/$A/* $USB/backups/$DIR/ 2>/tmp/backup.err
((ERRORS=ERRORS+`cat /tmp/backup.err|wc -l`))
done
((PERCENT=(CONT*100)/QUANT))
if((PERCENT>99));then
PERCENT=99
fi
echo $PERCENT;sleep 1
((CONT=CONT+1))
done
echo "# Finalizando el backup.." ; sleep 1
echo "100" ;sleep 1
) | zenity --progress --title "Backup en curso" --text "Preparando los archivos.." --percentage 0 --auto-close
if [ "$?" != "-1" ]; then
# Despues de realizar los cambios, compara el espacio disponible
DISK=`df -h|grep $USB|tr " " "\n"|grep "%"|tr -d "%"`
if((DISK>98));then
zenity --error --text "El espacio en "$USB" esta lleno al "$DISK"%"
else
if((ERRORS>1));then
zenity --warning --text "Se encontraron "$ERRORS" errores"
fi
zenity --info --title "Backup completado!" --text "Tras los cambios aplicados, queda lleno al "$DISK"%"
fi
zenity --question --text "Deseas desmontar ahora la memoria USB?"
if [ "$?" == "0" ];then
umount $USB && zenity --info --text "Ya puedes extraer tu memoria USB del ordenador." || zenity --error --text "No pudo desmontarse el dispositivo"
fi
else
zenity --error --title "Operacion cancelada" --text "No pudo completarse la copia de los archivos."
fi
fi
fi
No olvidar darle permisos de ejecución al script: chmod +x ~/backup2usb.sh
Si ejecutais este script sin tener la memoria USB conectada y montada, os dará el siguiente mensaje de error:

En cambio, si la memoria USB está montada, primero nos informará con un mensaje de alerta en el caso de que su espacio disponible estuviera por debajo del 30%. Después nos preguntará si queremos realizar el backup (para poder controlar que no haga un backup cada vez que conectemos la memoria USB, ya que a veces simplemente querremos recuperar algún archivo que hubiéramos borrado o modificado) y, en caso de seguir adelante, veremos en todo momento lo que está haciendo mediante una ventana de barra de progreso :)

Por último, se nos informará de la capacidad disponible en la memoria USB después de haberle copiado los archivos (y los posibles errores que pudieran darse durante el proceso).

Pero ejecutar este script puede ser bastante incómodo, y lo que buscamos precisamente es comodidad. Y si lo automatizamos para que se ejecute regularmente, nos mostrará una ventana de diálogo cada vez que realice la comprobación, lo cual sería demasiado molesto. Por estos motivos, necesitaremos un segundo script que controle cuándo tenemos conectada la memoria USB de backups, y ejecute el script una sola vez hasta la siguiente vez que extraigamos la memoria USB y la volvamos a conectar más adelante.
if((`ls /tmp/|grep usbplugged.info|wc -l`<1));then
touch /tmp/usbplugged.info
fi
N=11;while [ 0 ];do
if((`cat /etc/mtab|grep MUZZY|wc -l`>0));then
# Solo lanza el script de backups la primera vez que detecta que el dispositivo esta montado
if((`cat /tmp/usbplugged.info|wc -c`<1));then
/home/webmaster/backup2usb.sh;
fi
printf "ok">/tmp/usbplugged.info
else
# Reinicia el ticket
printf "">/tmp/usbplugged.info
fi
sleep 5
done
No olvidar darle permisos de ejecución al script: chmod +x ~/whenplug.sh
Por desgracia, no podemos automatizar la ejecución de estos scripts en crontab, ya que se ignorarían las llamadas a zenity (por tratarse de un programa con interfaz gráfica). Es por ese motivo por el que el segundo script se ejecuta a sí mismo en bucle cada 5 segundos. Para automatizarlo, por lo tanto, lo que deberemos hacer es añadirlo a la lista de aplicaciones que se ejecutan al inicio de la sesión gráfica de nuestro usuario (en Gnome se accede a esa opción mediante el menu del panel superior: "Sistema" > "Preferencias" > "Aplicaciones al inicio").
De este modo, solo tendremos que insertar la memoria USB en nuestro ordenador para que nos aparezca de forma automática el proceso auto-guiado para gestionar los backups.