【问题标题】:How to know if there is a (compiled in/kernel module) device driver controlling a device on a running linux?如何知道是否有(编译入/内核模块)设备驱动程序控制正在运行的 linux 上的设备?
【发布时间】:2010-09-15 02:49:34
【问题描述】:

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

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)

我怎样才能找到:

  1. 哪个设备驱动程序(内核模块)控制每个设备?
  2. 哪个设备由编译在内核中(而不是作为模块) 的设备驱动程序控制
  3. 哪个设备没有设备驱动程序(编译或作为模块编译)?

这个脚本(改编自“Linux Kernel in a Nutshell”中的另一个脚本)部分解析了 #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

但也有一些问题:

  1. 我不知道有一种自动转换方式 /sys/devices/pci0000:00/0000:00:1e.0/0000:10:0d.0 --> pci:v00001002d0000515Esv00001028sd000001B1bc03sc00i0010:0d.0 VGA compatible controller: ATI Technologies Inc ES1000 (rev 02)

  2. 在某些情况下,设备在 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:

还有很多其他的。

  1. 当设备驱动程序被编译(或不存在)时,响应为FATAL: Module _XXXX_ not found.,表示该设备没有模块。

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

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

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

在其他情况下,驱动程序根本不存在。但我不知道如何区分。

有人知道吗?

【问题讨论】:

    标签: linux kernel-module drivers


    【解决方案1】:

    我不认为你可以在 Windows 设备管理器中得到 100% 明确的答案。

    • 一个设备可以由多个内核模块控制(比如nvidia + agpgart)。
    • 一个内核模块可以控制多个设备 (usbhid)。
    • 您还可以建立多对多关系 (usbcore + usbhid)。

    【讨论】:

      【解决方案2】:

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

      它提供了“info.linux.driver”之类的信息,请看下面的截图:

      很抱歉,我不知道如何自己在 sysfs 中整理出这些信息,但如果 HAL 能够找到它,它一定在某个地方:-)

      【讨论】:

        【解决方案3】:

        lspci -n 将为您提供您可以在linux kernel driver database 上搜索的 PCI id。这将告诉您要启用哪些内核选项。

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

            以下脚本将告诉您哪些动态加载的驱动程序正在运行,尽管我还想要一种自动方法来确定哪些编译的模块实际上也在使用中,这样我就可以进一步消除内核膨胀。

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

            我不确定其余部分与您的问题有多大的相关性,但我认为您或其他人可能会觉得它很有用。

            以下代码将确定哪些 .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 {
            
            }
            

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

            你可以在这里找到它:

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

            【讨论】:

              猜你喜欢
              • 2021-09-09
              • 2018-05-23
              • 2015-06-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-02
              • 1970-01-01
              • 2017-12-13
              • 2012-12-07
              相关资源
              最近更新 更多