Como executar um programa quando um disco rígido específico está conectado (no Debian)?

Como executar um programa quando um disco rígido específico está conectado (no Debian)?

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 é:

  1. '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;
  2. 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.
  3. 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.
  4. A regra RUN é evidente. Lembre-se de tornar my_programexecutá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.

informação relacionada