如何知道在运行的linux上是否有(编译在/ kernel模块中)设备驱动程序控制设备?

时间:2022-12-31 07:25:41

How can I know if a device is supported on a running Linux and if so, which device driver controls it? For instance, lspci on a server (PowerEdge 2900) gives:

如何知道正在运行的Linux上是否支持某个设备?如果是,哪个设备驱动程序控制它?例如,服务器上的lspci(PowerEdge 2900)给出:

00:00.0 Host bridge: Intel Corporation 5000X Chipset Memory Controller Hub (rev 12)
00:02.0 PCI bridge: Intel Corporation 5000 Series Chipset PCI Express x4 Port 2 (rev 12)
00:03.0 PCI bridge: Intel Corporation 5000 Series Chipset PCI Express x4 Port 3 (rev 12)
00:04.0 PCI bridge: Intel Corporation 5000 Series Chipset PCI Express x4 Port 4 (rev 12)
00:05.0 PCI bridge: Intel Corporation 5000 Series Chipset PCI Express x4 Port 5 (rev 12)
00:06.0 PCI bridge: Intel Corporation 5000 Series Chipset PCI Express x8 Port 6-7 (rev 12)
00:07.0 PCI bridge: Intel Corporation 5000 Series Chipset PCI Express x4 Port 7 (rev 12)
00:08.0 System peripheral: Intel Corporation 5000 Series Chipset DMA Engine (rev 12)
00:10.0 Host bridge: Intel Corporation 5000 Series Chipset FSB Registers (rev 12)
00:10.1 Host bridge: Intel Corporation 5000 Series Chipset FSB Registers (rev 12)
00:10.2 Host bridge: Intel Corporation 5000 Series Chipset FSB Registers (rev 12)
00:11.0 Host bridge: Intel Corporation 5000 Series Chipset Reserved Registers (rev 12)
00:13.0 Host bridge: Intel Corporation 5000 Series Chipset Reserved Registers (rev 12)
00:15.0 Host bridge: Intel Corporation 5000 Series Chipset FBD Registers (rev 12)
00:16.0 Host bridge: Intel Corporation 5000 Series Chipset FBD Registers (rev 12)
00:1c.0 PCI bridge: Intel Corporation 631xESB/632xESB/3100 Chipset PCI Express Root Port 1 (rev 09)
00:1d.0 USB Controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #1 (rev 09)
00:1d.1 USB Controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #2 (rev 09)
00:1d.2 USB Controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #3 (rev 09)
00:1d.3 USB Controller: Intel Corporation 631xESB/632xESB/3100 Chipset UHCI USB Controller #4 (rev 09)
00:1d.7 USB Controller: Intel Corporation 631xESB/632xESB/3100 Chipset EHCI USB2 Controller (rev 09)
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev d9)
00:1f.0 ISA bridge: Intel Corporation 631xESB/632xESB/3100 Chipset LPC Interface Controller (rev 09)
00:1f.1 IDE interface: Intel Corporation 631xESB/632xESB IDE Controller (rev 09)
00:1f.2 IDE interface: Intel Corporation 631xESB/632xESB/3100 Chipset SATA IDE Controller (rev 09)
01:00.0 PCI bridge: Intel Corporation 80333 Segment-A PCI Express-to-PCI Express Bridge
01:00.2 PCI bridge: Intel Corporation 80333 Segment-B PCI Express-to-PCI Express Bridge
02:0e.0 RAID bus controller: Dell PowerEdge Expandable RAID controller 5
04:00.0 PCI bridge: Broadcom EPB PCI-Express to PCI-X Bridge (rev c3)
05:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet (rev 12)
06:00.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Upstream Port (rev 01)
06:00.3 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express to PCI-X Bridge (rev 01)
07:00.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Downstream Port E1 (rev 01)
07:01.0 PCI bridge: Intel Corporation 6311ESB/6321ESB PCI Express Downstream Port E2 (rev 01)
08:00.0 PCI bridge: Broadcom EPB PCI-Express to PCI-X Bridge (rev c3)
09:00.0 Ethernet controller: Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet (rev 12)
0b:02.0 Multimedia audio controller: Creative Labs SB Audigy (rev 03)
0b:02.1 Input device controller: Creative Labs SB Audigy Game Port (rev 03)
0b:02.2 FireWire (IEEE 1394): Creative Labs SB Audigy FireWire Port
10:0d.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02)

How can I find:

