Règle Udev pour correspondre à n'importe quel périphérique de stockage USB


10

Comment puis-je mettre en œuvre des udevrègles pour tout périphérique de stockage de masse USB branché, pas seulement pour un périphérique spécifique? Que faut-il changer en idVendor, et idProduct?

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

Réponses:


7

Un périphérique de stockage est dans le blocksous - système, vous voudrez donc SUBSYSTEM=="block"dans votre règle, comme ceci:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

Si vous utilisez systemd, vous pouvez exécuter une systemdunité chaque fois qu'un périphérique de stockage USB est ajouté. Créez le fichier d'unité, par exemple /etc/systemd/system/my-usb-rule.service:

[Service]
Type=oneshot
ExecStart=/path/to/script

et la règle, par exemple /etc/udev/rules.d/85-my-usb-rule.rules:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

Maintenant udev, déclenchera my-usb-rule.service(qui à son tour exécutera votre script) sur tout événement d' ajout de périphérique de stockage USB .


N'oubliez pas de recharger la configuration après avoir édité les règles / unités:

udevadm control --reload
systemctl daemon-reload

Lorsque j'ajoute un stockage de masse USB, je voudrais agir sur la ou les partitions qu'il contient. Au niveau udev, je peux voir les événements de 4 sous-systèmes: usb, scsi, bdi et block (dans cet ordre). Les 3 premiers sont inutilisables, car la partition n'est pas encore connue. L'événement de bloc a ID_BUS = scsi, pas usb comme dans votre exemple de code. Je ne vois aucun attribut approprié dans l'événement de bloc, qui me dirait s'il s'agit d'un stockage de masse USB ou non. (Enquête effectuée en utilisant udevadm monitor et udevadm info). Sauf si je pouvais croire que ID_BUS = scsi ne pouvait raisonnablement être autre chose qu'un stockage de masse USB.
Uwe Geuder

@UweGeuder - rien ne vous empêche d'utiliser le nom du périphérique comme argument pour votre programme et basé sur cet acte sur les partitions ...
don_crissti

Eh bien, dans les événements USB, le nom du périphérique ressemble à / dev / bus / usb / 002/040. Je ne sais pas quoi faire avec ça dans mon programme. Dans les événements Block, le nom du périphérique ressemble à / dev / sdb ou / dev / sdb1. C'est ce que je veux, mais maintenant je reviens au problème que ID_BUS = scsi. Je suis allé un peu plus loin: il existe un fichier de règles 80-udisk2, qui ajoute une propriété ID_DRIVE_THUMB. Je ne sais pas à quel point il est robuste, il semble que très peu de fournisseurs soient répertoriés. Mon fichier de règles s'appelait 70- *, donc comme prévu, mon / dev / sdb ne correspondait pas. Assez étrangement / dev / sdb1 correspond, bien que ma règle s'exécute en premier.
Uwe Geuder

1
Ah je note juste que la question d'origine était n'importe quel lecteur de stockage de masse USB. Cela devrait fonctionner avec la règle SUBSYSTEM=="block", SUBSYSTEMS=="usb"(notez la différence avec le S ). Je doute que cela puisse toujours fonctionner avec ENV{ID_BUS}=="usb"dans la réponse d'origine, car je vois la valeur scsi ici. Mais je travaille sur un problème légèrement différent de celui initialement demandé, je veux une clé USB (clé USB), mais pas de disques externes.
Uwe Geuder

1
En fait, la vilaine vérité est que la ENV{ID_BUS}valeur n'est pas la même sur tous les systèmes. Hier, je travaillais sur un ancien système avec udev 210 (je crois. Je ne peux pas vérifier maintenant car la machine n'est pas sur Internet), la valeur était scsi . Maintenant, je suis sur une machine plus récente avec udev 228 et la valeur est USB . Pour la même clé USB, je la porte avec moi. (Je ne sais pas si la version udev est le facteur pertinent ici, pourrait également être le noyau ou tout autre package installant les règles udev, e, g, udisks2). Pourtant SUBSYSTEM=="block", SUBSYSTEMS=="usb"(note S ) pourrait être portable et sûr.
Uwe Geuder
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.