假设我知道我这里没有的硬件的数字产品/供应商 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
,并且需要我事先知道模块名称。然而,在某些情况下,我不知道支持此类设备的模块名称。
网络硬件是那些似乎很难找到的类别之一。此外,lspci
和lsusb
名称有时不确定或完全错误。我目前正在搜索整个内核源代码树,这并不那么优雅。
- 有没有办法列出全部情态动词全部模块(包括内核内置的模块)这样我就能找到匹配吗?
- 或者,有没有办法查询内核来为我提供声称我实际上并不拥有的设备的内核模块?
用例:
- 用户在这里提问,我可以通过实际验证“如果升级到...,则会支持”或“尝试 rmmod module1;modprobe module2,因为 module2 似乎也支持您的设备”来回答/复制。
- 在购买硬件之前,先了解 ID,然后检查支持情况。除了使用 ID 搜索之外,我还可以查找内核模块本身的错误报告。
答案1
如果您将问题重述为“如何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
此技巧可以在其他地方使用,玩得开心!