硬件识别与信息采集:用命令摸清家底
做驱动适配,第一步是什么?不是写代码,是搞清楚你面前这台机器里到底装了些什么玩意儿。
我见过太多人,上来就编译驱动,结果插上去不工作。折腾半天才发现——嗯,硬件型号压根不对。所以,先花十分钟把家底摸清楚,后面能省你一天的时间。
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。
兼容性分析三要素:
- 硬件ID匹配:厂商ID + 设备ID 必须与驱动支持的列表一致
- 驱动状态:
driver=xxx表示已加载,UNCLAIMED表示未识别 - 资源冲突: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、lsusb、lshw,把结果存下来。后面做驱动适配时,这些信息就是你的地图。
我个人习惯把这三条命令的输出重定向到文件里,命名成 hardware_YYYYMMDD.txt。这样哪天出了问题,翻出来对比一下,就知道是不是硬件变了。
嗯,今天就聊到这儿。记住:摸清家底,再动手干活。