Généralités système Linux

UDEV : Exécuter un script à l'insertion d'un disque ou clé USB

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

Introduction



Dans cet article, nous allons voir comment exécuter un script lors de l'insertion d'un disque ou une clé USB.

Cet article est rédigé suite à une demande qu'on m'a faite. L'idée était de créer une station de travail pour détecter les virus sur clé USB et de lancer un scan automatique de la clé dès son insertion.

Configurer udev



On va donc créer une règle UDEV pour cette action particulière.

On aura besoin de l'ACTION qui concerne l'ajout, de l'info KERNEL correspondant à la clé USB, et de l'action RUN, qui correspond au script à exécuter.

Pour créer une règle udev, comme d'hab, c'est dans /etc/udev/rules.d :

Code BASH :
cd /etc/udev/rules.d


On va créer un fichier de règle :

Code BASH :
vi 99_ajout_disque.rules


On va écrire la règle udev suivante :

Code BASH :
ACTION=="add", "KERNEL==sd*", RUN+="/usr/local/bin/scanusb.sh"


Le script va s'appliquer à tous les disques. Si on veut exclure sda, on peut mettre une expression régulière plus avancée :

Code BASH :
ACTION=="add", "KERNEL==sd[b-z]", RUN+="/usr/local/bin/scanusb.sh"


On prendra soin de créer le script souhaité évidemment.

On peut spécifier des attributs supplémentaires si on veut que ça s'exécute sur un disque particulier (je pense à une synchro de sauvegarde auto par exemple) :

Code TEXT :
ATTRS{vendor}=="LinuxtricksCompany", ATTRS{model}=="ABCDE", ATTRS{serial}=="123465789"


On recharge udev :

Code BASH :
udevadm control --reload


Ou on reboot.

Tester



Au moment de l'insertion de la clé, le script est exécuté , on peut voir dans les logs.
On passera avant les logs en mode debug

Code BASH :
udevadm control --log-priority=debug
journalctl -f


Voici l'extrai lors du branchement de la clé USB (j'ai coupé au milieu) :

Code BASH :
févr. 13 19:21:48 adrien-testfedora kernel:  sdb: sdb1 sdb2
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: sdb: /usr/lib/udev/rules.d/50-udev-default.rules:63 GROUP 994
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: sdb: /etc/udev/rules.d/60-ioschedulers.rules:6 ATTR '/sys/devices/pci0000:00/0000:00:11.0/0000:02:03.0/usb1/1-1/1-1:1.0/host3/target3:0:0/3:0:0:0/block/sdb/queue/scheduler' writing 'bfq'
[...]
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: sdb: Found 'b8:16' claiming '/run/udev/links/\x2fdisk\x2fby-path\x2fpci-0000:02:03.0-usb-0:1:1.0-scsi-0:0:0:0'
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: sdb: Preserve already existing symlink '/dev/disk/by-path/pci-0000:02:03.0-usb-0:1:1.0-scsi-0:0:0:0' to '../../sdb'
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: sdb: /etc/udev/rules.d/99_ajout_disque.rules:1 RUN '/usr/local/bin/scanusb.sh'
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: sdb: Running command "/usr/local/bin/scanusb.sh"
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: sdb: Starting '/usr/local/bin/scanusb.sh'
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: Successfully forked off '(spawn)' as PID 14085.
févr. 13 19:21:48 adrien-testfedora systemd-udevd[14084]: sdb: Process '/usr/local/bin/scanusb.sh' succeeded.


On repassera les logs d'udev en warning après :

Code BASH :
udevadm control --log-priority=warning