特定のデバイスのカーネルモジュールを見つける方法は?

特定のデバイスのカーネルモジュールを見つける方法は?

新しいLinuxインストールでUSBマウスが機能しない問題を解決しようとしています。

問題は、私のUSBハードウェア用のカーネルモジュール/ドライバがないことです。もちろん:

$ lspci -knn
...
01:00.0 USB controller [0c03]: Advanced Micro Devices, Inc. [AMD] Device [1022:43b9] (rev 02)
        Subsystem: ASMedia Technology Inc. Device [1b21:1142]
01:00.1 SATA controller [0106]: Advanced Micro Devices, Inc. [AMD] Device [1022:43b5] (rev 02)
        Subsystem: ASMedia Technology Inc. Device [1b21:1062]
        Kernel driver in use: ahci
...

ご覧のとおり、USBコントローラデバイスについて報告されたカーネルドライバはありません(SATAコントローラについて報告されたドライバと同様の方法で報告する必要があると思います)

したがって、私のデバイスに適したモジュールを使用してカーネルを再構築する必要があります。しかし、どのモジュールをビルドする必要があるのか​​、どうすればわかりますか?私のデバイスを識別する情報があります。ベンダーIDとハードウェアID([1b21:43b9])。この情報に基づいて、対応するカーネルモジュール名をどのように見つけることができますか?

答え1

PCI ID 1022:43b9はAMD X370シリーズチップセットUSB 3.1 xHCIコントローラです。 PCIサブシステムID 1b21:1142は、実際にはAMDチップセットに統合されたASMedia ASM1042A USB 3コントローラーである可能性があることを示しています。

ほとんどのUSB 3.xコントローラチップでは、適切なドライバモジュールはxhci_pciモジュールによって異なりますxhci_hcd。どちらのモジュールも標準のLinuxカーネルの一部なので、最新のLinuxディストリビューションで利用可能です。対応するカーネル設定オプションはCONFIG_USB_XHCI_PCIと ですCONFIG_USB_XHCI_HCD

多くのディストリビューションにはカーネル設定ファイルがあります/boot/config-<kernel version number>

$ grep XHCI /boot/config-$(uname -r)
CONFIG_USB_XHCI_HCD=m
CONFIG_USB_XHCI_PCI=m
# CONFIG_USB_XHCI_PLATFORM is not set

ここでは、両方ともxhci_hcdモジュールxhci_pciとして使用できるように構成されています。代わりに、これらの行が表示されると、...=yUSB 3サポートはデフォルトのカーネルにコンパイルされます。

PCI ID 1022:43b5、サブシステムID 1b21:1062はAHCI SATA(またはeSATA)コントローラであり、モジュールで覆われていますahci

PCI ID は以下にあります。PCI IDストア

ドライバーがベンダー/製品IDとして指定されている場合は、次/sbin/modprobe -c | grep '<vendor ID>.*<product ID>'の行を受け取ると一致するものが見つかりました。

alias pci:v0000<vendor ID>:d0000<product ID>sv... <module name>

この情報は、カーネルモジュール自体に組み込まれたデバイスサポート情報(ソースコードでマクロとして定義されている)によって生成される/lib/modules/modules.alias[.bin]コマンドから来ます。また、特定のモジュールに対して宣言されたハードウェアサポートを表示することもできます。depmodMODULE_DEVICE_TABLEmodinfo <module name> | grep alias

ただし、すべてのモジュールがベンダー/製品IDとして指定されるわけではありません。一部のドライバは全体をカバーします。 クラスたとえば、このxhci_pciモジュールは、「シリアルバスコントローラ」、「USBコントローラ」、および「XHCI」にそれぞれマッピングされているPCI基本クラス0x0C、サブクラス0x03、インターフェイス0x30...をサポートすると主張します。これは次のように表されます。

alias:          pci:v*d*sv*sd*bc0Csc03i30*

特定のモジュールをブラックリストに追加した場合、または何らかの理由で自動検出が失敗しない限り、通常、これらのクエリを手動で実行する必要はありません。たとえば、Linuxカーネルが元のポスターのUSB 3コントローラを検出すると、次のコマンドが実行されます(同等)。

modprobe pci:v00001022d000043b9sv1b21sd1142bc0Csc03i30

これには、デバイスで利用可能なすべてのハードウェアベンダー/デバイス/クラス/サブクラス/インターフェイスIDが含まれます。構成に書き込まれたワイルドカードエイリアスの1つがこのmodprobe文字列と一致すると、そのモジュールは自動的にロードされます。

USBデバイス(実際に自動的に検出できるすべてのバス)用の同様のモジュールエイリアシングシステムがあります。USB IDストレージ。

適切なモジュールがシステムにコンパイルされていない場合の最善の方法は、PCI IDストアを使用してデバイスまたはここで使用されているチップを識別することです。時々、ストレージエントリはそれをサポートするLinuxカーネルモジュールを識別します。この情報が存在しない場合は、デバイス/チップモデルでGoogle検索を実行する必要があります。これにより、通常、標準カーネルに含まれていない(まだ?)代替/実験的なドライバモジュールを見つけることができます。

答え2

モジュールがカーネルに組み込まれていない場合(RedHat 7およびそのバリアントでは、XHCI_HCDはモジュールとしてロードされませんが、基本イメージの一部です)、カーネルファイルを見ることができますmodules.aliases

例えば

% grep 1B21 /lib/modules/$(uname -r)/modules.alias
alias pci:v00001B21d00000612sv*sd*bc*sc*i* ahci
alias pci:v00001B21d00000611sv*sd*bc*sc*i* ahci
alias pci:v00001B21d00000602sv*sd*bc*sc*i* ahci
alias pci:v00001B21d00000601sv*sd*bc*sc*i* ahci

このファイルには、「v」エンドIDと「d」デバイスIDの値とともにロードする必要がある対応するモジュール(「ahci」)が表示されます。

モジュールがこれらのドライバを処理していることを確認できます。

% modinfo /usr/lib/modules/3.10.0-957.1.3.el7.x86_64/kernel/drivers/ata/ahci.ko.xz
filename:       /usr/lib/modules/3.10.0-957.1.3.el7.x86_64/kernel/drivers/ata/ahci.ko.xz
version:        3.0
license:        GPL
description:    AHCI SATA low-level driver
author:         Jeff Garzik
retpoline:      Y
rhelversion:    7.6
srcversion:     4BCC52C20C316AF69F3584A
....
alias:          pci:v00001B21d00000612sv*sd*bc*sc*i*
alias:          pci:v00001B21d00000611sv*sd*bc*sc*i*
alias:          pci:v00001B21d00000602sv*sd*bc*sc*i*
alias:          pci:v00001B21d00000601sv*sd*bc*sc*i*
...
depends:        libahci,libata
intree:         Y
vermagic:       3.10.0-957.1.3.el7.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        E7:CE:F3:61:3A:9B:8B:D0:12:FA:E7:49:82:72:15:9B:B1:87:9C:65
sig_hashalgo:   sha256
parm:           marvell_enable:Marvell SATA via AHCI (1 = enabled) (int)

ファイルの値はmodules.alias以下に対応します。

 v     (vendor)
 d     (device)
 sv    (subvendor)
 sd    (subdevice)
 bc    (bus class)
 sc    (bus subclass)
 i     (interface)

関連情報