web-dev-qa-db-ja.com

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

問題をトラブルシューティングしようとしています。USBマウスが、新しくインストールされたLinuxでは動作しません。

私の問題は、私の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])です。この情報をもとに、対応するカーネルモジュール名を見つける方法は?

5
lesnik

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_hcdxhci_pciの両方がモジュールとして使用できるように構成されています。代わりに...=yと表示される場合は、USB 3サポートがメインカーネルにコンパイルされています。

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

PCI ID Repository で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]から取得されます。これは、カーネルモジュール自体に埋め込まれたデバイスサポート情報(MODULE_DEVICE_TABLEマクロを使用してソースコードで定義)からのdepmodコマンドによって生成されます。 modinfo <module name> | grep aliasを使用して、特定のモジュールが要求するハードウェアサポートを表示することもできます。

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

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

一部のモジュールをブラックリストに登録していないか、何らかの理由で自動検出が失敗しない限り、通常はこれらのルックアップを手動で実行する必要はないことに注意してください。たとえば、Linuxカーネルが元の投稿者のUSB 3コントローラを検出すると、次のコマンド(と同等のもの)が実行されます。

modprobe pci:v00001022d000043b9sv1b21sd1142bc0Csc03i30

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

USBデバイス(および実際に自動プローブ可能なバス)には、モジュールエイリアスの同様のシステムと USB IDリポジトリがあります。

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

10
telcoM

モジュールがカーネルに組み込まれていない場合(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)
4
Stephen Harris