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

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

Linux에서는 다음이 제공됩니다.

  • /dev/sda예를 들어 , 장치
  • 기본 및 보조 번호(예 8, 0: ,

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

/sys더 깊이 파고 들거나 /proc이를 발견 할 수 있나요 ?

답변1

장치 파일에서 이 정보를 얻으 려면 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

마지막 유용한 기능 중 하나는 모든 장치에 사용 가능한 드라이버를 나열하는 것입니다. 이렇게 하려면 glob을 사용하여 드라이버 링크가 있는 모든 디렉터리를 선택할 수 있습니다. 예를 들어:

$ ls -l /sys/dev/*/*/device/driver && ls -l /sys/dev/*/*/driver 
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어떤 장치가 어떤 드라이버를 사용하고 있는지 더 폭넓게 이해하기 위해 또 다른 glob 트릭을 추가하겠습니다(장치 파일이 있는 드라이버는 반드시 그럴 필요는 없음).

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

답변2

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==""

답변3

사용명령hwininfo출력 모델과 드라이버도 마찬가지입니다. 드라이버가 없으면 표시되지 않습니다. 디스크를 예로 들어보겠습니다.

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

네트워크 카드의 경우:

# hwinfo --네트워크 카드 | grep -Ei "드라이버\:|모델\:"
  모델: "Broadcom NetXtreme BCM5764M 기가비트 이더넷 PCIe"
  드라이버: "tg3"
  모델: "인텔 무선 WiFi 링크 5100"
  드라이버: "iwlwifi"

USB 장치의 경우:

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

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

답변4

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는 각각 장치의 주 번호와 부 번호입니다.

관련 정보