我怎么能找到:

  1. which device driver (kernel module) controls each device?
  2. 哪个设备驱动程序(内核模块)控制每个设备?

  3. which device is controlled by a device driver compiled in the kernel (and not as a module)
  4. 哪个设备由内核中编译的设备驱动程序控制(而不是作为模块)

  5. which device doesn't have a device driver (compiled in or as a module)?
  6. 哪个设备没有设备驱动程序(在模块中编译或作为模块编译)?

This script (adapted from another in "Linux Kernel in a Nutshell") partially resolves #1:

这个脚本(改编自“坚果壳中的Linux内核”中的另一个)部分解决了#1:

#!/bin/bash
for i in $(find /sys/ -name modalias); do
    echo "----------------------------------"
    modalias=$(cat $i)
    echo "$(dirname $i) -->  $modalias" 
    /sbin/modprobe --config /dev/null --show-depends $(cat $i) 2>&1
done

But there are some problems with it:

但它有一些问题:

  1. I don't know of an automated way to convert /sys/devices/pci0000:00/0000:00:1e.0/0000:10:0d.0 --> pci:v00001002d0000515Esv00001028sd000001B1bc03sc00i00 to 10:0d.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02)

    我不知道将/sys/devices/pci0000:00/0000:00:1e.0/0000:10:0d.0 - > pci:v00001002d0000515Esv00001028sd000001B1bc03sc00i00转换为10:0d.0 VGA兼容控制器的自动方式:ATI Technologies Inc ES1000(rev 02)

  2. In some cases the devices are internal to the MB and I don't even know a way to find the real name of the device. For example:

    在某些情况下,设备是MB的内部设备,我甚至不知道找到设备真实名称的方法。例如:

/sys/devices/platform/dcdbas -->  platform:dcdbas
/sys/devices/platform/iTCO_wdt -->  platform:iTCO_wdt
/sys/devices/LNXSYSTM:00 -->  acpi:LNXSYSTM:
/sys/devices/LNXSYSTM:00/device:00/PNP0C33:00 -->  acpi:PNP0C33:PNP0C01:
/sys/devices/LNXSYSTM:00/device:00/PNP0A08:00 -->  acpi:PNP0A08:PNP0A03:
/sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/device:0d/PNP0200:00 -->  acpi:PNP0200:

and many others.

和许多其他人。

  1. When the device driver is compiled in (or doesn't exist) the response is FATAL: Module _XXXX_ not found. Indicating there is no module for the device.
  2. 当编译设备驱动程序(或不存在)时,响应为致命错误:找不到模块_XXXX_。表示该设备没有模块。

In some cases the driver is compiled in (e.g.)

在某些情况下,驱动程序编译在(例如)

/sys/devices/platform/serial8250 -->  platform:serial8250
FATAL: Module platform:serial8250 not found.

/sys/devices/platform/i8042 -->  platform:i8042
FATAL: Module platform:i8042 not found.

In other cases, the driver just doesn't exist. But I don't know a way to tell the difference.

在其他情况下,驱动程序就不存在了。但我不知道如何区分它们。

Does anyone know?

有人知道吗?

5 个解决方案

#1


2  

I don't think you can get a 100% clear-cut answer that you can get in Windows device manager.

我认为您无法在Windows设备管理器中获得100%明确的答案。

  • A device may be controlled by several kernel modules (say nvidia + agpgart).
  • 设备可以由几个内核模块(比如nvidia + agpgart)控制。

  • A kernel module may control more than one device (usbhid).
  • 内核模块可以控制多个设备(usbhid)。

  • You can also have many-to-many relationship (usbcore + usbhid).
  • 您还可以拥有多对多关系(usbcore + usbhid)。

#2


2  

Try HAL device manager, which is also available as "KDE HAL device manager" and "gnome-device-manager". Basically, these are frontends to the Hardware Abstraction Layer (HAL), which reads /sysfs/ et al.

尝试HAL设备管理器,它也可用作“KDE HAL设备管理器”和“gnome-device-manager”。基本上,这些是硬件抽象层(HAL)的前端,它读取/ sysfs / et al。

It gives information like "info.linux.driver", see the screenshot below:

它提供了诸如“info.linux.driver”之类的信息,请参见下面的屏幕截图:

如何知道在运行的linux上是否有(编译在/ kernel模块中)设备驱动程序控制设备?

I'm sorry I don't know how to fiddle out this information yourself in sysfs, but it must be somewhere if HAL is able to find it :-)

对不起,我不知道如何在sysfs中自行解决这些信息,但如果HAL能够找到它,它必须在某个地方:-)

#3


1  

lspci -n will give you PCI ids that you can search for on the linux kernel driver database. This will tell you which kernel options to enable.

lspci -n将为您提供可在linux内核驱动程序数据库上搜索的PCI ID。这将告诉您要启用哪些内核选项。

