Linuxにおけるハードウェアデバイスの探索

LinuxBeginner
オンラインで実践に進む

はじめに

この実験では、Linux環境でハードウェアデバイスを探索、識別、および調査するための基本的なスキルを学びます。強力なコマンドラインユーティリティを実際に操作し、オペレーティングシステムが物理コンポーネントとどのように対話しているかを理解します。目的は、システム管理、パフォーマンスチューニング、およびトラブルシューティングに不可欠な、Linuxにおけるハードウェア管理の基礎知識を構築することです。

まず、lsblklshw を使用してブロックデバイスを一覧表示し、ストレージの概要を把握します。次に、udevadm を使用してデバイスの詳細なプロパティとルールを調査します。続いて、PCIおよびSCSIバスの階層構造を表示し、デバイスがどのように接続されているかを確認します。最後に、/proc および /sys 仮想ファイルシステムを調べることで、カーネルの視点からシステムハードウェアを包括的に理解します。

lsblkとlshwによるブロックデバイスの一覧表示

このステップでは、システムに接続されているブロックデバイスを識別し、一覧表示する方法を学びます。ブロックデバイスとは、ハードドライブ、ソリッドステートドライブ(SSD)、USBフラッシュドライブのように、データを固定サイズのブロック単位で転送するストレージデバイスのことです。この目的のために、lsblklshw という2つの一般的なコマンドを使用します。

まず、lsblk コマンドを使用して、利用可能なすべてのブロックデバイスをツリー形式で表示します。このコマンドは sysfs ファイルシステムと udev データベースを読み取って情報を収集します。

ターミナルで lsblk コマンドを実行してください:

lsblk

以下のような出力が表示され、デバイスとそれに含まれるパーティションが一覧表示されます。

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0  89.4M  1 loop /snap/lxd/31333
loop1    7:1    0     4K  1 loop /snap/bare/5
loop2    7:2    0  63.9M  1 loop /snap/core20/2318
loop3    7:3    0 242.9M  1 loop /snap/firefox/2710
loop4    7:4    0 244.5M  1 loop /snap/firefox/2800
loop5    7:5    0 349.7M  1 loop /snap/gnome-3-38-2004/140
loop6    7:6    0 349.7M  1 loop /snap/gnome-3-38-2004/143
loop7    7:7    0  91.7M  1 loop /snap/gtk-common-themes/1535
loop9    7:9    0    87M  1 loop /snap/lxd/28373
loop10   7:10   0  73.9M  1 loop /snap/core22/2010
loop11   7:11   0  38.8M  1 loop /snap/snapd/21759
loop12   7:12   0  50.9M  1 loop /snap/snapd/24718
loop13   7:13   0  63.8M  1 loop /snap/core20/2599
vda    252:0    0    40G  0 disk
├─vda1 252:1    0     1M  0 part
├─vda2 252:2    0   200M  0 part /boot/efi
└─vda3 252:3    0  39.8G  0 part /var/snap/firefox/common/host-hunspell
                                 /

VMイメージによっては、プライマリディスク名が vdasda、または nvme0n1 になる場合があります。以降のステップでは、lsblk/ にマウントされているデバイスとして表示されるディスク名を常に使用してください。

各列の簡単な説明は以下の通りです:

  • NAME: デバイス名。
  • MAJ:MIN: メジャーおよびマイナーデバイス番号。カーネルがデバイスを識別するために使用します。
  • RM: リムーバブルデバイスかどうか(1ならはい、0ならいいえ)。
  • SIZE: デバイスのサイズ。
  • RO: 読み取り専用デバイスかどうか(1ならはい、0ならいいえ)。
  • TYPE: デバイスの種類(例:disk, part, loop)。
  • MOUNTPOINTS: ファイルシステム上のマウントポイント。

lsblk は概要を把握するのに適していますが、lshw(list hardware)コマンドを使用すると、より詳細な情報を取得できます。lshw はデフォルトでインストールされていない可能性があるため、まずインストールします。

sudo apt-get update && sudo apt-get install -y lshw

インストールが完了したら、lshw を使用して特定のハードウェアクラスに関する詳細情報を取得できます。例えば、ストレージコントローラー(SATAやNVMeコントローラーなど)の詳細を確認するには、-class storage オプションを使用します。

