![如何列出内核支持的所有硬件](https://linux22.com/image/28804/%E5%A6%82%E4%BD%95%E5%88%97%E5%87%BA%E5%86%85%E6%A0%B8%E6%94%AF%E6%8C%81%E7%9A%84%E6%89%80%E6%9C%89%E7%A1%AC%E4%BB%B6.png)
我想查看正在使用的内核支持的所有硬件。例如,如果我有 3.8.xx 版本的 Linux 内核,我如何知道那里支持哪些硬件。lspci
、lshw
、lscpu
和等工具dmidecode
仅检查当前使用的硬件,并且尝试使用加载的模块来查找它lsmod
也不方便。
我想要的是检查正在使用的内核实际支持的所有硬件,而不考虑我是否正在使用该硬件。
目前我想到了这样的事情:
- 读取
/lib/modules/3.8.0-5-generic/kernel/drivers
并解析每个文件。 - 下载内核的 git 源代码并通过 grep 获取有关此信息的信息。
- 任何其他疯狂且漫长的做法。
还有其他更小的方法可以实现这一目标吗?
答案1
您可以调用modinfo
所有可用的模块。这会打印模块的别名。该模块的一个别名e1000e
是这个(还有很多别名):
pci:v00008086d00001559sv*sd*bc*sc*i*
这意味着应该为具有供应商 ID 的 PCI 设备加载它8086和设备 ID第1559章。 USB 设备的模式看起来类似。
答案2
我想要的是检查正在使用的内核实际支持的所有硬件,而不考虑我是否正在使用该硬件。
如果您有.config
构建内核所用的文件,您可以下载源代码并运行make menuconfig
,这将使您了解 A) 可以为哪些硬件配置内核(但请参阅笔记),以及 B) 您的内核实际配置的硬件。
所以要做到这一点:
- 下载源代码。您的发行版可能有一个软件包,或者您可以从内核.org;找到您的版本
uname -r
。 - 找到
.config
适合您的内核的。如果您通过发行版获得了源代码,那么它有望被包含在内;您也许还可以在 /boot 中的某个位置找到它。更好的是:现在发行版内核通常是使用该/proc/config.gz
功能构建的。如果存在,请将其复制出来,解压缩,重命名该文件.config
并将其复制到内核源代码树的顶层。 make menuconfig
从源树的顶层内部运行。你将需要 ncurses发展软件包已安装 (ncurses-dev
或ncurses-devel
) 并且您需要是 root。
在使用 menuconfig 时,除了更改文件内容之外.config
,您不能做任何坏事,这并不重要(只是以后不要将自己与它混淆)。
笔记: 其实你看不到全部同时可能的硬件配置,因为根据在其他地方选择的内容,一个地方可能会出现不同的选项。内核配置有点迷宫。但是,您肯定会看到实际选择的所有内容(M
意味着它是一个模块,*
意味着它是内置的)。
答案3
我不相信你正在寻找的东西是可能的;例如,假设采用模块化内核,许多模块如果无法实际找到它们支持的硬件,则将无法初始化自身。所以他们会悄悄地流产。
自动解析内核源代码以查找硬件名称/版本/型号将是一项艰巨的任务。尽管有常见的子系统(例如串行、scsi、usb),但代码不一定统一。你很快就会明白这一点。