web-dev-qa-db-ja.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の下を見ると、2つのディレクトリがあることがわかります。 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 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
65
Graeme

udevadmツールを使用してこれを発見できます。
コマンドはudevadm info -a -n /dev/sda、次にDRIVER== パラメーター。

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

これは、このデバイスの提供に実際に関与する2つのドライバー、sdおよびahciがあることを示しています。最初の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 \:" 
 Model: "Floppy Disk" 
 Model: "FUJITSU MHZ2080B" 
 Driver: "ahci"、 "sd" 
モデル: "Partition" 
モデル: "Partition" 
モデル: "Partition" 
モデル: "Generic Multi-Card" 
ドライバー: "ums -realtek "、" sd "
モデル:" Realtek USB2.0-CRW "
ドライバー:" ums-realtek "

ネットワークカードの場合:

#hwinfo --netcard | grep -Ei "driver \:| model \:" 
モデル: "Broadcom NetXtreme BCM5764M Gigabit Ethernet PCIe" 
ドライバー: "tg3" 
モデル: "Intel Wireless WiFi Link 5100 "
ドライバー:" iwlwifi "

USBデバイスの場合:

#hwinfo --usb | grep -Ei "driver \:| model \:" 
 Model: "Linux 3.11.10-7-desktop uhci_hcd UHCI Host Controller" 
 Driver: "hub" 
 Model: "Linux 3.11.10-7-desktop uhci_hcd UHCI Host Controller" 
 Driver: "hub" 
 Model: "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: 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

この出力で、brw-rw----.の-​​bは、これがブロックデバイスであることを意味します。数字80は、それぞれデバイスのメジャー番号とマイナー番号です。

3
Spack