Domanda

Abbiamo una build Linux incorporata che inizia con un HDD in modalità sleep (hardware).Il software quindi si avvia e abilita l'alimentazione all'unità.Linux rileva l'unità correttamente:

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

Sfortunatamente il software tenta di accedere all'unità prima che avvenga il rilevamento SCSI di cui sopra.Potremmo aggiungere una sospensione, ma questo non è un meccanismo affidabile poiché abbiamo notato che il tempo necessario per il rilevamento non è deterministico.

Esiste un modo per ottenere il kernel / hotplug / ecc.sistema per segnalare quando viene rilevato l'HDD?

Grazie.

È stato utile?

Soluzione

Penso che la risposta sia da qualche parte nel udev gestione dispositivi ( pagina di wikipedia ).È completamente utilizzabile in un ambiente incorporato.

Ti consente di scrivere regole che sono in grado di avviare script / programmi quando vengono rilevati alcuni dispositivi.

Qualcosa di simile potrebbe fare le cose:

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

Se hai un vecchio kernel, potresti avere il sistema hotplug attivato.

L'ultima possibilità sarà lo strumento inotify che ti consente di monitorare qualsiasi cosa nel tuo filesistema (anche la directory / dev :)).

Altri suggerimenti

Hai una serie di opzioni per farlo, dalla più semplice alla più complicata:

  • Polling manuale . Basta scrivere uno script di shell che interroghi fino a quando il disco rigido non diventa disponibile prima di utilizzarlo effettivamente. Certo, questa non è la soluzione migliore, ma funziona ed è semplice.
  • mdev . Se il tuo sistema Linux integrato è basato su Busybox (cosa che spero sia!), Busybox integra il programma mdev. Il suo utilizzo è molto semplice ed è documentato su http://git.buildroot.net/ busybox / tree / docs / mdev.txt . mdev ti consentirà molto facilmente di eseguire uno script di shell quando viene rilevato un dispositivo. Se hai già Busybox nel tuo sistema Linux embedded, questa è sicuramente la soluzione che consiglierei.
  • udev , come proposto da altri. Questa è la soluzione utilizzata nei sistemi desktop / server in piena regola. Ha più dipendenze di mdev ed è un po 'più difficile da configurare. Se hai solo il tuo problema di rilevamento del disco rigido da risolvere, direi che usare udev è un po 'eccessivo, ma se intendi usarlo per altri scopi, perché no.
  • udev + udisks + dbus , questo è effettivamente ciò che viene utilizzato sui sistemi in piena regola. udisks è un demone che utilizza udev per essere avvisato della comparsa di nuovi dispositivi di archiviazione nel sistema, riceve alcune informazioni aggiuntive su di essi e invia un messaggio tramite D-Bus. Consente ai servizi D-Bus di manipolare i dispositivi di archiviazione.

Spero che questo ti dia una panoramica delle possibili soluzioni.

Puoi ascoltare il socket netlink uevent - otterrai gli stessi eventi di udevd

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top