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

おすすめ記事