Script de backup con rsync
Con este pequeño script hacemos el backup del USB del trabajo a nuestro disco duro:
Origen: /ruta origen
Destino: /ruta destino
OJO - cuando tenemos espacios en los nombres hay que usar ‘' para que el script sepa que es un espacio
#!/bin/bash
<< 'Comment'
Opciones rsync:
--delete: borrar los archivos que fueron borrados de la carpeta origen en la carpeta destino
-a: mantiene el usuario, grupo, permisos, fecha y hora, así como los enlaces simbólicos
-v: la información imprimida durante la ejecución del programa será mucho más detallada,
-h: nos da las tasas de transferencia y el tamaño de los archivos en unidades razonables
-u: evitar copiar archivos que ya tenemos en la carpeta de destino que no has sido modificados en la carpeta de origen
Comment
rsync --progress --stats --delete -avhiu /media/user/Nuevo\ vol/Origen /home/user/Destino
Configuración con reglas UDEV
Primero debemos obtener el idProduct y el idVendor del nuestro usb
lsusb
Bus 002 Device 003: ID 0781:5581 SanDisk Corp. Ultra
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
idVendor = 0781
idProduct = 5581
Con estos datos creamos un fichero .rules:
sudo nano /etc/udev/rules.d/10.backup_usb.rules
SUBSYSTEM=="block", ACTION=="add", ATTRS{idVendor}=="0781", ATTRS{idProduct}=="5581", SYMLINK+="external", RUN+="/home/user/backup_usb.sh"
Por último, recargamos las reglas udev para que el sistema ejecute el script al enchufar nuestro pendrive:
udevadm control --reload
Este método funcionaria de maravilla para usb normales. El problema es que mi usb del trabajo está encritado con bitlocker y cuando se ejecuta la regla udev todavía no está montada la partción del usb porque antes tenemos que introducir la contraseña de bitlocker, por lo que no funciona mi backup automático.
Configuración con systemd
La solución al problema anterior es crear un servicio systemd que ejecute mi script de backup cuando se monta la partición que nos interesa.
Creamos nuestro backup_usb.service en /home/user/.config/systemd/user:
cat backup_usb.service
[Unit]
Description=Backup pendrive trabajo
Requires=media-label-user.mount
After=media-label-user.mount
[Service]
ExecStart=/home/user/Apps/backup_usb.sh
[Install]
WantedBy=media-label-user.mount
Para buscar las media label:
sudo systemctl list-units -t mount
Aqui aparecerá una etiqueta similar a esta entre otras muchas:
media-user-Work.mount
Por último habilitamos nuestro servicio:
systemctl --user enable backup_usb.service
Al crear el enlace simbólico nos dirá el sistema que estamos creando un servicio con una dependencia que no existe:
Unit /home/user/.config/systemd/user/backup_usb.service is added as a dependency to a non-existent unit media-user-Work.mount.
No importa porque cuando se ejecute el servicio al insertar el pendrive debería funcionar correctamente ya que la unidad se crea en ese momento.
Fuentes:
Systemd
https://askubuntu.com/questions/25071/how-to-run-a-script-when-a-specific-flash-drive-is-mounted