sudo lshw -class storage

出力にはストレージインターフェース自体の情報が表示されます。

  *-pnp00:03
       product: PnP device PNP0700
       physical id: 3
       capabilities: pnp
  *-ide
       description: IDE interface
       product: 82371SB PIIX3 IDE [Natoma/Triton II]
       vendor: Intel Corporation
       physical id: 1.1
       bus info: pci@0000:00:01.1
       version: 00
       width: 32 bits
       clock: 33MHz
       capabilities: ide isa_compat_mode bus_master
       configuration: driver=ata_piix latency=0
       resources: irq:0 ioport:1f0(size=8) ioport:3f6 ioport:170(size=8) ioport:376 ioport:c060(size=16)
  *-scsi
       description: SCSI storage controller
       product: Virtio block device
       vendor: Red Hat, Inc.
       physical id: 4
       bus info: pci@0000:00:04.0
       version: 00
       width: 64 bits
       clock: 33MHz
       capabilities: scsi msix bus_master cap_list
       configuration: driver=virtio-pci latency=0
       resources: irq:0 memory:fe000000-fe000fff memory:fe001000-fe001fff

パーティションや論理ボリュームに関する詳細情報(lsblk よりも詳細)を取得するには、-class volume オプションを使用します。

sudo lshw -class volume

このコマンドは、各パーティションの論理名、シリアル番号、機能など、豊富な情報を提供します。

  *-volume:0
       description: BIOS Boot partition
       vendor: EFI
       physical id: 1
       bus info: scsi@0:0.0.0,1
       logical name: /dev/vda1
       serial: xxxx-xxxx
       size: 1MiB
       capacity: 1MiB
       capabilities: primary
  *-volume:1
       description: EFI partition
       vendor: EFI
       physical id: 2
       bus info: scsi@0:0.0.0,2
       logical name: /dev/vda2
       serial: XXXX-XXXX
       size: 200MiB
       capacity: 200MiB
       capabilities: boot fat initialized
       configuration: FATs=32 filesystem=fat mount.fstype=vfat mount.options=rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro state=mounted
  *-volume:2
       description: Linux filesystem
       physical id: 3
       bus info: scsi@0:0.0.0,3
       logical name: /dev/vda3
       size: 39GiB
       capacity: 39GiB
       capabilities: primary ext4 initialized
       configuration: filesystem=ext4 lastmountpoint=/ modified=2024-xx-xx mounted=2024-xx-xx state=mounted

lsblklshw を使用することで、Linuxシステムのストレージデバイスについて、全体像と詳細な低レベル情報の両方を取得できます。

udevadmによるデバイスプロパティの調査

前のステップでは、ブロックデバイスを一覧表示する方法を学びました。ここでは、udevadm コマンドを使用して、これらのデバイスの特定のプロパティをさらに深く調査します。udev はLinuxカーネルのデバイスマネージャーであり、/dev ディレクトリ内のデバイスノードを動的に管理します。udevadm コマンドは udev の制御ツールであり、udev データベースにクエリを投げて詳細なデバイス情報を取得できます。これは、デバイスを自動的に管理するためのカスタム udev ルールを作成する前に特に役立ちます。

ルートファイルシステムを含むメインディスクのプロパティを調査してみましょう。まず、ルートパーティションとその親ディスクを特定します:

ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
echo "$ROOT_PARTITION -> /dev/$DISK_NAME"

そのディスクのプロパティを単純なキーと値の形式で表示するには、次のコマンドを実行します。-q property フラグは udevadm に対してデバイスのすべての既知のプロパティをデータベースに問い合わせるよう指示し、-n "/dev/$DISK_NAME" はデバイスノード名を指定します。

udevadm info -q property -n "/dev/$DISK_NAME"

出力は、デバイスを記述する環境変数のリストになります。正確な値は異なりますが、出力は以下のようになります:

DEVPATH=/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1
DEVNAME=/dev/nvme0n1
DEVTYPE=disk
MAJOR=259
MINOR=0
SUBSYSTEM=block
USEC_INITIALIZED=xxxxxxxxx
ID_MODEL=Alibaba Cloud Elastic Block Storage
ID_REVISION=1.0
ID_SERIAL=Alibaba_Cloud_Elastic_Block_Storage_xxxxxxxxxxxx
ID_SERIAL_SHORT=xxxxxxxxxxxx
ID_TYPE=disk
ID_PATH=pci-0000:00:04.0-nvme-1
ID_PATH_TAG=pci-0000_00_04_0-nvme-1
DEVLINKS=/dev/disk/by-id/nvme-... /dev/disk/by-path/pci-0000:00:04.0-nvme-1
TAGS=:systemd:

