it-swarm-korea.com

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

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

  • 장치 (예 : /dev/sda)
  • 주요 숫자와 부 숫자 (예 : 8, 0)

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

/sys 또는 /proc에 들어가서 그 사실을 알 수 있습니까?

53
Totor

장치 파일의 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 
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 glob trick을 추가하여 어떤 장치에서 어떤 드라이버가 어떤 장치에서 사용되고 있는지에 대해 훨씬 더 넓은 관점을 얻습니다 (장치 파일이있는 장치는 아니지만) :

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
65
Graeme

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

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

이 장치를 제공하는 데 실제로 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==""
21
Patrick

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

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

네트워크 카드의 경우 :

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

USB 장치의 경우 :

 # hwinfo --usb | grep -Ei "driver\: | model\:"
 모델 : "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에서.

5
Thorsten Staerk

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: [email protected]: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

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

3
Spack