Regra Udev para corresponder a qualquer dispositivo de armazenamento USB


10

Como posso implementar udevregras para qualquer dispositivo de armazenamento em massa USB conectado, não apenas para um específico? O que deve ser mudado idVendore idProduct?

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

Respostas:


7

Um dispositivo de armazenamento está no blocksubsistema, então você desejará SUBSYSTEM=="block"em sua regra, assim:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

Se você estiver usando systemd, poderá executar uma systemdunidade sempre que um dispositivo de armazenamento USB for adicionado. Crie o arquivo da unidade, por exemplo /etc/systemd/system/my-usb-rule.service:

[Service]
Type=oneshot
ExecStart=/path/to/script

e a regra, por exemplo /etc/udev/rules.d/85-my-usb-rule.rules:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

Agora udevserá acionado my-usb-rule.service(que, por sua vez, executará seu script) em qualquer evento de adição de dispositivo de armazenamento USB .


Não se esqueça de recarregar a configuração depois de editar as regras / unidades:

udevadm control --reload
systemctl daemon-reload

Quando adiciono um armazenamento em massa USB, gostaria de atuar nas partições que ele contém. No nível do udev, posso ver eventos de 4 subsistemas: usb, scsi, bdi e block (nesta ordem). Os três primeiros são inutilizáveis, porque a partição ainda não é conhecida. O evento de bloco possui ID_BUS = scsi, não usb, como no seu exemplo de código. Não vejo nenhum atributo adequado no evento de bloco que me diga se é ou não armazenamento em massa USB. (Investigação realizada usando o monitor udevadm e informações sobre o udevadm). A menos que eu acredite que ID_BUS = scsi não possa ser razoavelmente outra coisa senão armazenamento em massa USB.
precisa saber é o seguinte

@UweGeuder - nada que você parar de usar o nome do dispositivo como um argumento para o seu programa e com base em que atuam sobre as partições ...
don_crissti

Bem, nos eventos USB, o nome do dispositivo é algo como / dev / bus / usb / 002/040. Não sei o que fazer com isso no meu programa. Nos eventos de bloco, o nome do dispositivo é algo como / dev / sdb ou / dev / sdb1. É isso que eu quero, mas agora estou de volta ao problema que ID_BUS = scsi. Aprendi um pouco mais: existe um arquivo de regras 80-udisk2, que adiciona uma propriedade ID_DRIVE_THUMB. Não tendo certeza de quão robusto é, parece haver muito poucos fornecedores listados. Meu arquivo de regras foi chamado 70- *, portanto, como esperado, meu / dev / sdb não correspondeu. Estranhamente, o / dev / sdb1 corresponde, embora minha regra seja executada primeiro.
precisa saber é o seguinte

1
Ah, acabei de notar que a pergunta original era qualquer unidade de armazenamento em massa USB. Isso deve funcionar com a regra SUBSYSTEM=="block", SUBSYSTEMS=="usb"(observe a diferença com o S ). Duvido que ele possa sempre funcionar com ENV{ID_BUS}=="usb"a resposta original, porque vejo o valor scsi aqui. Mas estou trabalhando em um problema ligeiramente diferente do originalmente solicitado, quero qualquer pendrive (pendrive), mas não unidades externas.
Uwe Geuder

1
Na verdade, a verdade desagradável é que o ENV{ID_BUS}valor não é o mesmo em todos os sistemas. Ontem eu estava trabalhando em um sistema mais antigo com o udev 210 (eu acredito. Não é possível verificar agora porque a máquina não está na internet). Lá o valor era scsi . Agora, estou em uma máquina mais nova com o udev 228 e o valor é usb . Para o mesmo pendrive, estou carregando comigo. (não tenho certeza se a versão do udev é o fator relevante aqui, também pode ser o kernel ou qualquer outro pacote que esteja instalando as regras do udev, e, g, udisks2). Ainda assim SUBSYSTEM=="block", SUBSYSTEMS=="usb"(a nota S ) pode ser portátil e segura.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.