Pregunta

Tenemos una construcción de Linux incrustada que comienza con un HDD en modo de suspensión (hardware). El software luego inicia y permite la alimentación de la unidad. Linux detecta la unidad bien:

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

Desafortunadamente, el software intenta acceder a la unidad antes de que ocurra la detección de SCSI anterior. Podríamos agregar un sueño, pero este no es un mecanismo confiable, ya que hemos notado que el tiempo necesario para detectar no es determinista.

¿Hay alguna forma de obtener el kernel/hotplug/etc. sistema para informar cuándo se detecta el HDD?

Gracias.

¿Fue útil?

Solución

Creo que la respuesta está en algún lugar del udev administrador de dispositivos (Página de Wikipedia). Es completamente utilizable en un ambiente integrado.

Te permite escribir reglas que pueden iniciar scripts/programas cuando se detectan algunos dispositivos.

Algo como esto podría hacer las cosas:

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

Si tiene un núcleo viejo, es posible que tenga el conexión en caliente sistema activado.

La última oportunidad será la inotificar Herramienta que le permite monitorear cualquier cosa en su sistema de archivos (incluso /Directory :)).

Otros consejos

Tiene un conjunto de opciones para hacer esto, desde lo más simple hasta lo más complicado:

  • Encuesta manual. Simplemente escriba un script de shell que encueste hasta que el disco duro esté disponible antes de usarlo. De acuerdo, esta no es la solución más bonita, pero funciona y es simple.
  • mdev. Si su sistema Linux incrustado está basado en BusyBox (¡lo cual espero que sea!), Entonces BusyBox integra el mdev programa. Su uso es muy simple y está documentado en http://git.buildroot.net/busybox/tree/docs/mdev.txt. mdev Le permitirá muy fácilmente ejecutar un script de shell cuando se detecte un dispositivo. Si ya tiene BusyBox en su sistema Linux integrado, esta es definitivamente la solución que recomendaría.
  • udev, según lo propuesto por otros. Esta es la solución utilizada en los sistemas de escritorio/servidor completos. Tiene más dependencias que mdev y es un poco más difícil de configurar. Si solo tiene su problema de detección de disco duro para resolver, diría que usar udev es un poco exagerado, pero si tiene la intención de usarlo para otros fines, ¿por qué no?
  • udev + udisks + dBUS, esto es en realidad lo que se usa en los sistemas completos. udisks es un demonio que usa udev Para ser notificado de nuevos dispositivos de almacenamiento que aparecen en el sistema, recibe algunas información adicional sobre ellos y luego envía un mensaje sobre D-Bus. Permite que los servicios de D-BUS manipulen los dispositivos de almacenamiento.

Espero que esto le brinde una visión general de las posibles soluciones.

Puede escuchar el socket de Uevent NetLink: obtendrá los mismos eventos que UDEVD

ver http://lwn.net/articles/242046/

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top