%3F.png)
Desejo executar automaticamente um comando específico sempre que uma unidade (uma unidade específica ou qualquer unidade) for conectada a quente. Estou executando um sistema Debian sem cabeça.
Para ser mais específico, quero montar automaticamente a unidade. Eu poderia fazer isso com o AutoFS, mas esta é uma unidade Truecrypt e o AutoFS não funcionará com esse AFAIK. Portanto, preciso executar algum tipo de script sempre que uma unidade estiver conectada, que detectará a unidade e executará os comandos necessários.
Como posso fazer algo automaticamente em resposta à conexão de uma unidade? Então, novamente, como posso fazer outra coisa em resposta à remoção da unidade?
Responder1
Na verdade, é muito 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 atendidas' são uma série de condições, específicas do seu disco, que o identificam exclusivamente, para que nenhuma ação seja executada quando um HDD diferente for 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 precisar, você pode fazer o mesmo não com uma partição, mas com o dispositivo, nesse caso KERNEL=="sd?" é a afirmaçã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, caso precise montá-lo.
- A regra RUN é evidente. Lembre-se de tornar
my_program
executável sem exigir entrada ou saída do 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 conforme achar necessário. Isso fornecerá uma grande quantidade de informações. eu procuraria
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 advertência importante: as regras correspondentes devem ser obtidas 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 do 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, tive muito cuidado ao distinguir =
, ==
, e +=
: certifique-se de não introduzir erros nisso.