この出力は、ID_MODELID_PATH、一意の ID_SERIAL などの貴重な詳細を提供します。これらのプロパティは、カーネルによって検出された順序に関係なく、特定のデバイスに適用される udev ルールを作成するためによく使用されます。

さらに詳細な階層ビューを表示するには、sysfs パスを使用してデバイスにクエリを投げます。まず、選択したディスクの sysfs パスを見つけます:

udevadm info -q path -n "/dev/$DISK_NAME"

出力は /sys ファイルシステム内のデバイスパスになります:

/devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1

次に、このパスと -a(属性ウォーク)および -p(パス)フラグを使用して、親デバイスから指定されたデバイスまでのすべてのデバイス属性を表示します。これにより、デバイスとその親コントローラーの全体像が把握できます。

udevadm info -a -p "$(udevadm info -q path -n "/dev/$DISK_NAME")"

このコマンドは非常に長い出力を生成し、ブロックデバイス自体の属性だけでなく、その親ストレージコントローラーやPCIデバイスの属性も表示します。このレベルの詳細は、高度なデバイス管理やトラブルシューティングに不可欠です。出力が長いためここではすべてを表示しませんが、ぜひ確認してみてください。

PCIおよびSCSIバス階層の表示

このステップでは、システムバス上でデバイスがどのように整理されているかを探ります。バスとは、コンピュータ内部のコンポーネント間でデータを転送する通信システムです。ここでは、PCI(Peripheral Component Interconnect)とSCSI(Small Computer System Interface)という2つの重要なバスに焦点を当てます。その階層構造を理解することは、ハードウェアの問題を診断し、ハードドライブなどのデバイスがシステムにどのように接続されているかを理解するのに役立ちます。

まず、マザーボード上のほとんどの高速コンポーネントを接続するPCIバスを調べます。lspci コマンドがこれに対する標準ツールです。このコマンドを提供する pciutils パッケージは通常プリインストールされていますが、念のため確認します。

sudo apt-get update && sudo apt-get install -y pciutils

次に、PCIバスの階層をツリー構造で表示するために、-t オプションを付けて lspci コマンドを実行します。

lspci -t

出力は以下のようになり、バスとデバイス間の接続が表示されます:

-[0000:00]-+-00.0
           +-01.0
           +-01.1
           +-01.3
           +-04.0
           \-05.0

このツリーは接続を示していますが、デバイスが何であるかは分かりません。より有用にするために、-v(詳細)オプションを追加します。これにより、デバイス名と各デバイスで使用されているカーネルドライバーが含まれます。出力が長くなる可能性があるため、more にパイプしてスクロールできるようにします。スペースキーで下にスクロールし、q で終了します。

lspci -tv | more

出力はより詳細になります:

-[0000:00]-+-00.0  Intel Corporation 440FX - 82441FX PMC [Natoma]
           +-01.0  Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
           +-01.3  Intel Corporation 82371AB/EB/MB PIIX4 ACPI
           +-02.0  Cirrus Logic GD 5446
           +-03.0  Red Hat, Inc. Virtio console
           +-04.0  Intel Corporation QEMU NVM Express Controller
           +-05.0  Red Hat, Inc. Virtio network device
           \-06.0  Red Hat, Inc. Virtio memory balloon

この出力から、NVMeストレージコントローラーやその他の仮想デバイスなど、PCIバスに接続されている特定のハードウェアコンポーネントを確認できます。

次に、SCSIバスを見てみましょう。このVMでは、メインディスクがVirtioやSCSIではなくNVMe経由で公開されている可能性がありますが、存在するSCSIデバイスを探索することは可能です。この情報を表示するユーザーフレンドリーな方法として systool コマンドがあります。これを提供する sysfsutils パッケージをインストールします。

sudo apt-get install -y sysfsutils

次に、-b scsi オプションを付けて systool を使用し、SCSIバス上のデバイスを一覧表示します。

