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であり、学位はと言ってください0bリストの先頭でも、そのデバイスがブロックデバイスであることを知らせます。他のデバイスはc文字デバイス用に起動できます。

その後、を見ると、/sys/dev2つのディレクトリがあることがわかります。通話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

最後の便利な機能の1つは、すべてのデバイスで利用可能なドライバを一覧表示することです。これを行うには、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つのドライバがあることを示し、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==""

答え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は、それぞれデバイスのメイン番号とマイナー番号です。

関連情報