Como depurar uma regra do udev (em /etc/udev/rules.d/…)

11

Estou criando uma nova regra básica

/etc/udev/rules.d/10-myrule.rules

contendo:

KERNEL!="sdb*", GOTO="auto_mount_end"
ACTION=="add", RUN+="/usr/bin/mount /dev/sdb1 /media"
LABEL="auto_mount_end"

Eu salvei, reiniciei e inseri um cartão SD (reconhecido por /dev/sdb1 , vejo com dmesg ), mas nada acontece. Quando faço manualmente mount /dev/sdb1 /media , funciona.

Como posso diagnosticar / depurar uma regra udev ?

Nota: Estou usando o ArchLinux, mas deve ser o mesmo em qualquer distro?

    
por Basj 04.05.2015 / 02:29

3 respostas

6

  • 10- como mencionado por jasonwryan, use numeração alta (90's good). Então você governa não será substituído por outro.
  • Use as chaves mínimas exatamente como você realmente precisa. Exemplo, != & GOTO / LABEL , em vez disso, use diretamente ==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • Seu alvo foi sdb1 com comando fixo, minimize a correspondência cega usando KERNEL=="sdb1"

  • Eu acho útil criar uma regra de depuração de sombra, chamei de sombra porque sempre deixo lá no mesmo arquivo, então eu uso quando preciso.

    ACTION=="add", KERNEL=="sdb*", RUN+="/bin/sh -c 'echo == >> /home/user/Desktop/udev-env.txt; env >> /home/user/Desktop/udev-env.txt'"
    #ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    

    Observação: udev-env.txt é criado e, em seguida, a regra é acionada de qualquer maneira. Linha == correspondente a um nó correspondente. O ENV gravado nesse arquivo pode ser uma mistura entre 2 nós ou mais, criado quase no mesmo tempo, é um problema de buffer stdout .

  • Use udevadm monitor -u , udevadm test ... e udevadm trigger ... para verificar quais regras processaram os eventos.

  • Dentro dos scripts, cabe a você fazer o log de depuração e capturar comandos com falha, salvando também o valor de retorno stdout & stderr messages.

Atualização:

  • Referência: udev_237 - man udev (Ubuntu_18.04)

    RUN{type}

    Note that running programs that access the network or mount/unmount filesystems is not
    allowed inside of udev rules, due to the default sandbox that is enforced on
    systemd-udevd.service.
    
por 05.06.2015 / 10:25
1

Acho que o comando que você está procurando aqui é udevadm . Você usará os parâmetros trigger e test para acionar uma nova verificação dos eventos do udev e para testar um evento específico, respectivamente.

Eu aprendi isso da maneira mais difícil quando estou falando com o novo nome de dispositivo de rede no EL 7. Boa sorte!

    
por 25.06.2015 / 18:26
1
  1. Crie um arquivo de regras do udev

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. Adicione uma regra que instrua os udisks a montá-lo automaticamente

    SUBSYSTEM=="block", SUBSYSTEMS=="mmc", DRIVERS=="mmcblk", ATTRS{type}=="SD", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"
    

    ATTRS{type}=="SD" pode não ser necessário se você estiver usando tipos diferentes.

  3. Recarregue as regras

    sudo udevadm control -R
    
  4. Ejete-o e coloque de volta.

Referência: Wiki do Archlinux: alguns dispositivos, que devem ser tratados como removível, não são

    
por 09.09.2015 / 15:03