硬件识别与信息采集:用命令摸清家底

做驱动适配,第一步是什么?不是写代码,是搞清楚你面前这台机器里到底装了些什么玩意儿。

我见过太多人,上来就编译驱动,结果插上去不工作。折腾半天才发现——嗯,硬件型号压根不对。所以,先花十分钟把家底摸清楚,后面能省你一天的时间。

lspci:PCI设备识别,最常用的武器

lspci 是我个人最常用的命令。它列出所有 PCI 总线上的设备,包括显卡、网卡、存储控制器等等。

# 列出所有PCI设备
lspci

# 显示详细信息(包括厂商ID、设备ID)
lspci -v

# 只看网络设备
lspci | grep -i network

# 显示内核驱动信息
lspci -k

输出示例:

00:1f.2 SATA controller: Intel Corporation 8 Series/C220 Series SATA Controller [AHCI mode] (rev 04)
	Subsystem: Dell Device 05a5
	Kernel driver in use: ahci
	Kernel modules: ahci

看到 Kernel driver in use: ahci 了吗?这说明系统已经自动加载了 AHCI 驱动。如果这里显示 Unknown,那就要小心了——驱动可能没装上。

关键信息点:

  • 厂商ID(如 8086 代表 Intel)
  • 设备ID(如 8C02 代表具体型号)
  • 子系统信息(如 Dell 05a5)
  • 当前使用的驱动

我的小技巧: 用 lspci -nn 可以同时显示厂商ID和设备ID的数值。写驱动适配表时,这两个数字是硬通货。

lsusb:USB设备识别,外设全靠它

USB 设备比 PCI 设备更复杂。同一个接口,今天插鼠标,明天插 U 盘,后天插摄像头。所以 lsusb 必须掌握。

# 列出所有USB设备
lsusb

# 显示详细信息
lsusb -v

# 查看USB设备树(看哪个设备接在哪个Hub上)
lsusb -t

输出示例:

Bus 002 Device 003: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 001 Device 004: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub

这里 0bda:0129 就是厂商ID和设备ID。Realtek 的读卡器,Intel 的 Hub——一眼就能看出来。

我曾经踩过的坑: 有一次客户说 USB 摄像头不工作。我 lsusb 一看,设备确实列出来了。但 lsusb -t 显示它挂在一个低速 Hub 上。嗯,带宽不够,摄像头当然跑不起来。换了个 USB 3.0 口,问题解决。

lshw:硬件清单,一网打尽

lshw 是硬件信息的瑞士军刀。它把 CPU、内存、磁盘、网络、USB、PCI 全部汇总到一起。我个人习惯先用它生成一份完整报告。

# 查看所有硬件信息
lshw

# 以HTML格式输出(方便存档)
lshw -html > hardware_report.html

# 只看网络设备
lshw -class network

# 只看存储设备
lshw -class storage

输出片段:

*-network
   description: Ethernet interface
   product: RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
   vendor: Realtek Semiconductor Co., Ltd.
   physical id: 0
   bus info: pci@0000:03:00.0
   logical name: enp3s0
   version: 15
   serial: 00:e0:4c:68:00:01
   size: 1Gbit/s
   capacity: 1Gbit/s
   width: 64 bits
   clock: 33MHz
   capabilities: pm msi pciexpress msix bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
   configuration: autonegotiation=on broadcast=yes driver=r8169 driverversion=6.1.0-17-amd64 duplex=full firmware=rtl8168h-2_0.0.2, 02/27/15 latency=0 link=yes multicast=yes port=twisted pair speed=1Gbit/s
   resources: irq:18 ioport:e000(size=256) memory:f7c00000-f7c00fff memory:f0000000-f0003fff

看到 driver=r8169 了吗?这就是当前网卡用的驱动。如果驱动版本太老,或者压根没加载,这里会显示 driver=UNCLAIMED。

兼容性分析三要素:

  1. 硬件ID匹配:厂商ID + 设备ID 必须与驱动支持的列表一致
  2. 驱动状态:driver=xxx 表示已加载,UNCLAIMED 表示未识别
  3. 资源冲突:IRQ、I/O端口、内存地址不能重叠

实战:采集信息并分析兼容性

假设你要给一台服务器装网卡驱动。我的做法是这样的:

# 第一步:找到网卡
lspci | grep -i ethernet

# 输出:03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)

# 第二步:获取详细ID
lspci -nn -s 03:00.0

# 输出:03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)

# 第三步:检查当前驱动
lspci -k -s 03:00.0

# 输出:Kernel driver in use: r8169

好,现在我知道了:设备ID是 10ec:8168,当前驱动是 r8169。如果我想用官方驱动 r8168,那就得先确认内核是否支持,或者手动编译。

避坑指南: 我曾经遇到过 r8169 驱动在某个内核版本下会随机断网。查了半天,发现是驱动对某些新硬件的兼容性有问题。解决办法?要么升级内核,要么换用 r8168 驱动。所以,别只看驱动名字,还要看版本和硬件ID的对应关系。

知识体系:硬件识别与信息采集

下面这张图,是我自己总结的硬件识别流程。你照着走一遍,基本不会漏东西。

硬件识别与信息采集流程 启动系统 lspci(PCI设备) lsusb(USB设备) lshw(全量清单) 提取关键信息:厂商ID、设备ID、驱动状态、资源分配 兼容性分析:ID匹配?驱动加载?资源冲突? 结论:驱动适配方案

说白了,整个流程就是:先看有什么硬件,再查它们的身份信息,最后判断驱动能不能用。每一步都有对应的命令和技巧。

总结一下

硬件识别这件事,说难不难,说简单也不简单。关键是养成习惯——拿到一台新机器,先跑一遍 lspci、lsusb、lshw,把结果存下来。后面做驱动适配时,这些信息就是你的地图。

我个人习惯把这三条命令的输出重定向到文件里,命名成 hardware_YYYYMMDD.txt。这样哪天出了问题,翻出来对比一下,就知道是不是硬件变了。

嗯,今天就聊到这儿。记住:摸清家底,再动手干活。

可可精品资料库