Na verdade, é bem fácil: você precisa escrever uma regra personalizada do udev, que pode ser colocada em
/etc/udev/rules.d/10-local.rules
A vantagem de fazer isso é que sua regra personalizada será lida antes das outras regras.
Este arquivo conterá uma única linha deste formulário
<conditions to be met> KERNEL=="sd?1", NAME="my_usb_adapter", RUN+="/home/my_name/bin/my_program"
O significado disso é:
- 'condições a serem cumpridas' são várias condições específicas do seu disco, que o identificam de forma exclusiva, para que nenhuma ação seja executada quando um disco rígido diferente é inserido;
- KERNEL == "sd? 1" diz ao udev para começar a verificar esta regra somente quando novas partições / dev / sda1, / dev / sdb1, ... forem detectadas. Se você precisar, você pode fazer o mesmo não com uma partição, mas com o dispositivo, nesse caso KERNEL == "sd?" é a declaração apropriada.
- NAME="my_usb_adapter" criará um nó persistente em / dev / my_usb_adapter, para que você saiba onde encontrar o dev a ser montado, se precisar montá-lo.
- A regra RUN é óbvia. Lembre-se de tornar
my_program
executável sem exigir entrada ou saída de terminal.
Você pode obter as informações necessárias para realizar a correspondência com o comando:
udevadm info -a -p $(udevadm info -q path -n /dev/sdb)
se o seu disco for / dev / sdb, caso contrário modifique como achar melhor. Isso fornecerá uma grande quantidade de informações. Eu procuraria por
ATTRS{idVendor}=="18a5"
ATTRS{idProduct}=="0302"
ATTRS{serial}=="TT0E4E008XW3DT9H"
(esses valores são para um dos meus dongles USB, seus valores serão diferentes). Uma ressalva importante: as regras de correspondência devem ser tiradas do mesmo dispositivo pai, você não pode misturá-las.
Agora podemos escrever a regra 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"
Tenha em mente que os arquivos udev não podem quebrar linhas: se você fizer isso, o udev verá a linha quebrada como duas regras separadas. Não haverá saída para o seu terminal. Além disso, tenho sido bastante cuidadoso ao distinguir =
, ==
e +=
: certifique-se de não apresentar nenhum erro nisso.