Linux에서 장치와 관련된 드라이버 (모듈)를 찾는 방법은 무엇입니까?


48

Linux에서 다음을 제공합니다.

  • 장치, 예를 들면 /dev/sda,
  • 예를 들어 주요 및 부 번호 8, 0

어떤 모듈 / 드라이버가 "구동"하는지 어떻게 알 수 있습니까?

내가 파고 수 /sys또는 /proc그것을 발견?


일부의 조합 lsmod, /proc/modules그리고 modinfo?

4
stackoverflow.com/questions/2911050 은이 질문과 동일합니다.
Michael Tomkins


Totor, 나는 다른 사용자가 동일한 질문을 게시했기 때문에 현상금을 추가했습니다. 나는 그에게 그의 질문을 삭제하고 더 많은 답변을 얻기 위해 이것에 현상금을 제공하도록 요청했습니다. 귀하의 질문에 대한 답변이 아래 답변 중 하나를 수락해야합니다.
terdon

현상금에 대한 @terdon 감사합니다, 그것은 좋은 답변을 생산했습니다. 나는 모든 것을 신중하게 테스트하지는 않았지만 그 동안 Graeme 의 대답을 받아 들일 것 입니다.
Totor

답변:


56

sysfs장치 파일에 대한 정보를 얻으려면 먼저 다음 ls -l과 같은 출력을보고 주 / 부 번호를 결정하십시오.

 $ ls -l /dev/sda
 brw-rw---- 1 root disk 8, 0 Apr 17 12:26 /dev/sda

8, 0주 번호는 것을 우리에게 알려줍니다 8그리고 미성년자입니다 0. b목록의 시작은 또한 블록 디바이스 것을 우리에게 알려줍니다. 다른 장치는 c시작할 때 문자 장치를 가질 수 있습니다 .

그런 다음 아래를 보면 /sys/dev두 개의 디렉토리가 있음을 알 수 있습니다. 하나는 호출 block하고 다른 하나는 호출했습니다 char. 여기서 가장 중요한 것은 각각 블록 및 문자 장치를위한 것입니다. 그런 다음 각 장치의 주 / 부 번호로이 디렉토리에 액세스 할 수 있습니다. 장치에 사용 가능한 드라이버가있는 driver경우이 device디렉토리 또는 하위 디렉토리 에있는 링크 의 대상을 읽어 드라이버를 찾을 수 있습니다 . 예를 들어, /dev/sda나는 간단하게 할 수 있습니다.

$ readlink /sys/dev/block/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd

sd드라이버가 장치에 사용됨을 나타냅니다 . 장치가 블록 또는 문자 장치인지 확실하지 않은 경우 셸에서이 부분을 간단히로 바꿀 수 *있습니다. 이것은 다음과 같이 작동합니다.

$ readlink /sys/dev/*/8\:0/device/driver
../../../../../../../bus/scsi/drivers/sd

블록 장치는 /sys/block또는을 통해 이름을 통해 직접 액세스 할 수도 있습니다 /sys/class/block. 예 :

$ readlink /sys/block/sda/device/driver
../../../../../../../bus/scsi/drivers/sd

/sys커널 구성에 따라 다양한 디렉토리의 존재 가 변경 될 수 있습니다. 또한 모든 장치에 device하위 폴더 가있는 것은 아닙니다 . 예를 들어, 같은 파티션 장치 파일의 경우입니다 /dev/sda1. 여기서 전체 디스크의 장치에 액세스해야합니다 (불행히도 이에 대한 sys링크 가 없습니다 ).

마지막으로 유용한 것은 사용 가능한 모든 장치의 드라이버를 나열하는 것입니다. 이를 위해 글롭을 사용하여 드라이버 링크가있는 모든 디렉토리를 선택할 수 있습니다. 예 :

$ ls -l /sys/dev/*/*/device/driver ls -l /sys/dev/*/*/driver 
ls: cannot access ls: No such file or directory
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/block/11:0/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:16/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/block/8:32/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:0/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:1024/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:128/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:256/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:384/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:512/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:513/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:514/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:640/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/189:643/driver -> ../../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:768/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 20:38 /sys/dev/char/189:896/driver -> ../../../../bus/usb/drivers/usb
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:1/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/char/21:2/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/21:3/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:0/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:1/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/250:2/device/driver -> ../../../../../../../bus/hid/drivers/hid-generic
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:0/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:1/device/driver -> ../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 12:27 /sys/dev/char/252:2/device/driver -> ../../../../../../../bus/scsi/drivers/sr
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/252:3/device/driver -> ../../../../../../../../../bus/scsi/drivers/sd
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/254:0/device/driver -> ../../../bus/pnp/drivers/rtc_cmos
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/29:0/device/driver -> ../../../bus/platform/drivers/simple-framebuffer
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:64/device/driver -> ../../../bus/pnp/drivers/serial
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:65/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:66/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 19:53 /sys/dev/char/4:67/device/driver -> ../../../bus/platform/drivers/serial8250
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/6:0/device/driver -> ../../../bus/pnp/drivers/parport_pc
lrwxrwxrwx 1 root root 0 Apr 17 12:26 /sys/dev/char/99:0/device/driver -> ../../../bus/pnp/drivers/parport_pc

