2

実行中の 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)

どうすれば見つけられますか:

  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.Indating there is no module for the device です。

場合によっては、ドライバーは (例) でコンパイルされます。

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

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

それ以外の場合は、ドライバーが存在しないだけです。しかし、私は違いを見分ける方法を知りません。

誰か知っていますか?

4

5 に答える 5

2

「KDEHALデバイスマネージャー」および「gnome-device-manager」としても利用できるHALデバイスマネージャーを試してください。基本的に、これらはハードウェアアブストラクションレイヤー(HAL)のフロントエンド/sysfs/です。

「info.linux.driver」のような情報を提供します。以下のスクリーンショットを参照してください。

申し訳ありませんが、sysfsでこの情報を自分でいじる方法がわかりませんが、HALがそれを見つけることができればどこかにあるはずです:-)

于 2008-10-03T20:23:33.943 に答える
2

Windows デバイス マネージャーで得られる 100% 明確な答えは得られないと思います。

  • デバイスは、複数のカーネル モジュール ( nvidia+agpgartなど) によって制御される場合があります。
  • カーネル モジュールは、複数のデバイスを制御する場合があります ( usbhid)。
  • 多対多の関係 ( usbcore+ usbhid) を持つこともできます。
于 2008-10-03T16:04:31.813 に答える
1

lspci -nは、 Linuxカーネルドライバーデータベースで検索できるPCIIDを提供します。これにより、有効にするカーネルオプションがわかります。

于 2008-10-05T02:30:24.997 に答える
1

これは少し遅れており、おそらく当時 (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
于 2010-07-03T17:00:29.507 に答える
0

次のスクリプトは、動的にロードされたドライバーが実行されていることを示しますが、実際に使用されているモジュールでコンパイルされたものを自動的に把握して、カーネルの膨張をさらに解消できるようにしたいと考えています。

#!/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

于 2009-06-16T06:39:34.077 に答える