#4


1  

Well this is a little late, and maybe at that time (2008) didn't even exists, but lspci -n or better lspci -k should fix the problem; for instance:

嗯,这有点晚了,也许在那个时候(2008年)甚至不存在,但lspci -n或更好的lspci -k应该解决这个问题;例如:

04:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01)

04:00.0网络控制器:Broadcom Corporation BCM4312 802.11b / g(rev 01)

    Kernel driver in use: wl
    Kernel modules: wl, ssb

#5


0  

The following script will tell you which dynamically loaded drivers are running, although I would also like an automated way of figuring out which compiled in modules are actually in use also so I could de-bloat my kernel some more.

下面的脚本将告诉你哪些动态加载的驱动程序正在运行,尽管我还想要一种自动的方法来确定哪些已编译的模块实际上也在使用,这样我就可以对我的内核进行更多的破坏。

#!/bin/bash
/sbin/lsmod | tail -n+2 | cut -d" " -f1 | xargs /sbin/modinfo -n | sort ; 

I'm not sure how relevent the rest of this is to your question but thought you or others might find it useful.

我不确定其余部分是如何与您的问题相关的,但认为您或其他人可能会发现它有用。

The following code will figure out which .config options control each of the dynamically loaded kernel modules, although I haven't figured out a way to do the same for dynamic modules in the ubuntu lum package yet ( this script is still a work in progress ):

下面的代码将确定哪些.config选项控制每个动态加载的内核模块,虽然我还没有找到一种方法对ubuntu lum包中的动态模块做同样的事情(这个脚本仍在进行中) ):

#!/usr/bin/perl -w

use strict;
use Getopt::Long;

my ($kernConfigIn, $kernConfigOut, $kernSourceDir, $lumSourceDir, $lumConfigIn, $lumConfigOut, $help);

GetOptions(
    'ksd=s'   => \$kernSourceDir,
    'lsd=s'    => \$lumSourceDir,
    'kci=s'      => \$kernConfigIn,
    'lci=s'       => \$lumConfigIn,
    'kco=s'      => \$kernConfigOut,
    'lco=s'       => \$lumConfigOut,
    'help' => \$help);

if ($help || !$kernSourceDir || !$lumSourceDir ) { Usage($0); }

sub Usage {  print "usage error\n"; exit; };

my @modules = `/sbin/lsmod | tail -n+2 | cut -d" " -f1 | xargs /sbin/modinfo -n | sort ;`;
my @kconfig;

foreach my $module (@modules) {
    my ($package, $path, $modName) = ( $module =~ m/\/((?:kernel)|(?:ubuntu))\/(.*)\/(.*)\.ko/) ;
    $package eq 'kernel' ? push @kconfig, kernel($package, $path, $modName) : ubuntu($package, $path, $modName); 
}

# kernel package
sub kernel {
    my ($package, $path, $modName) = @_;
    my $makefile = $kernSourceDir.$path."/Makefile"; 
#    print "$package, $path, $modName\n";
#    print "$makefile\n";
    my $option;
    chomp($option = `cat $makefile | sed -n "s/^obj-\\\$(CONFIG_\\([A-Z0-9_]*\\))\\W*+=.*"$modName"\\.o.*/CONFIG_\\1/p"`);
    print "$option\n";
    return $option;
}

# deal with lum configs
sub ubuntu {

}

There is a script by Andreas Goelzer which with slight modification will turn off all unused kernel modules in your .config which significantly speeds up your compiles.

有一个由Andreas Goelzer编写的脚本,只需稍加修改即可关闭.config中所有未使用的内核模块,从而大大加快编译速度。

You can find it here:

你可以在这里找到它:

http://andreas.goelzer.de/kernel-config-based-on-lsmod-output

#1


2  

I don't think you can get a 100% clear-cut answer that you can get in Windows device manager.

我认为您无法在Windows设备管理器中获得100%明确的答案。

  • A device may be controlled by several kernel modules (say nvidia + agpgart).
  • 设备可以由几个内核模块(比如nvidia + agpgart)控制。

  • A kernel module may control more than one device (usbhid).
  • 内核模块可以控制多个设备(usbhid)。

  • You can also have many-to-many relationship (usbcore + usbhid).
  • 您还可以拥有多对多关系(usbcore + usbhid)。

#2


2  

Try HAL device manager, which is also available as "KDE HAL device manager" and "gnome-device-manager". Basically, these are frontends to the Hardware Abstraction Layer (HAL), which reads /sysfs/ et al.