마지막으로 질문에서 조금 벗어나기 위해 다른 /sys장치를 사용하여 어떤 장치에서 어떤 드라이버를 사용하고 있는지에 대한 더 넓은 관점을 얻을 것입니다 (장치 파일이있는 장치는 아니지만).

find /sys/bus/*/drivers/* -maxdepth 1 -lname '*devices*' -ls

최신 정보

의 결과를 자세히 살펴보면 udevadm표준 /sys디렉토리 를 찾은 다음 (위의 주요 / 부 디렉토리를 역 참조하면 얻을 수있는 것처럼) 디렉토리 트리를 올라가서 찾은 정보를 인쇄 하여 작동하는 것으로 보입니다 . 이렇게하면 상위 장치 및 이들이 사용하는 드라이버에 대한 정보를 얻을 수 있습니다.

이것을 실험하기 위해 아래의 스크립트를 작성하여 디렉토리 트리를 걷고 각 관련 수준에서 정보를 표시합니다. udev각 레벨에서 읽을 수있는 파일을 찾고있는 것으로 보입니다 (이름과 내용이에 통합되어 있음) ATTRS. 이 작업을 수행하는 대신 uevent각 수준에서 파일 내용을 표시합니다 (이것의 존재는 하위 디렉토리가 아닌 고유 한 수준을 정의합니다). 또한 찾은 모든 하위 시스템 링크의 기본 이름과 장치가이 계층 구조에 어떻게 적합한 지 보여줍니다. udevadm동일한 정보를 표시하지 않으므로 훌륭한 보완 도구입니다. 상위 장치 정보 (예 : PCI정보)는 다른 lshw장치 의 출력 을 상위 장치 와 일치시키려는 경우에도 유용 합니다.

#!/bin/bash

dev=$(readlink -m $1)

# test for block/character device
if [ -b "$dev" ]; then
  mode=block
elif [ -c "$dev" ]; then
  mode=char
else
  echo "$dev is not a device file" >&2
  exit 1
fi

# stat outputs major/minor in hex, convert to decimal
data=( $(stat -c '%t %T' $dev) ) || exit 2
major=$(( 0x${data[0]} ))
minor=$(( 0x${data[1]} ))

echo -e "Given device:     $1"
echo -e "Canonical device: $dev"
echo -e "Major: $major"
echo -e "Minor: $minor\n"

# sometimes nodes have been created for devices that are not present
dir=$(readlink -f /sys/dev/$mode/$major\:$minor)
if ! [ -e "$dir" ]; then
  echo "No /sys entry for $dev" >&2
  exit 3
fi

# walk up the /sys hierarchy one directory at a time
# stop when there are three levels left 
while [[ $dir == /*/*/* ]]; do

  # it seems the directory is only of interest if there is a 'uevent' file
  if [ -e "$dir/uevent" ]; then
    echo "$dir:"
    echo "  Uevent:"
    sed 's/^/    /' "$dir/uevent"

    # check for subsystem link
    if [ -d "$dir/subsystem" ]; then
        subsystem=$(readlink -f "$dir/subsystem")
        echo -e "\n  Subsystem:\n    ${subsystem##*/}"
    fi

    echo
  fi

  # strip a subdirectory
  dir=${dir%/*}
done

사용중인 모든 드라이버를 결정하는 방법이 있습니까? 마찬가지로 예를 들어, udevadm대답은 당신을 줄 것이다 sd하고 ahci. ahci사용 중인지 확인하는 방법이 있습니까?
Patrick

@Patrick, 예, 업데이트되었습니다.
Graeme

좋은 답변, 감사합니다! 내 경우에는 링크가에 device/device/있었으므로 내 readlink명령은 다음과 같습니다 readlink /sys/dev/char/XX\:Y/device/device/driver.
Harry Cutts

19

udevadm도구를 사용하여 이를 발견 할 수 있습니다 .
명령은 udevadm info -a -n /dev/sda이고 DRIVER==매개 변수를보십시오.

# udevadm info -a -n /dev/sda | grep -oP 'DRIVERS?=="\K[^"]+'  
sd
ahci

이이이 장치를 제공에 관련된 2 드라이버가 실제로 것을 보여줍니다 sdahci. 첫 번째 sd/dev/sda장치를 직접 담당 하지만 ahci드라이버를 사용합니다 .

 

udevadm명령 출력은 다음과 같으며 작동 방식에 대한 설명이 포함되어 있습니다.

# udevadm info -a -n /dev/sda      

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="500118192"
    ATTR{stat}=="   84786     1420  3091333    40215   966488    12528 14804028  2357668        0  1146934  2396653"
    ATTR{range}=="16"
    ATTR{discard_alignment}=="0"
    ATTR{events}==""
    ATTR{ext_range}=="256"
    ATTR{events_poll_msecs}=="-1"
    ATTR{alignment_offset}=="0"
    ATTR{inflight}=="       0        0"
    ATTR{removable}=="0"
    ATTR{capability}=="50"
    ATTR{events_async}==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0':
    KERNELS=="0:0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS=="sd"
    ATTRS{rev}=="VZJ4"
    ATTRS{type}=="0"
    ATTRS{scsi_level}=="6"
    ATTRS{model}=="LITEONIT LMT-256"
    ATTRS{state}=="running"
    ATTRS{queue_type}=="simple"
    ATTRS{iodone_cnt}=="0x10daad"
    ATTRS{iorequest_cnt}=="0x10ead1"
    ATTRS{queue_ramp_up_period}=="120000"
    ATTRS{device_busy}=="0"
    ATTRS{evt_capacity_change_reported}=="0"
    ATTRS{timeout}=="30"
    ATTRS{evt_media_change}=="0"
    ATTRS{ioerr_cnt}=="0x2"
    ATTRS{queue_depth}=="31"
    ATTRS{vendor}=="ATA     "
    ATTRS{evt_soft_threshold_reached}=="0"
    ATTRS{device_blocked}=="0"
    ATTRS{evt_mode_parameter_change_reported}=="0"
    ATTRS{evt_lun_change_reported}=="0"
    ATTRS{evt_inquiry_change_reported}=="0"
    ATTRS{iocounterbits}=="32"
    ATTRS{eh_timeout}=="10"

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0':
    KERNELS=="target0:0:0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1/host0':
    KERNELS=="host0"
    SUBSYSTEMS=="scsi"
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2/ata1':
    KERNELS=="ata1"
    SUBSYSTEMS==""
    DRIVERS==""

  looking at parent device '/devices/pci0000:00/0000:00:1f.2':
    KERNELS=="0000:00:1f.2"
    SUBSYSTEMS=="pci"
    DRIVERS=="ahci"
    ATTRS{irq}=="41"
    ATTRS{subsystem_vendor}=="0x144d"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x010601"
    ATTRS{enabled}=="1"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{local_cpus}=="0f"
    ATTRS{device}=="0x1e03"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="0-3"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0xc0d3"
    ATTRS{numa_node}=="-1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

1
@ECarterYoung udevadm제거 된 (또는 권장되는) 위치는 어디입니까? 나는 그것에 힌트를주는 것도 찾을 수 없습니다.
Patrick

1
@ECarterYoung 내가 한 일이 아니야.
Patrick

커널에 UEVENT_HELPER가없는 것으로 잘못 생각했습니다. systemd를 실행하는 시스템에서이 항목은 비어 있지만 시스템에 도우미가 여전히 있습니다.
eyoung100

4

hwinfo 명령 과 출력 모델 및 드라이버를 사용하십시오 . 드라이버가 없으면 표시되지 않습니다. 예를 들어 디스크의 경우 :

# hwinfo --block | grep -Ei "driver \ : | 모델 \ :"
  모델 : "플로피 디스크"
  모델 : "FUJITSU MHZ2080B"
  드라이버 : "ahci", "sd"
  모델 : "파티션"
  모델 : "파티션"
  모델 : "파티션"
  모델 : "일반 멀티 카드"
  드라이버 : "ums-realtek", "sd"
  모델 : "Realtek USB2.0-CRW"
  드라이버 : "ums-realtek"

네트워크 카드의 경우 :

# hwinfo --netcard | grep -Ei "driver \ : | 모델 \ :"
  모델 : "Broadcom NetXtreme BCM5764M 기가비트 이더넷 PCIe"
  드라이버 : "tg3"
  모델 : "Intel Wireless WiFi Link 5100"
  드라이버 : "iwlwifi"

USB 장치의 경우 :

# hwinfo --usb | grep -Ei "driver \ : | 모델 \ :"
  모델 : "Linux 3.11.10-7-desktop uhci_hcd UHCI 호스트 컨트롤러"
  드라이버 : "hub"
  모델 : "Linux 3.11.10-7-desktop uhci_hcd UHCI 호스트 컨트롤러"
  드라이버 : "hub"
  모델 : "IDEACOM IDC 6680"
  드라이버 : "usbhid"
  [...]

hwinfo --help를 사용하여 쿼리 할 수있는 다른 장치 유형을 찾으십시오. hwinfo는 기본적으로 예를 들어 SUSE Linux에 설치됩니다.


이를 특정 장치 파일과 관련 시키려면 한 가지 방법은 --only옵션 을 추가하는 것입니다. 예 hwinfo --block --only /dev/sda | grep ....
Graeme

3

lshw컴퓨터에서 발견 된 하드웨어를 나열하는 멋진 도구입니다. 실행하기 전에 먼저 설치해야합니다.

$ yum install lshw
$ apt-get install lshw

사용 yum또는 apt-get사용중인 시스템에 따라 달라집니다. 그런 다음 스토리지 하드웨어를 구체적으로 나열하십시오.

# lshw -class storage 
*-storage               
   description: SATA controller
   product: 5 Series/3400 Series Chipset 4 port SATA AHCI Controller
   vendor: Intel Corporation
   physical id: 1f.2
   bus info: pci@0000:00:1f.2
   version: 06
   width: 32 bits
   clock: 66MHz
   capabilities: storage msi pm ahci_1.0 bus_master cap_list
   configuration: driver=ahci latency=0
   resources: irq:41 ioport:1830(size=8) ioport:1824(size=4) ioport:1828(size=8) ioport:1820(size=4) ioport:1800(size=32) memory:f0305000-f03057ff

root모든 정보를 다시 가져 오도록 실행할 수 있습니다 .

그렇지 않으면 lspci하드웨어에 대한 정보를 제공 할 수도 있습니다.

$ lspci -vv
00:1f.2 SATA controller: Intel Corporation 5 Series/3400 Series Chipset 4 port SATA AHCI Controller (rev 06) (prog-if 01 [AHCI 1.0])
    Subsystem: Dell Device 0434
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
    Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 0
    Interrupt: pin B routed to IRQ 41
    Region 0: I/O ports at 1830 [size=8]
    Region 1: I/O ports at 1824 [size=4]
    Region 2: I/O ports at 1828 [size=8]
    Region 3: I/O ports at 1820 [size=4]
    Region 4: I/O ports at 1800 [size=32]
    Region 5: Memory at f0305000 (32-bit, non-prefetchable) [size=2K]
    Capabilities: <access denied>
    Kernel driver in use: ahci

장치의 주 및 부 번호를 찾으려면 장치를 실행 ls하십시오.

$ ls -l /dev/sda
brw-rw----. 1 root disk 8, 0 13 avril 10:54 /dev/sda

이 출력에서 bin brw-rw----.은 이것이 블록 장치임을 의미합니다. 숫자 80각각은 장치의 주 번호와 부 번호입니다.


1
내 질문은 한 장치와 해당 모듈 / 드라이버 사이의 링크를 찾는 것입니다. 그 대답은 어디에 있습니까?
Totor

1
@Totor 출력 lshw과 출력 lspci에서 장치가 사용하는 모듈을 볼 수 있습니다 : configuration : driver = ahci latency = 0커널 드라이버 사용 : ahci .
Spack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.