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

3

Eu quero executar automaticamente um comando específico sempre que uma unidade (uma unidade específica ou qualquer outra unidade) estiver conectada a quente. Eu 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 essa é 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, o que detectará a unidade e executará os comandos necessários.

Como posso fazer algo automaticamente em resposta a uma unidade que está sendo conectada? Então, novamente, como posso fazer outra coisa em resposta à unidade que está sendo removida?

    
por Stugol 30.11.2013 / 22:02

1 resposta

4

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

  1. '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;
  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 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.
  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, se precisar montá-lo.
  4. 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.

    
por 01.12.2013 / 12:53