Como verificar se uma regra do udev foi acionada?

15

Estou tentando me familiarizar com o udev, no Ubuntu 13.10.

Aqui está minha primeira regra simples 95.usbbackup.rules:

ACTION=="add", SUBSYSTEMS="usb", RUN+="/usr/local/bin/my_backup.sh"

e aqui está o script (que foi chmodded + x) my_backup.sh:

#!/bin/bash
touch /tmp/test

Nada acontece quando eu conecto unidades externas. Como posso verificar (um log, um comando, qualquer coisa) se a regra foi acionada?

Muito obrigado

pouzzler
fonte
2
Eu acho que você quer dizer SUBSYSTEMS=="usb". Ou seja, o dobro dos ==testes de igualdade, em vez dos únicos, =que atribui um valor a uma chave.
precisa saber é o seguinte

Respostas:

5

Tenho certeza que isso deve funcionar. Você recarregou suas regras do udev depois de editá-las?

udevadm control --reload-rules && udevadm trigger como raiz.

Redsandro
fonte
Fiz uma regra mais restrita: KERNEL == "sdb", que funciona. O udev trata apenas regras que identificam algum hardware exclusivamente?
pouzzler
Não, tentar KERNEL!="sdz*"e você deve obter tudo (exceto sdz [1-9])
Redsandro
5
Isso realmente não responde à pergunta. Como você sabe se as regras foram acionadas?
precisa saber é o seguinte
1
Você sabe porque o script é executado. Você pode fazê-lo gravar em um arquivo de log. Tambémudevadm monitor
Redsandro
2

Você pode dar um comando como root assim:

monitor udevadm

Ele será exibido quando uma regra for acionada.

user2703782
fonte
11
udevadm monitormostra apenas os eventos do udev, mas não se uma regra correspondente foi acionada. No entanto, você pode procurar o evento que deve acionar a regra, mas não sabe se sua regra funciona.
F.Raab
2

Estou executando o kernel 3.0.35, mas o seguinte funciona para mim.

Para obter o caminho para o dispositivo, você pode fazer algo assim:

udevadm info --name /dev/sda1 --query all

Você obterá mais informações do que precisa, mas está interessado no DEVPATH. Então, para ver quais regras do udev são executadas, execute o seguinte:

udevadm test DEVPATH

Eu não acho que isso realmente execute as regras, a documentação diz que isso 'simula' os eventos para o dispositivo especificado. Para obter mais informações, consulte esta página de manual: https://www.freedesktop.org/software/systemd/man/udevadm.html

JSunderland
fonte
1

Com o udev / systemd versão 241 e semelhante, como root:

udevadm control --log-priority=debug
journalctl -f

Ou para torná-lo permanente, novamente como raiz:

vi /etc/udev/udevd.conf
systemctl restart systemd-udevd
journalctl -f

PS: a resposta errada mais frequente ainda que IMHO se parece com:

udevadm -d test / devices / where / is / my / device | & menos

... mas isso tem vários problemas. Os principais:

  • where/is/my/device? Tedioso, complicado e propenso a erros.

  • Comparar respostas antigas com a saída recente da versão 241 do udev, udevadm testparece mostrar menos informações do que costumava.

  • udevadm -d test é apenas uma simulação ! Sempre que avisa:

    Este programa é apenas para depuração, não executa nenhum programa especificado por uma chave RUN. Pode mostrar resultados incorretos, porque alguns valores podem ser diferentes ou não estar disponíveis em uma execução de simulação.

udevadm test é para desenvolver uma nova regra, não para solucionar problemas de regras quebradas, ausentes ou substituídas.

Marcha
fonte
0

Eu estava tendo o mesmo problema com o Raspberry Pi 3 B +. Eu estava tentando invocar um script para inserir um dispositivo de armazenamento USB. As regras não são registradas no syslog; portanto, fica muito difícil entender qual regra funcionou ou qual falhou.

Então eu fiz o seguinte:

  1. Criei meu arquivo de regras em /etc/udev/rules.d/100-myrule.rules
  2. Então eu executei o comando sudo /etc/init.d/udev restart

e quando chequei, funcionou.

Uma informação que pode ou não ser útil é que os sistemas de arquivos são somente leitura para o udev até que o comando na etapa 2 seja executado.

MSharq
fonte
0

udevadm test $(udevadm info --query=path --name=device_name)deve informar quais comandos seriam executados em um plug-in de dispositivo, citando as udevregras envolvidas. Por exemplo:

# udevadm test /block/sdd
...
udev_rules_apply_to_event: PROGRAM '/sbin/multipath -c /dev/sdd' /lib/udev/rules.d/40-multipath.rules:11
...
Dmitry Grigoryev
fonte