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
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
最後の便利な機能の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
この出力ではb
in はbrw-rw----.
これがブロックデバイスであることを示します。数字8
と0
は、それぞれデバイスのメイン番号とマイナー番号です。