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"