Quiero ejecutar automáticamente un comando específico cada vez que una unidad (una unidad específica o cualquier unidad) se conecta en caliente. Estoy ejecutando un sistema Debian sin cabeza.
Para ser más específico, quiero montar automáticamente la unidad. Podría hacer esto con AutoFS, pero esta es una unidad Truecrypt y AutoFS no funcionará con ese AFAIK. Por lo tanto, necesito ejecutar algún tipo de script cada vez que se conecta una unidad, que detectará la unidad y ejecutará los comandos necesarios.
¿Cómo puedo hacer algo automáticamente en respuesta a la conexión de una unidad? Por otra parte, ¿cómo puedo hacer algo más en respuesta a la eliminación de la unidad?
Respuesta1
En realidad, es bastante fácil: necesita escribir una regla udev personalizada, que puede colocar en
/etc/udev/rules.d/10-local.rules
La ventaja de hacerlo es que su regla personalizada se leerá antes que las demás reglas.
Este archivo contendrá una sola línea de este formulario.
<conditions to be met> KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
El significado de esto es:
- Las 'condiciones que deben cumplirse' son una serie de condiciones, específicas de su disco, que lo identifican de forma única, de modo que no se realiza ninguna acción cuando se inserta un HDD diferente;
- KERNEL=="sd?1" le dice a udev que comience a verificar esta regla solo cuando se detecten nuevas particiones /dev/sda1, /dev/sdb1,.... Si es necesario, puedes hacer lo mismo no con una partición, sino con el dispositivo, en cuyo caso KERNEL=="sd?" es la declaración apropiada.
- NAME="my_usb_adapter" creará un nodo persistente en /dev/my_usb_adapter, para que sepa dónde encontrar el desarrollador que desea montar, si es necesario montarlo.
- La regla RUN es evidente. Recuerde hacerlo
my_programejecutable sin requerir entrada o salida de terminal.
Puedes obtener la información necesaria para realizar el emparejamiento con el comando:
udevadm info -a -p $(udevadm info -q path -n /dev/sdb)
si su disco es /dev/sdb, de lo contrario modifíquelo como mejor le parezca. Esto proporcionará una gran cantidad de información. yo buscaría
ATTRS{idVendor}=="18a5"
ATTRS{idProduct}=="0302"
ATTRS{serial}=="TT0E4E008XW3DT9H"
(Estos valores son para uno de mis dongles USB, sus valores serán diferentes). Una advertencia importante: las reglas de coincidencia deben tomarse del mismo dispositivo principal, no se pueden mezclar.
Ahora podemos escribir la regla final como:
ATTRS{idVendor}=="18a5", ATTRS{idProduct}=="0302", ATTRS{serial}=="TT0E4E008XW3DT9H", KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
Tenga en cuenta que los archivos udev no pueden dividir líneas: si lo hace, udev verá la línea discontinua como dos reglas separadas. No habrá salida a su terminal. Además, he sido muy cuidadoso al distinguir =, ==y +=: asegúrese de no introducir errores en esto.


