Memorias USB

Memorias USB personalizadas con logo

2012.05.08

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

Requisitos:
  • 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:

cat /etc/mtab | tail -1 | tr " " "\n" | head -2 | tail -1

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

#!/bin/bash
# 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.

#!/bin/bash
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.

VER MÁS NOTICIAS
Copyright © 2011 - 2017 memorias-usb.com ® All rights reserved.
Mapa Mundial
Sábado, 22 de Julio de 2017