Como ser informado quando um HDD é detectado no Linux
-
27-10-2019 - |
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.
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 usarudev
é 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 utilizaudev
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/