Regla Udev para que coincida con cualquier dispositivo de almacenamiento usb


10

¿Cómo puedo implementar udevreglas para cualquier dispositivo de almacenamiento masivo USB conectado, no solo para uno específico? ¿Qué se debe cambiar en idVendory idProduct?

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

Respuestas:


7

Hay un dispositivo de almacenamiento en el blocksubsistema, por lo que querrá SUBSYSTEM=="block"en su regla, así:

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

Si está utilizando systemd, puede ejecutar una systemdunidad cada vez que se agrega un dispositivo de almacenamiento USB. Cree el archivo de la unidad, por ejemplo /etc/systemd/system/my-usb-rule.service:

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

y la regla, por ejemplo /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"

Ahora udevse activará my-usb-rule.service(que a su vez ejecutará su script) en cualquier evento de agregar dispositivo de almacenamiento usb .


No olvide volver a cargar la configuración después de editar las reglas / unidades:

udevadm control --reload
systemctl daemon-reload

Cuando agrego un almacenamiento masivo USB, me gustaría actuar sobre las particiones que contiene. En el nivel de udev puedo ver eventos de 4 subsistemas: usb, scsi, bdi y block (en este orden). Los primeros 3 son inutilizables, porque la partición aún no se conoce. El evento de bloque tiene ID_BUS = scsi, no usb como en su ejemplo de código. No veo ningún atributo adecuado en el evento de bloqueo, eso me diría si es almacenamiento masivo USB o no. (Investigación realizada utilizando el monitor udevadm y la información de udevadm). A menos que pueda confiar en que ID_BUS = scsi no podría ser razonablemente otra cosa que el almacenamiento masivo USB.
Uwe Geuder

@UweGeuder - nada que le permite usar el nombre del dispositivo como un argumento a su programa y en base a ese acto en las particiones ...
don_crissti

Bueno, en los eventos USB, el nombre del dispositivo es algo así como / dev / bus / usb / 002/040. No estoy seguro de qué hacer con eso en mi programa. En los eventos de bloqueo, el nombre del dispositivo es algo así como / dev / sdb o / dev / sdb1. Eso es lo que quiero, pero ahora vuelvo al problema de que ID_BUS = scsi. Llegué un poco más lejos: hay un archivo de reglas 80-udisk2, que agrega una propiedad ID_DRIVE_THUMB. No estoy seguro de cuán robusto es, parece que hay muy pocos proveedores listados. Mi archivo de reglas se llamaba 70- *, por lo que, como se esperaba, mi / dev / sdb no coincidía. Curiosamente, / dev / sdb1 coincidió, aunque mi regla se ejecuta primero.
Uwe Geuder

1
Ah, solo noto que la pregunta original era cualquier unidad de almacenamiento masivo USB. Eso debería funcionar con la regla SUBSYSTEM=="block", SUBSYSTEMS=="usb"(tenga en cuenta la diferencia con la S ). Dudo que siempre pueda funcionar ENV{ID_BUS}=="usb"en la respuesta original, porque veo el valor scsi aquí. Pero estoy trabajando en un problema ligeramente diferente al que se preguntó originalmente, quiero una memoria USB (pendrive), pero no unidades externas.
Uwe Geuder

1
En realidad, la verdad desagradable es que el ENV{ID_BUS}valor no es el mismo en todos los sistemas. Ayer estaba trabajando en un sistema antiguo con udev 210 (creo. No puedo comprobarlo ahora porque la máquina no está en Internet). Allí el valor era scsi . Ahora, estoy en una máquina más nueva con udev 228 y el valor es usb . Para el mismo dispositivo USB, lo llevo conmigo. (no estoy seguro si la versión de udev es el factor relevante aquí, también podría ser el kernel o cualquier otro paquete que instale las reglas de udev, e, g, udisks2) Aún así SUBSYSTEM=="block", SUBSYSTEMS=="usb"(nota S ) podría ser portátil y seguro.
Uwe Geuder
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.