systool -b scsi

このコマンドは、SCSIバスに接続されているデバイスを表示します:

Bus = "scsi"

  Device = "host0"
  Device = "host1"

/procにおける低レベルシステムリソースの調査

このステップでは、/proc 仮想ファイルシステムを掘り下げて、低レベルのシステムリソースを調査します。/proc ファイルシステムにはディスク上の実際のファイルは含まれておらず、カーネルのデータ構造への直接的なインターフェースです。/proc 内のファイルを読み取ることで、システムがDMAチャネル、割り込み、I/Oポートなどのハードウェアリソースをどのように管理しているかをリアルタイムで確認できます。

まず、DMA(Direct Memory Access)チャネルを見てみましょう。DMAを使用すると、特定のハードウェアデバイスがCPUを介さずにシステムメモリに直接アクセスできるため、パフォーマンスが向上します。現在使用されているDMAチャネルを確認するには、/proc/dma ファイルの内容を表示します。

cat /proc/dma

出力は通常非常にシンプルで、特に最新のシステムや仮想化システムでは顕著です。

 4: cascade

この出力は、登録されているDMAチャネルを示しています。cascade チャネルは古いスタイルの割り込みコントローラーをチェーンするために使用され、最新のハードウェアではこれだけがリストされることがよくあります。

次に、割り込み要求(IRQ)を調べます。ハードウェアデバイスがCPUの注意を必要とするとき、割り込み信号を送信します。/proc/interrupts ファイルは、各IRQ番号に対して何回割り込みが受信されたかの統計を提供します。

cat /proc/interrupts

出力には、CPUコアごとの割り込みアクティビティの詳細な内訳が表示されます。

           CPU0
  0:         10   IO-APIC   2-edge      timer
  1:          2   IO-APIC   1-edge      i8042
  8:          1   IO-APIC   8-edge      rtc0
  9:          0   IO-APIC   9-fasteoi   acpi
 11:        ...   IO-APIC  11-fasteoi   ata_piix, uhci_hcd
 12:          4   IO-APIC  12-edge      i8042
NMI:          0   Non-maskable interrupts
LOC:      ...   Local timer interrupts
...

各列の意味は以下の通りです:

  • 最初の列はIRQ番号です。
  • CPU0 列(存在する場合は他のCPU列も)は、そのCPUコアによって処理された割り込みの数を示します。
  • 最後の列は、その割り込みに関連付けられたデバイスドライバーの名前を示します。これはハードウェアの競合をデバッグするのに非常に役立ちます。

最後に、I/Oポートを見てみましょう。これらは、CPUがハードウェアデバイスと直接通信するために使用する特別なメモリアドレスです。/proc/ioports ファイルには、現在デバイス用に予約されているI/Oポート領域がリストされています。リストが長くなる可能性があるため、less で表示するのが最適です。矢印キーでスクロールし、q を押して終了できます。

less /proc/ioports

メモリ範囲とそれを使用しているデバイスのリストが表示されます。

0000-0cf7 : PCI Bus 0000:00
  0020-0021 : PIC1
  0040-0043 : timer0
  0050-0053 : timer1
  0060-0060 : keyboard
  0064-0064 : keyboard
  0070-0077 : rtc0
  0080-008f : dma page reg
  00a0-00a1 : PIC2
  00c0-00df : dma2
  00f0-00ff : fpu
0170-0177 : 0000:00:01.1
  0170-0177 : ata_piix
01f0-01f7 : 0000:00:01.1
  01f0-01f7 : ata_piix
...

この出力は、メモリのアドレス範囲とそれを要求したデバイスを示しています。例えば、キーボード、タイマー、および前のステップで確認した ata_piix ディスクコントローラーの範囲を確認できます。

/sysファイルシステムにおけるデバイス情報の探索

最後のステップでは、/sys にマウントされている sysfs ファイルシステムを探索します。/proc がプロセスや一部のハードウェアリソースに関する情報を提供するのに対し、/sys はシステムのデバイスモデルのより構造化されたビューを提供します。これは、カーネルオブジェクト、デバイス、ドライバーの階層的な表現をエクスポートします。前のステップで使用した lsblkudevadm などのツールの多くは、/sys から読み取ることで情報を取得しています。

