Backup automatici su USB tramite UDEV

Posted by on mag 30, 2009 in Blog, Scripting e Sysadmin | No Comments

Utilizzando le rules di UDEV e’ possibile configurare in modo semplice, il sistema in modo tale che all’inserimento di uno specifico device USB (flash o hard disk) esegua uno script predefinito.

Due parole su Udev

Nel momento in cui una qualsiasi periferica HW genera un evento (es. collegamento/scollegamento periferica, cambio di stato, ecc…) il gestore del bus a cui la periferica e’ collegata genera un interrupt a cui fa seguito la risposta del kernel che recupera informazioni sull’evento e dettagli sulla periferica che rende quindi disponibili al sistema tramite Sys-fs.

A questo punto entra in gioco Udev che e’ in grado di analizzare questi eventi hw e, quando configurato per farlo (tramite gli script in /etc/udev/rules.d/), di agire di conseguenza generando azioni software (quali ad esempio il caricamento dei driver corretti, la configurazione dei relativi files di sistema, fino al lancio di applicazioni esterne specifiche).

Come Udev puo’ aiutare chiunque non sia uno sviluppatore del kernel?

Nel mio caso il cliente voleva poter sincronizzare alcuni dati salvati sul proprio fileserver linux su un hard disk usb, il tutto senza aver alcun monitor/tastiera collegato alla macchina server e senza voler sapere nulla di comandi linux o collegamenti ssh, insomma un sistema “for dummies”.

Tramite udevmonitor e’ possibile vedere le informazioni intercettate da udev in seguito a eventi hardware.

Ad esempio lanciando “udevmonitor” con l’opzione “–env” (che consente di visualizzare tutte le informazioni di udev in modo esteso) e quindi collegando un device usb verranno stampate a video molte informazioni tra cui, verso la fine, queste:

gordon ~ # udevmonitor --env
udevmonitor prints the received event from the kernel [UEVENT]
and the event which udev sends out after rule processing [UDEV]
UDEV  [1241867355.712496] add      /devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host8/target8:0:0/8:0:0:0/block/sda/sda1 (block)
UDEV_LOG=3
ACTION=add
DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-1/2-1:1.0/host8/target8:0:0/8:0:0:0/block/sda/sda1
SUBSYSTEM=block
MAJOR=8
MINOR=1
DEVTYPE=partition
SEQNUM=3717
UDEVD_EVENT=1
ID_VENDOR=USB2.0
ID_MODEL=Mobile_Disk
ID_REVISION=1.00
ID_SERIAL=USB2.0_Mobile_Disk_b506f9b3e4b2e5-0:0
ID_SERIAL_SHORT=b506f9b3e4b2e5
ID_TYPE=disk
ID_INSTANCE=0:0
ID_BUS=usb
ID_PATH=pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0
ID_FS_USAGE=filesystem
ID_FS_TYPE=vfat
ID_FS_VERSION=FAT16
ID_FS_UUID=E2C6-1A06
ID_FS_UUID_ENC=E2C6-1A06
ID_FS_LABEL=MELY
ID_FS_LABEL_ENC=MELY
ID_FS_LABEL_SAFE=MELY
DEVNAME=/dev/sda1
DEVLINKS=/dev/disk/by-id/usb-USB2.0_Mobile_Disk_b506f9b3e4b2e5-0:0-part1 /dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0-part1 /dev/disk/by-uuid/E2C6-1A06 /dev/disk/by-label/MELY /dev/block/8:1

Come si puo’ vedere UDEV ci dice che e’ stato collegato un dispositivo USB2, che il kernel l’ha associato a /dev/sda

Nel caso ad esempio del collegamento di un hard disk usb compariranno informazioni relative al device che il kernel ha associato al disco (es. sda), il numero di partizioni presenti, il modello del disco e del controller, il nome (label) dato al disco.

Tutte queste informazioni possono essere utilizzate nelle rules di udev.

E’ quindi sufficiente preparare l’hard disk usb impostando come label, ad esempio, “BACKUP_1″ e creare un nuovo file in /etc/udev/rules.d come ad esempio “70-persistent-backupusb.rules” contenente queste 3 righe:

ACTION!="add", GOTO="persistent_storage_end"

SUBSYSTEM=="block", KERNEL=="sd[a-z][1-9]", ENV{ID_FS_LABEL}=="BACKUP_1", RUN+="/usr/bin/backup_usb %k &"

LABEL="persistent_storage_end"

Con queste informazioni ogni volta che udev rilevera’ il collegamento di un dispositivo di tipo “block” associato a un device di tipo “/dev/sd” (ad es. /dev/sda1) con etichetta di volume “BACKUP_1″ eseguira’ lo script “/usr/bin/backup” passandogli come parametro “%k” ossia il valore del campo KERNEL (ossia il nome del device associato al dispositivo).

Banalmente lo script “/usr/bin/backup” si occupera’ di montare il device, eseguire il backup, smontare il device ed eventualmente segnalare, ad esempio tramite l’invio di una e-mail, l’esito dell’operazione.

Questo e’ solo un esempio molto semplice e banale dell’utilizzo delle rules di Udev, penso si possano pero’ apprezzare le enormi potenzialita’ di questo strumento (abbinate a della buona documentazione reperibile online) nel campo dell’automatizzazione di operazioni di sistema (anche le piu’ disparate) triggerate da eventi hardware.

Leave a Reply

You must be logged in to post a comment.