Linux:我如何知道导出设备节点的模块?

如果具有/ dev设备节点及其主/次号码,我如何知道导出此节点的内核模块名称?

简短的回答:

cd /sys/dev/char/major:minor/device/driver/ ls -al | grep module 

每个设备通常都与一个驱动程序相关联,这就是“设备模型”所关心的。 sysfs文件系统包含这些设备及其相关驱动程序的表示。 不幸的是,似乎并不是所有的sysfs都有设备节点的表示,所以这只适用于/ sys目录包含/ dev目录的情况。 我们举一个例子,用/dev/video0

在我的主板上, ls -al /dev/video0输出

 crw------- 1 root root 81, 0 Jan 1 00:00 video0 

所以主数是81,次数是0.让我们深入sysfs:

 # cd /sys # ls block class devices fs module bus dev firmware kernel 

sys/dev目录包含sys/dev的char和block设备的条目:

 # cd dev # cd char # ls 10:61 13:64 1:3 1:8 249:0 252:0 29:0 4:65 81:0 89:1 10:62 1:1 1:5 1:9 250:0 253:0 29:1 5:0 81:2 10:63 1:11 1:7 248:0 251:0 254:0 4:64 5:1 81:3 

这到底是什么与陌生的名字联系在一起? 记住主要和次要的数字,81和0? 我们来看看这个链接:

 #cd major:minor (ie 81:0) #ls -al drwxr-xr-x 2 root root 0 Jan 1 01:56 . drwxr-xr-x 3 root root 0 Jan 1 01:56 .. -r--r--r-- 1 root root 4096 Jan 1 01:56 dev lrwxrwxrwx 1 root root 0 Jan 1 01:56 device -> ../../../vpfe-capture -r--r--r-- 1 root root 4096 Jan 1 01:56 index -r--r--r-- 1 root root 4096 Jan 1 01:56 name lrwxrwxrwx 1 root root 0 Jan 1 01:56 subsystem -> ../../../../../class/video4linux -rw-r--r-- 1 root root 4096 Jan 1 01:56 uevent 

现在我们可以看到,这个设备点头,这个设备是如何呈现给用户空间的,与内核设备相关联。 这个联系是通过一个链接。 如果我们按照这个链接,我们最终在一个目录中,并有一个驱动程序链接。 驱动程序的名称通常是模块的名称:

 # ls -al drwxr-xr-x 3 root root 0 Jan 1 01:56 . drwxr-xr-x 25 root root 0 Jan 1 00:00 .. lrwxrwxrwx 1 root root 0 Jan 1 01:56 driver -> ../../../bus/platform/drivers/vpfe-capture -r--r--r-- 1 root root 4096 Jan 1 01:56 modalias lrwxrwxrwx 1 root root 0 Jan 1 01:56 subsystem -> ../../../bus/platform -rw-r--r-- 1 root root 4096 Jan 1 01:56 uevent drwxr-xr-x 3 root root 0 Jan 1 01:56 video4linux 

所以这里模块的名字是vpfe_capture

这个问题的答案很可能有很多不同的因素。 例如,如果您正在运行udev,devfs,pre-devfs等

如果你使用的是Ubuntu(或另一个同样现代的发行版),那么udevadm命令可能就是你想要的。

 % udevadm info -q path -n /dev/cdrom /devices/pci0000:00/0000:00:1f.1/host3/target3:0:0/3:0:0:0/block/sr0 

所以,我的/ dev / cdrom由位于sr_mod内核模块中的sr驱动程序提供。 我不知道以/dev/cdrom作为参数并将sr_mod作为输出打印的sr_mod