Os disparadores do Udev não estão disparando na inserção do cartão CF no leitor de cartão USB (mais)

4

Eu tenho uma regra de udev que aciona um script de shell que copia fotos do meu cartão CF quando insiro o cartão no meu leitor de cartão USB. Isso funcionou bem por um tempo. Mas depois de uma atualização recente, parou de funcionar.

O problema (AFAICT) é que inserir o cartão CF no leitor USB não está mais acionando nenhum evento udev , então meu script nunca é executado. (Mesmo as entradas em /dev/disk/by-label/ não aparecem na inserção, e dmesg não mostra nada sobre a inserção.)

Eu posso fazer com que os eventos udev sejam acionados se eu executar fdisk -l /dev/sdf (ou sdh ou qualquer dispositivo que pareça ser onde o cartão CF aparecerá). Eu verifiquei os eventos udev com udevadm monitor e executando udevd --debug . Depois de disparar manualmente o sistema, o script funciona bem a partir deste ponto.

Estou rodando o Debian 6.0 (Squeeze), e estou bastante confiante de que foi a atualização de Lenny alguns meses atrás que mudou o comportamento, mas não tenho certeza se foi uma mudança sutil em udev (talvez eu esteja ouvindo os eventos errados?) ou alguma mudança no kernel ou pilha USB? De qualquer forma, alguém tem sugestões de como consertar isso? Ou sugestões para obter mais informações de depuração fora do módulo de armazenamento usb?

Esta é a regra do udev que estou usando:

KERNEL=="sd??", SUBSYSTEM=="block", RUN+="/usr/local/bin/hot-add"

Atualização # 1: disparador em alterações no blockdev e na partição

Eu adicionei uma regra para acionar somente o dispositivo de bloco em vez de uma partição (caso isso possa aparecer), mas não é acionado quando eu insiro o cartão CF:

KERNEL=="sd?", SUBSYSTEM=="block", RUN+="/usr/local/bin/hot-add-disk"

Curiosamente, se eu executar fdisk -l /dev/sdf para acionar o reconhecimento do cartão CF, recebo um evento "alterado" para /dev/sdf (mesmo que eu nunca tenha recebido um evento "add").

Atualização 2: add uevent dispara

Existe um bug do Debian aberto, incompleto, que cobre um terreno semelhante (pular para Update # 25 para os bits relevantes). Isso tem algumas dicas úteis.

Para minha configuração, se eu fizer (como root) echo add > /sys/block/sdf/uevent com o cartão CF inserido, mas sem ser reconhecido, isso acionará todos os eventos udev corretamente e todos os meus scripts serão executados corretamente.

A execução de udevadm info --query=all --name=sdf antes e depois de inserir o cartão CF não mostra nenhuma diferença. Se eu injetar o evento 'add' e executar novamente o comando udevadm , recebo um pouco mais de saída (há algumas informações sobre as partições de disco).

Atualização # 3: chave USB vs. cartão CF no leitor USB

A inserção de uma chave USB vanilla aciona todos os eventos udev imediatamente e funciona bem. Inserir um cartão CF no leitor de cartão USB não. Para o leitor de cartão, parece que o dispositivo USB "existe" mesmo quando não há cartão CF inserido (portanto existe uma entrada /sys/block/sdf ), mas com a chave USB, o /sys/block/sdj existe somente enquanto a chave USB está conectada .

Atualização # 4: Talvez corrigido em 2.6.38

Este bug do Ubuntu tem uma atualização (a última) que reivindica o bug não estava mais presente em um kernel 2.6.38.

Atualização # 5: não corrigido (em 3.2.0)

Eu atualizei o kernel algumas vezes, e até mudei a placa-mãe que estou usando, e ainda vejo o mesmo problema. Eu estou atualmente em um kernel 3.2.0.0. E udev versão 164.

    
por P.T. 06.05.2012 / 06:53

1 resposta

3

tl; dr: Veja a solução na Atualização 2 abaixo.

Esta não é realmente uma resposta triste, ou pelo menos não é uma boa notícia: estou tendo a impressão de que isso nunca funcionará de qualquer forma - eu acho um pouco difícil de acreditar já que eu acho que isso funcionou no passado. !

Isto é o que normalmente funciona e porquê: A maioria dos leitores de cartões SD para portáteis. Você verá que você conecta um cartão SD, udev o vê, o Linux irá escaneá-lo para partições e a automontagem simplesmente funcionará. Por que isso funciona? Veja lsusb antes e depois de inserir o cartão. Você notará que sem cartão SD conectado, o dispositivo USB não existe. Então, quando você insere um cartão SD, há um evento hotplug USB completo.

O leitor de cartão no meu monitor parece não funcionar assim, está sempre lá. E não consigo gerar nenhum evento quando insiro um cartão SD. Eu comecei a olhar para os syslogs, depois para udevadm monitor e, em seguida, usbmon para o registro bruto de eventos USB. Sem sorte, parece não haver nenhuma notificação / evento de inserção / ejeção, seja do leitor de cartão no meu monitor ou do DealExtreme barato no meu PC.

No momento em que tento acessar o dispositivo bruto, o kernel é ativado e a partição é exibida. Da mesma forma, chame udevadm trigger e observe o dispositivo. Pegue o cartão e nada acontece até que eu tente acessar o dispositivo novamente e o kernel perceba que ele foi embora.

O que eu me pergunto agora é, como isso poderia ter funcionado (isto é, se eu não estou inventando essa memória)? Talvez algum daemon estivesse pesquisando o dispositivo bruto a cada poucos segundos e parasse de fazer isso? É difícil encontrar qualquer documentação sobre isso, na verdade.

Atualização 1

Acima está tudo com um kernel de ações do Debian. Acabei de fazer algumas experiências com um kernel do Ubuntu, onde o hotplugging do cartão SD parece funcionar. E não surpreendentemente, em usbmon , vejo pesquisas a cada dois segundos. O que também explica por que os cartões não são detectados imediatamente, mas com um pequeno atraso.

A pesquisa parece ser feita pelo kernel, uma vez que isso acontece mesmo no modo de usuário único, sem nenhum processo de usuário, fazendo nada além de ficar preso em um loop select() . Eu não consegui descobrir onde isso é feito no kernel, atualizarei este post se descobrir.

Atualização nº 2

A diferença importante parece ser /sys/block/sd?/events_poll_msecs . Na minha caixa Debian é -1, na caixa Ubuntu é 2000. Esta regra udev parece ser:

# enable in-kernel media-presence polling
ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_poll_msecs}=="0", ATTR{parameters/events_dfl_poll_msecs}="2000"
ACTION=="add", ATTR{removable}=="1", ATTR{events_poll_msecs}=="-1", ATTR{events_poll_msecs}="2000"
    
por 24.11.2013 / 01:29