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

ger*_*ijk 14 kernel

假设我知道这里没有的硬件的数字产品/供应商 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*
[...]
Run Code Online (Sandbox Code Playgroud)

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

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

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

用例:

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

wal*_*tor 3

如果您将问题重述为“如何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
Run Code Online (Sandbox Code Playgroud)

这个技巧可以用在其他地方,玩得开心!