我们有一个嵌入式Linux构建,它以处于睡眠模式(硬件)的HDD开始。然后,软件启动并为驱动器供电。 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检测发生之前,软件会尝试访问驱动器。我们可以添加睡眠,但这不是一个可靠的机制,因为我们已经注意到检测所花费的时间是不确定的。
有没有办法获得内核/ hotplug /等。系统报告何时检测到硬盘驱动器?
感谢。
答案 0 :(得分:3)
我认为答案在udev设备管理器(wikipedia page)中。它完全可用于嵌入式环境。
它允许您write rules能够在检测到某些设备时启动脚本/程序。
像这样的东西可以做的事情:
KERNEL=="sda", RUN+="/usr/bin/my_program"
如果您有旧内核,则可能已激活hotplug系统。
最后一次机会是inotify工具,可以监控文件系统中的任何内容(甚至是/ dev目录:)。
答案 1 :(得分:2)
你有一套选项可以做到这一点,从最简单到最复杂:
mdev
程序。它的用法非常简单,并在http://git.buildroot.net/busybox/tree/docs/mdev.txt记录。 mdev
将非常容易地允许您在检测到设备时运行shell脚本。如果您已经在嵌入式Linux系统中安装了Busybox,这绝对是我推荐的解决方案。mdev
更多的依赖关系,并且设置起来有点困难。如果您只解决硬盘检测问题,我会说使用udev
有点矫枉过正,但如果您打算将其用于其他目的,为什么不这样做。udisks
是一个守护程序,使用udev
通知系统中出现的新存储设备,它获取有关它们的一些其他信息,然后通过D-Bus发送消息。它允许提供D-Bus服务来操纵存储设备。我希望这能为您提供可能解决方案的概述。
答案 2 :(得分:0)
您可以收听uevent netlink套接字 - 您将获得与udevd相同的活动