4

我正在尝试调试正确的设备驱动程序未检测到我的硬件上的 SSD 的情况。应该拥有 SSD 的设备驱动程序是软件 RAID 驱动程序 (megasr),它将自动将 2 个 SSD 配置为镜像模式。我很确定 megasr 驱动程序没有检测/拥有 SSD,但我不确定哪个驱动程序实际检测到它们。

在 Linux 中有没有一种方法可以确定哪个设备驱动程序拥有 /dev 目录中的特定磁盘。

因此,例如,我想确定哪个驱动程序拥有设备 /dev/sda。

操作系统是 RHEL 6.x。

非常感谢。

4

2 回答 2

7

可以看到内核日志

dmesg | grep sda
<...>
[    0.618438] sd 2:0:0:0: [sda] Attached SCSI disk
<...>

该日志正在谈论一个 scsi 磁盘,而sd 2:0:0:0是生成该消息的设备。您可以检查 sysfs 以获取更多详细信息:

cd /sys/block/
cd /sys/block/sda/

在这里,您可以找到有关所有块设备的信息。如果您查看特定设备的目录,您应该会看到其信息。

这里是关于 scsi 总线的信息。有两个目录:驱动程序设备

cd /sys/bus/scsi
cd /sys/bus/scsi/devices
cd /sys/bus/scsi/drivers

这里有 scsi 总线上的驱动程序列表。

ls /sys/bus/scsi/drivers
 sd  sr

日志说sd 2:0:0:0

cd /sys/bus/scsi/drivers/sd/2:0:0:0

这是我的设备,所以sd是我的驱动程序。

磁盘是块设备,你应该看到目录

cd /sys/bus/scsi/drivers/sd/2:0:0:0/block/sda

可能有一个程序可以自动执行此操作:)

如果错误的驱动程序正在处理您的设备,您可以解除该设备与该驱动程序的绑定,并且可以将其绑定到另一个设备。

ls /sys/bus/scsi/drivers/sd
 2:0:0:0  bind  uevent  unbind

您可以在 unbind 文件中写入设备标识符,以将该设备与驱动程序分离。

echo -n "2:0:0:0" > unbind

然后您可以将您的设备连接到另一个驱动程序

cd /sys/bus/scsi/drivers/<a-driver>
echo -n "2:0:0:0" > bind

显然 (1),您不能将 scsi 设备绑定到非 scsi 驱动程序。显然(2),这不是您特定问题的答案,而是一种检索解决问题所需信息的方法

于 2013-07-27T08:14:30.943 回答
1
  • SCSI_IOCTL_GET_BUS_NUMBER(0x5386)使用IOCTL获取 SCSI 主机 ID 。
  • /sys/class/scsi_host/host<scsi host id>/proc_name文件包含设备驱动程序。

脚本:

#!/usr/bin/python
# Copyright 2016 Gris Ge <cnfourt@gmail.com>
# Licensed to the public domain.

from array import array
from fcntl import ioctl
import sys
import os

SCSI_IOCTL_GET_BUS_NUMBER = 0x5386
SYSFS_SCSI_HOST_DRV_FORMAT = "/sys/class/scsi_host/host{HOST_ID}/proc_name"

def get_scsi_host_id(path):
    fd = open(path, "wb")
    buff = array('i', [0])
    ioctl(fd, SCSI_IOCTL_GET_BUS_NUMBER, buff, 1)
    fd.close()
    return int(buff[0])

def main():
    scsi_host_id = get_scsi_host_id(sys.argv[1])
    os.system("cat %s" %
              SYSFS_SCSI_HOST_DRV_FORMAT.format(**{"HOST_ID":scsi_host_id}))

main()

例子:

[fge@Gris-Laptop source]$ sudo python find_driver_of_sdx.py /dev/sda
ahci
于 2017-02-22T03:12:02.170 回答