Sua configuração é um pouco incomum (LVM dentro do LVM).
Em geral, você deve confiar no udev o máximo possível e não confiar muito em seus próprios scripts, isto é, disparar uma ação e deixar o udev / systemd manipular o restante de uma maneira acionada por evento (em vez de executar sequencialmente comandos em alguns roteiro)! Também cuide para digitalizar apenas o seu dispositivo e não "tudo".
Você também pode ler 69-lvm-metad.rules
e usar udevadm monitor
para ver o que está acontecendo.
Ainda responderei algumas das suas perguntas também.
Executando um script para um nó de dispositivo
Para executar um script, você pode usar RUN
em uma regra do udev. Observe que RUN
é assíncrono e é executado após a regra ter sido processada (em contraste com PROGRAM
)
ACTION=="add", KERNEL=="sdb", RUN+="/usr/local/bin/some_script"
O udev chama seu script com variáveis de ambiente de acordo com as variáveis em seu evento udev, ou seja, KERNEL
, ACTION
etc.
Você também pode combinar por um link simbólico, é claro, mas para fazer o seu trabalho eu compararia com o dispositivo atual e provavelmente o especificaria mais em vez de confiar no nome de um symlink. Você pode usar udevadm monitor --property
para ver os diferentes eventos, incluindo suas propriedades (ids exclusivos, etc.). Além disso, observe que os links são anexados, portanto, pode ser difícil corresponder (não foi verificado por mim).
SYMLINK
Match the name of a symlink targeting the node. It can be used once a SYMLINK key has been set in one of the preceding
rules. There may be multiple symlinks; only one needs to match.
Aguardando que os eventos do udev sejam tratados
udevadm settle
irá bloquear até que todos os eventos do udev sejam manipulados. Ele também tem parâmetros para um tempo limite ou para esperar que um arquivo específico apareça, mas para o seu caso de uso executá-lo sem parâmetros deve ser suficiente.
Citando o udevadm-manpage :
udevadm settle [options]
Watches the udev event queue, and exits if all current events are handled.