如何识别应该按供应商/产品ID声明设备的模块?

假设我知道我在这里没有的硬件的数字产品/供应商ID,我想知道在内核中是否支持我,我可以这样做(USB蓝牙接收器示例):

modinfo btusb filename: /lib/modules/3.7.5-030705-generic/kernel/drivers/bluetooth/btusb.ko [...] alias: usb:v0A5Cp*d*dc*dsc*dp*icFFisc01ip01in* alias: usb:v0489p*d*dc*dsc*dp*icFFisc01ip01in* alias: usb:v413Cp8197d*dc*dsc*dp*ic*isc*ip*in* [...] 

从这里我可以看到btusb要声明哪些设备,它需要我事先知道模块名称。 但是,在某些情况下,我不知道支持这种设备的模块名称。

网络硬件是其中一类似乎很难找到的类别。 此外, lspcilsusb名称有时是不确定的或完全错误的。 我正在浏览整个内核源代码树,这不是那么优雅。

  • 有没有办法一次性列出所有模块的所有 modaliases(包括内核内置),所以我可以找到匹配?
  • 或者,有没有办法查询内核,为我提供声称我实际上并不拥有这样一个设备的内核模块?

用例:

  • 用户在这里提问我可以通过实际validation“如果你升级到……支持”或“尝试rmmod module1; modprobe module2作为module2”似乎也支持你的设备来回答/欺骗。
  • 在购买具有ID的先前知识的硬件之前检查支持。 除了使用ID进行搜索之外,我还可以查找内核模块本身的错误报告。

如果你将问题重述为“如何在所有(或某些)模块上运行modinfo并选择一些输出以供进一步使用?”,你可以使用这个技巧(我已经离开了我用来弄清楚如何使用的命令得到最终结果):

 ls /lib/modules ls /lib/modules/$(uname -r) ls /lib/modules/$(uname -r)/kernel find /lib/modules/$(uname -r)/kernel -type f -name '*.ko' -print for i in $( !! ) ; do for i in $( find /lib/modules/$(uname -r)/kernel -type f -name '*.ko' -print ) ; do j=${i##.*/} j=${j%%.ko} echo $j modinfo $i | egrep 'filename:|alias:' echo "" done 

这个技巧可以在别处使用,玩得开心!