lspci -k 能直接显示磁盘控制器的pci设备及其绑定的内核驱动(如ahci、nvme、megaraid_sas),通过 sudo lspci -k | grep -a 3 -b 1 "controller\|storage\|raid" 筛选并查看“kernel driver in use”字段即可精准定位,无需依赖lsmod或/sys路径。

直接看 lspci -k,它能明确告诉你某块磁盘挂在哪条总线下、用的哪个内核驱动模块,比查 /sys 或 lsmod 更快定位到具体控制器和驱动的对应关系。
怎么用 lspci -k 找出磁盘控制器及其驱动
磁盘控制器(如 AHCI、NVMe、LSI MegaRAID、Broadcom/Avago RAID 卡)在 PCI 总线上有唯一设备 ID,lspci -k 会把设备和它绑定的内核驱动一起列出来。关键不是找“硬盘”,而是找“控制器”——硬盘只是挂在控制器下的子设备。
- 运行
sudo lspci -k | grep -A 3 -B 1 "controller\|mass\|storage\|raid",快速筛出存储类控制器(注意大小写不敏感) - 重点看每段输出里的
Kernel driver in use:行,比如Kernel driver in use: ahci或Kernel driver in use: nvme或Kernel driver in use: megaraid_sas - 若看到
Kernel modules:行(如Kernel modules: ahci, ata_piix),说明该设备可由多个模块驱动,当前生效的是in use那个 - 对 NVMe 盘,控制器就是
/dev/nvme0n1对应的 PCIe 设备,lspci输出里带NVMe字样的那一行才是控制器本体,不是硬盘本身
lshw -class disk 和 lshw -class storage 的区别在哪
lshw -class disk 只显示物理磁盘(/dev/sda、/dev/nvme0n1)及其 SMART/型号/总线路径,但**不显示控制器驱动名**;而 lshw -class storage 才真正列出 Host controller(主机控制器)节点,并附带 configuration: driver=xxx 字段——这才是你要的驱动信息。
- 执行
sudo lshw -class storage -short,看 “storage” 类型设备的driver值,例如:driver=ahci、driver=nvme、driver=mpt3sas - 如果输出为空,说明系统没识别出独立存储控制器(比如直连 SATA 主板芯片组),此时控制器驱动已固化进主板南桥,通常就是
ahci或ata_piix -
lshw -class disk的bus info字段(如scsi@0:0.0.0或pci@0000:04:00.0)可反向查lspci -vv -s 0000:04:00.0确认驱动细节
为什么 lsmod | grep xxx 不够用
lsmod 只告诉你模块是否加载,但无法告诉你“哪个设备正在用它”。比如 ahci 模块可能同时支撑多块 SATA 盘,但你不知道它管的是哪块控制器;megaraid_sas 加载了,也不代表你的某块 /dev/sdb 就一定走这个驱动——它可能被封装在 RAID 卡的逻辑盘里,真实驱动其实是 megaraid_sas,但 /dev/sdb 在用户层看不到这个映射。
- 单独运行
lsmod无法建立“设备 → 控制器 → 驱动”的链路,必须结合lspci -k或lshw -class storage - 某些 RAID 卡(如 Dell PERC、HP Smart Array)使用闭源驱动或 firmware passthrough,
lspci -k可能只显示Kernel driver in use: hpsa或Kernel driver in use: megaraid_sas,但不会暴露底层硬件型号,这时需配合storcli或厂商工具确认 - 如果
lspci -k显示Kernel driver in use: unknown或空白,大概率是固件未启用、PCIe link down、或驱动未正确 probe(常见于热插拔后未 rescan)
遇到 RAID 卡或 JBOD 背板时的特殊处理
当磁盘通过 RAID 卡或 SAS 扩展器接入时,/dev/sdX 对应的控制器不再是主板上的 AHCI,而是卡上的专用芯片。这时候单看设备名会误判驱动,必须追溯到 PCI 设备层级。
- 先用
lsblk -o NAME,TRAN,MODEL,HCTL查HCTL(Host:Channel:Target:Lun),例如2:0:1:0,其中2是 host number - 再查
ls /sys/class/scsi_host/host2/device/driver,读软链接目标就能知道驱动名(如指向../../../../../bus/pci/drivers/megaraid_sas) - 对 NVMe over Fabrics 或 RDMA 场景,
lspci -k可能只显示 RoCE 或 iWARP 网卡驱动(如mlx5_core),真正的 NVMe 驱动在用户态(nvme-cli+ kernelnvme-fabrics模块),此时需额外检查lsmod | grep nvme和nvmf list
最易被忽略的一点:控制器驱动和磁盘设备驱动是两层概念。AHCI 是控制器驱动,sd 是 SCSI 设备驱动;NVMe 是控制器+设备一体化驱动,nvme 模块同时处理协议栈和队列管理。别指望从 /dev/sdb 的名字倒推出驱动,得从 PCI 设备树往上查。











