在Linux中检测到HDD时如何获得通知

在Linux中检测到HDD时如何获得通知,linux,embedded-linux,hard-drive,scsi,Linux,Embedded Linux,Hard Drive,Scsi,我们有一个嵌入式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,

我们有一个嵌入式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检测发生之前访问驱动器。我们可以添加睡眠,但这不是一个可靠的机制,因为我们已经注意到检测所需的时间是不确定的

有没有办法让内核/热插拔/etc.系统在检测到硬盘时报告


谢谢。

我想答案就在设备管理器()的某个地方。它在嵌入式环境中完全可用

它使您能够在检测到某些设备时启动脚本/程序

像这样的东西可以做到:

KERNEL=="sda", RUN+="/usr/bin/my_program"
如果你有一个旧内核,你可以激活系统


最后一个机会是让您监视文件系统中任何内容(甚至/dev目录:)的工具。

我认为答案就在设备管理器()的某个地方。它在嵌入式环境中完全可用

它使您能够在检测到某些设备时启动脚本/程序

像这样的东西可以做到:

KERNEL=="sda", RUN+="/usr/bin/my_program"
如果你有一个旧内核,你可以激活系统


最后一个机会是让您监视文件系统中任何内容的工具(甚至是/dev目录:)。

您有一组选项来实现这一点,从最简单到最复杂:

  • 手动轮询。只需编写一个shell脚本,在实际使用硬盘之前进行轮询,直到硬盘可用为止。诚然,这不是最好的解决方案,但它有效且简单
  • mdev。如果您的嵌入式Linux系统基于Busybox(我希望如此!),那么Busybox将集成
    mdev
    程序。它的用法非常简单,并记录在
    mdev
    将非常容易地允许您在检测到设备时运行shell脚本。如果您的嵌入式Linux系统中已经有Busybox,那么这绝对是我推荐的解决方案
  • udev,由其他人提议。这是在成熟的桌面/服务器系统中使用的解决方案。它比
    mdev
    有更多的依赖关系,并且设置起来有点困难。如果您只需要解决硬盘检测问题,我会说使用
    udev
    有点过分,但是如果您打算将其用于其他目的,为什么不呢
  • udev+udisks+dbus,这实际上是在成熟系统上使用的
    udisks
    是一个守护进程,它使用
    udev
    来通知系统中出现的新存储设备,它获取有关这些设备的一些附加信息,然后通过D总线发送消息。它允许提供D总线服务来操作存储设备

我希望这能让您概括了解可能的解决方案。

您有一套选项可以做到这一点,从最简单到最复杂:

  • 手动轮询。只需编写一个shell脚本,在实际使用硬盘之前进行轮询,直到硬盘可用为止。诚然,这不是最好的解决方案,但它有效且简单
  • mdev。如果您的嵌入式Linux系统基于Busybox(我希望如此!),那么Busybox将集成
    mdev
    程序。它的用法非常简单,并记录在
    mdev
    将非常容易地允许您在检测到设备时运行shell脚本。如果您的嵌入式Linux系统中已经有Busybox,那么这绝对是我推荐的解决方案
  • udev,由其他人提议。这是在成熟的桌面/服务器系统中使用的解决方案。它比
    mdev
    有更多的依赖关系,并且设置起来有点困难。如果您只需要解决硬盘检测问题,我会说使用
    udev
    有点过分,但是如果您打算将其用于其他目的,为什么不呢
  • udev+udisks+dbus,这实际上是在成熟系统上使用的
    udisks
    是一个守护进程,它使用
    udev
    来通知系统中出现的新存储设备,它获取有关这些设备的一些附加信息,然后通过D总线发送消息。它允许提供D总线服务来操作存储设备

我希望这能让您概括了解可能的解决方案。

您可以收听uevent netlink套接字-您将获得与udevd相同的事件


请参见

您可以收听uevent netlink套接字-您将获得与udevd相同的事件


请参见

是否无法在启动时启动hd,然后使用hdparm在启动脚本中告诉它降速?不幸的是,无法。硬件是这样接线的,需要在输出引脚上进行电平更改。pin可能在内核初始化期间可用,因此我需要检查…是否不可能在启动时启动hd,然后使用hdparm在启动脚本中告诉它降速?不幸的是,不可能。硬件是这样接线的,需要在输出引脚上进行电平更改。pin可能在内核初始化期间可用,因此我需要检查一下……不幸的是,我们的系统没有运行udev,否则就太好了。它似乎支持内核热插拔,尽管我还没有看到
mdev-s
startanywhere@user626201:旧内核?也许您的内核正在使用热插拔守护进程?@user626201:weel,我编辑了我的答案,以添加对热插拔系统和inotify的引用。我在sysfs目录
/sys/block
上尝试了inotify,但没有成功。我将尝试
/dev
。感谢幸运的是,我们的系统没有运行udev,否则就太好了。它似乎支持内核热插拔,尽管我没有看到
mdev-s<