まず、ブロックデバイスがどのように表現されているかを見てみましょう。/sys/block ディレクトリには、システムが認識している各ブロックデバイスのサブディレクトリが含まれています。

/sys/block の内容をリストしてデバイスを確認します:

ls -l /sys/block

出力には、ループデバイスやメインディスクを含むブロックデバイスが表示されます。これらは、/sys/devices 階層内の実際の場所を指すシンボリックリンクであることに注意してください。

total 0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 loop0 -> ../devices/virtual/block/loop0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 loop1 -> ../devices/virtual/block/loop1
...
lrwxrwxrwx 1 root root 0 Jan  1 00:00 nvme0n1 -> ../devices/pci0000:00/0000:00:04.0/nvme/nvme0/nvme0n1

ルートファイルシステムの親ディスクを再度特定し、そのディレクトリを調査します。このディレクトリには、デバイスの属性を表すさまざまなファイルが含まれています。

ROOT_PARTITION=$(findmnt -n -o SOURCE /)
DISK_NAME=$(lsblk -no PKNAME "$ROOT_PARTITION")
ls /sys/block/"$DISK_NAME"

ファイルとディレクトリのリストが表示されます:

alignment_offset  diskseq  holders  nvme0n1p2  ro       uevent
bdi               events   inflight nvme0n1p3  size     wwid
capability        events_async integrity power  slaves
dev               events_poll_msecs mq    queue  stat
device            ext_range nsid    range  subsystem
discard_alignment hidden    nvme0n1p1 removable trace

各ファイルには特定の情報が保持されています。例えば、ディスクのサイズを確認するには size ファイルを読み取ります。

cat /sys/block/"$DISK_NAME"/size

出力は数値になります:

83886080

この数値は、512バイトセクター単位でのデバイスサイズを表しています。また、nvme0n1p1nvme0n1p2nvme0n1p3 のような各パーティションのディレクトリもあり、それぞれ独自の属性セットが含まれています。他のイメージでは、パーティション名に異なるデバイスプレフィックスが使用される場合があります。

次に、/sys/bus ディレクトリでデバイスがバスタイプごとにどのように整理されているかを探ります。これは、デバイス階層をナビゲートする別の方法を提供します。

ls /sys/bus

カーネルがサポートするさまざまなバスタイプのリストが表示されます:

acpi  amba  clocksource  container  cpu  event_source  hid  i2c  i8042  ide  mdio_bus  memory  pci  pci_express  platform  scsi  serial  serio  soc  system  usb  virtio  workqueue

ストレージディスクがVirtioブロックデバイスでない場合でも、VMは他のVirtioデバイスを公開している可能性があります。/sys/bus/virtio/devices ディレクトリの中を見て、それらをリストしてみましょう。

ls -l /sys/bus/virtio/devices

出力には、デバイスIDで識別されるVirtioデバイスが表示されます。これらもメインのデバイスツリーを指すシンボリックリンクです。

total 0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 virtio0 -> ../../../devices/pci0000:00/0000:00:05.0/virtio0
lrwxrwxrwx 1 root root 0 Jan  1 00:00 virtio1 -> ../../../devices/pci0000:00/0000:00:04.0/virtio1

/sys を探索することで、高レベルのツールがシステムハードウェアを報告するために使用する生のデータに直接アクセスできます。これは、Linuxカーネルがデバイスをどのように認識し、整理しているかを理解するための強力な方法です。

まとめ

この実験では、Linux環境でハードウェアデバイスを識別し、調査する方法を学びました。lsblk コマンドを使用してブロックデバイスとそのパーティションをツリー形式で一覧表示する方法や、lshw コマンドを使用してより詳細なハードウェア仕様を取得する方法を練習しました。また、udev サブシステムによって管理されるデバイスプロパティを調査するために udevadm を使用する方法や、PCIおよびSCSIデバイスのシステムバス階層を表示する方法についても学習しました。

さらに、擬似ファイルシステムを通じてカーネルが提示する低レベル情報を探索しました。/proc ファイルシステムを調べて生のシステムリソースデータを表示し、/sys ファイルシステムをナビゲートしてシステムデバイスとその属性の構造化された表現を探索しました。これにより、オペレーティングシステムから直接ハードウェア情報を検索し、解釈する方法について包括的な理解が得られました。