尝试HAL设备管理器,它也可用作“KDE HAL设备管理器”和“gnome-device-manager”。基本上,这些是硬件抽象层(HAL)的前端,它读取/ sysfs / et al。

It gives information like "info.linux.driver", see the screenshot below:

它提供了诸如“info.linux.driver”之类的信息,请参见下面的屏幕截图:

如何知道在运行的linux上是否有(编译在/ kernel模块中)设备驱动程序控制设备?

I'm sorry I don't know how to fiddle out this information yourself in sysfs, but it must be somewhere if HAL is able to find it :-)

对不起,我不知道如何在sysfs中自行解决这些信息,但如果HAL能够找到它,它必须在某个地方:-)

#3


1  

lspci -n will give you PCI ids that you can search for on the linux kernel driver database. This will tell you which kernel options to enable.

lspci -n将为您提供可在linux内核驱动程序数据库上搜索的PCI ID。这将告诉您要启用哪些内核选项。

#4


1  

Well this is a little late, and maybe at that time (2008) didn't even exists, but lspci -n or better lspci -k should fix the problem; for instance:

嗯,这有点晚了,也许在那个时候(2008年)甚至不存在,但lspci -n或更好的lspci -k应该解决这个问题;例如:

04:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g (rev 01)

04:00.0网络控制器:Broadcom Corporation BCM4312 802.11b / g(rev 01)

    Kernel driver in use: wl
    Kernel modules: wl, ssb

#5


0  

The following script will tell you which dynamically loaded drivers are running, although I would also like an automated way of figuring out which compiled in modules are actually in use also so I could de-bloat my kernel some more.

下面的脚本将告诉你哪些动态加载的驱动程序正在运行,尽管我还想要一种自动的方法来确定哪些已编译的模块实际上也在使用,这样我就可以对我的内核进行更多的破坏。

#!/bin/bash
/sbin/lsmod | tail -n+2 | cut -d" " -f1 | xargs /sbin/modinfo -n | sort ; 

I'm not sure how relevent the rest of this is to your question but thought you or others might find it useful.

我不确定其余部分是如何与您的问题相关的,但认为您或其他人可能会发现它有用。

The following code will figure out which .config options control each of the dynamically loaded kernel modules, although I haven't figured out a way to do the same for dynamic modules in the ubuntu lum package yet ( this script is still a work in progress ):

下面的代码将确定哪些.config选项控制每个动态加载的内核模块,虽然我还没有找到一种方法对ubuntu lum包中的动态模块做同样的事情(这个脚本仍在进行中) ):

#!/usr/bin/perl -w

use strict;
use Getopt::Long;

my ($kernConfigIn, $kernConfigOut, $kernSourceDir, $lumSourceDir, $lumConfigIn, $lumConfigOut, $help);

GetOptions(
    'ksd=s'   => \$kernSourceDir,
    'lsd=s'    => \$lumSourceDir,
    'kci=s'      => \$kernConfigIn,
    'lci=s'       => \$lumConfigIn,
    'kco=s'      => \$kernConfigOut,
    'lco=s'       => \$lumConfigOut,
    'help' => \$help);

if ($help || !$kernSourceDir || !$lumSourceDir ) { Usage($0); }

sub Usage {  print "usage error\n"; exit; };

my @modules = `/sbin/lsmod | tail -n+2 | cut -d" " -f1 | xargs /sbin/modinfo -n | sort ;`;
my @kconfig;

foreach my $module (@modules) {
    my ($package, $path, $modName) = ( $module =~ m/\/((?:kernel)|(?:ubuntu))\/(.*)\/(.*)\.ko/) ;
    $package eq 'kernel' ? push @kconfig, kernel($package, $path, $modName) : ubuntu($package, $path, $modName); 
}

# kernel package
sub kernel {
    my ($package, $path, $modName) = @_;
    my $makefile = $kernSourceDir.$path."/Makefile"; 
#    print "$package, $path, $modName\n";
#    print "$makefile\n";
    my $option;
    chomp($option = `cat $makefile | sed -n "s/^obj-\\\$(CONFIG_\\([A-Z0-9_]*\\))\\W*+=.*"$modName"\\.o.*/CONFIG_\\1/p"`);
    print "$option\n";
    return $option;
}

# deal with lum configs
sub ubuntu {

}

There is a script by Andreas Goelzer which with slight modification will turn off all unused kernel modules in your .config which significantly speeds up your compiles.

有一个由Andreas Goelzer编写的脚本,只需稍加修改即可关闭.config中所有未使用的内核模块,从而大大加快编译速度。

You can find it here:

你可以在这里找到它:

http://andreas.goelzer.de/kernel-config-based-on-lsmod-output