Como esperar por volumes LVM detectados?

2

Eu tenho o seguinte problema: Eu tenho uma máquina em execução e que contém um LV criptografado em um LVM. Dentro do (encriptado) LV é outro PV localizado. Então, eu tenho de fato dois VGs: um que contém os dados não criptografados e um que contém apenas dados criptografados.

Agora estou tentando fazer as coisas funcionarem sem problemas. Eu tenho scripts para procurar o PV no volume criptografado e montar as coisas. Infelizmente isso não funciona bem devido a problemas de temporização.

Tanto quanto eu posso dizer, quando eu invoco pvscan , vgscan ou lvscan os discos são procurados por uma assinatura LVM e se tal for encontrado o novo VG é ativado. Isso funciona até agora. Então udev é notificado e cria links diferentes em /dev . Infelizmente isso acontece de forma assíncrona. Assim, meu script continuou em execução e não encontrou os links necessários para verificar / montar os sistemas de arquivos.

Então, minhas perguntas:

  • Existe a possibilidade de esperar udev até que todos os links sejam gerados e estejam prontos para serem usados?
  • Existe a possibilidade de registrar uma regra em udev que chamará um script com todos os links como parameters / environ variables /...?
  • Existe a possibilidade de registrar uma regra que corresponda a um link gerado via udev em vez do próprio dispositivo de bloco?
  • Existe uma maneira de esperar até vgscan & Co. terminaram e udev foi liquidado?

Se você tiver outra ideia, eu gostaria de ouvir.

    
por Christian Wolf 10.03.2016 / 21:44

1 resposta

1

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.
    
por 05.12.2016 / 01:29

Tags