Pergunta

Temos uma construção de Linux embarcada que começa com um HDD em modo de espera (hardware).O software então inicia e ativa a alimentação do inversor.O Linux detecta a unidade corretamente:

ata1: exception Emask 0x10 SAct 0x0 SErr 0x4050000 action 0x42 frozen
ata1: soft resetting port
ata1: SATA link up 1.5 Gbps (SStatus 113 SControl F0000)
ata1.00: ATA-8, max UDMA/133, 976773168 sectors: LBA48 NCQ (depth 0/32)
ata1.00: ata1: dev 0 multi count 0
ata1.00: configured for UDMA/133
ata1: EH complete
  Vendor: ATA       Model: Hitachi HCS5C105  Rev: JC2O
  Type:   Direct-Access                      ANSI SCSI revision: 05
SCSI device sda: 976773168 512-byte hdwr sectors (500108 MB)
sda: Write Protect is off
SCSI device sda: drive cache: write back
SCSI device sda: 976773168 512-byte hdwr sectors (500108 MB)
sda: Write Protect is off
SCSI device sda: drive cache: write back
 sda: sda1 sda2
sd 0:0:0:0: Attached scsi disk sda
sd 0:0:0:0: Attached scsi generic sg0 type 0

Infelizmente, o software tenta acessar a unidade antes que ocorra a detecção SCSI acima.Poderíamos adicionar um sleep, mas este não é um mecanismo confiável, pois notamos que o tempo necessário para detectar é não determinístico.

Existe alguma maneira de obter o kernel / hotplug / etc.sistema para relatar quando o HDD é detectado?

Obrigado.

Foi útil?

Solução

Acho que a resposta está em algum lugar no udev gerenciador de dispositivos ( página da wikipedia ).É totalmente utilizável em um ambiente integrado.

Ele permite que você escreva regras que são capazes de iniciar scripts / programas quando alguns dispositivos são detectados.

Algo como isso pode fazer o seguinte:

KERNEL=="sda", RUN+="/usr/bin/my_program"

Se você tiver um kernel antigo, pode ter o sistema hotplug ativado.

A última chance seria a ferramenta inotify que permite monitorar qualquer coisa em seu arquivosistema (mesmo diretório / dev :)).

Outras dicas

Você tem um conjunto de opções para fazer isso, da mais simples à mais complicada:

  • Sondagem manual . Simplesmente escreva um script de shell que monitore até que o disco rígido esteja disponível antes de realmente usá-lo. É verdade que esta não é a solução mais agradável, mas funciona e é simples.
  • mdev . Se o seu sistema Linux embarcado for baseado no Busybox (o que espero que seja!), Então o Busybox integra o programa mdev. Seu uso é muito simples e está documentado em http://git.buildroot.net/ busybox / tree / docs / mdev.txt . mdev permitirá muito facilmente executar um script de shell quando um dispositivo for detectado. Se você já tem o Busybox em seu sistema Linux embarcado, esta é definitivamente a solução que eu recomendaria.
  • udev , conforme proposto por outros. Esta é a solução usada em sistemas desktop / servidor totalmente desenvolvidos. Ele tem mais dependências do que mdev e é um pouco mais difícil de configurar. Se você só tem o problema de detecção de disco rígido para resolver, eu diria que usar udev é um pouco exagero, mas se você pretende usá-lo para outros fins, por que não.
  • udev + udisks + dbus , isso é realmente o que é usado em sistemas completos. udisks é um daemon que utiliza udev para ser notificado de novos dispositivos de armazenamento que apareçam no sistema, obtém algumas informações adicionais sobre eles e depois envia uma mensagem pelo D-Bus. Permite fornecer serviços D-Bus para manipular os dispositivos de armazenamento.

Espero que isso lhe dê uma visão geral das soluções possíveis.

Você pode ouvir o soquete uevent netlink - você obterá os mesmos eventos que udevd

consulte http://lwn.net/Articles/242046/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top