새로운 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
모듈로 사용 가능하도록 구성됩니다. 대신 이러한 행이 표시되면 ...=y
USB 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]
되는 명령에서 나옵니다. 또한 이를 사용하여 특정 모듈에 대해 선언된 하드웨어 지원을 볼 수도 있습니다 .depmod
MODULE_DEVICE_TABLE
modinfo <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가 포함됩니다. 구성에 기록된 와일드카드 별칭 중 하나가 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" endor 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)