【问题标题】:Determine linux driver that owns a disk确定拥有磁盘的 linux 驱动程序
【发布时间】:2013-07-26 13:48:27
【问题描述】:

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

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

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

操作系统是 RHEL 6.x。

非常感谢。

【问题讨论】:

    标签: linux linux-device-driver disk solid-state-drive scsi


    【解决方案1】:

    可以看到内核日志

    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 总线的信息。有两个目录:driversdevices

    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 是我的驱动程序。

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

    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
    

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

    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),这不是您特定问题的答案,而是一种检索解决问题所需信息的方法

    【讨论】:

    • 谢谢,我会尽快试试看是否能解决我的问题。
    【解决方案2】:
    • 使用SCSI_IOCTL_GET_BUS_NUMBER(0x5386) IOCTL 获取 SCSI 主机 ID。
    • /sys/class/scsi_host/host&lt;scsi host id&gt;/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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      相关资源
      最近更新 更多