Как получить информацию об обнаружении жесткого диска в Linux

У нас есть встроенная сборка Linux, которая запускается с жестким диском в спящем режиме (аппаратно). Затем запускается программное обеспечение и включает питание привода. Linux отлично определяет диск:

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

К сожалению, программное обеспечение пытается получить доступ к диску до того, как произойдет описанное выше обнаружение SCSI. Мы могли бы добавить сон, но это ненадежный механизм, поскольку мы заметили, что время, необходимое для обнаружения, недетерминировано.

Есть ли способ получить ядро/горячее подключение/и т.д. системе сообщать об обнаружении жесткого диска?

Спасибо.


person user626201    schedule 07.09.2011    source источник
comment
невозможно ли запустить hd при запуске, а затем использовать hdparm, чтобы указать ему вращение в сценариях запуска?   -  person Kevin Burton    schedule 07.09.2011
comment
К сожалению нет. Аппаратное обеспечение подключено как таковое и требует изменения уровня на выходном контакте. Пин-код может быть доступен во время инициализации ядра, поэтому мне нужно это проверить...   -  person user626201    schedule 07.09.2011


Ответы (3)


Я думаю, что ответ находится где-то в диспетчере устройств udev. (страница википедии). Его можно полностью использовать во встроенной среде.

Это позволяет вам писать правила, которые могут запускать сценарии/программы при обнаружении некоторых устройств.

Что-то вроде этого может сделать это:

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

Если у вас старое ядро, у вас может быть активирована система горячего подключения.

Последним шансом будет инструмент inotify, который позволит вам контролировать все в вашей файловой системе (даже /dev директория :)).

person Cédric Julien    schedule 07.09.2011
comment
К сожалению, в нашей системе не работает udev, иначе было бы неплохо. Кажется, он поддерживает горячее подключение ядра, хотя я нигде не видел, чтобы mdev -s запускался. - person user626201; 07.09.2011
comment
@ user626201: старое ядро? может быть, ваше ядро ​​​​использует демон горячего подключения? - person Cédric Julien; 07.09.2011
comment
@ user626201: хорошо, я отредактировал свой ответ, добавив ссылки на систему горячего подключения и inotify. - person Cédric Julien; 07.09.2011
comment
Я безуспешно пробовал inotify в каталоге sysfs /sys/block. Я попробую /dev. Спасибо - person user626201; 07.09.2011

Для этого у вас есть набор вариантов, от самых простых до самых сложных:

  • Опрос вручную. Просто напишите сценарий оболочки, который опрашивает до тех пор, пока жесткий диск не станет доступным, прежде чем его использовать. Конечно, это не самое красивое решение, но оно работает и просто.
  • mdev. Если ваша встроенная система Linux основана на Busybox (на что я надеюсь!), то Busybox интегрирует программу mdev. Его использование очень просто и задокументировано по адресу http://git.buildroot.net/busybox/tree/docs/mdev.txt. mdev очень легко позволит вам запустить сценарий оболочки при обнаружении устройства. Если у вас уже есть Busybox в вашей встроенной системе Linux, это определенно то решение, которое я бы порекомендовал.
  • udev, предложенный другими. Это решение используется в полноценных настольных/серверных системах. У него больше зависимостей, чем у mdev, и его немного сложнее настроить. Если вам нужно решить только проблему обнаружения жесткого диска, я бы сказал, что использование udev немного излишне, но если вы собираетесь использовать его для других целей, почему бы и нет.
  • udev + udisks + dbus — это то, что используется в полноценных системах. udisks — это демон, который использует udev для уведомления о появлении в системе новых устройств хранения, получает дополнительную информацию о них, а затем отправляет сообщение по D-Bus. Это позволяет предоставлять услуги D-Bus для управления устройствами хранения.

Я надеюсь, что это дает вам обзор возможных решений.

person Thomas Petazzoni    schedule 08.09.2011
comment
Спасибо - мы прибегли к ручному опросу. mdev и udev не поддерживаются :( К сожалению, заказчику требовался именно этот чип, и мы ограничены в поддерживаемых инструментах, так как чип довольно старый. - person user626201; 08.09.2011

Вы можете прослушивать сокет uevent netlink — вы получите те же события, что и udevd

см. http://lwn.net/Articles/242046/

person msh    schedule 22.09.2011