我正在尝试调试我的硬件上的SSD未被正确的设备驱动程序检测到的情况。应该拥有SSD的设备驱动程序是一个软件RAID驱动程序(megasr),它将在镜像模式下自动配置2个SSD。我很确定megasr驱动程序没有检测/拥有SSD,但我不确定哪个驱动程序实际检测到它们。
在Linux中是否有办法确定哪个设备驱动程序拥有/ dev目录中的特定磁盘。
所以我想确定哪个驱动程序拥有设备/ dev / sda,例如。
操作系统是RHEL 6.x。
非常感谢。
答案 0 :(得分: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总线的信息。有两个目录: drivers 和 devices 。
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),这不是您特定问题的答案,但它是一种检索解决问题所需信息的方法
答案 1 :(得分: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