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

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

はじめに

この実験では、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
                                 /

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

  • 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 ルールを作成する前に特に役立ちます。

前のステップで特定したメインディスク /dev/vda のプロパティを検査してみましょう。

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

udevadm info -q property -n /dev/vda

出力は、デバイスを記述する環境変数のリストになります。

DEVPATH=/devices/pci0000:00/0000:00:04.0/virtio1/block/vda
DEVNAME=/dev/vda
DEVTYPE=disk
MAJOR=252
MINOR=0
SUBSYSTEM=block
USEC_INITIALIZED=xxxxxxxxx
ID_VENDOR=Virtio
ID_MODEL=Block_Device
ID_MODEL_ENC=Block\x20Device\x20\x20\x20\x20\x20\x20\x20
ID_REVISION=
ID_SERIAL=Virtio_Block_Device
ID_SERIAL_SHORT=Block_Device
ID_TYPE=disk
ID_BUS=virtio
ID_PATH=pci-0000:00:04.0-virtio-1
ID_PATH_TAG=pci-0000_00_04_0-virtio-1
DEVLINKS=/dev/disk/by-id/virtio-Block_Device /dev/disk/by-path/pci-0000:00:04.0-virtio-1
TAGS=:systemd:

この出力からは、ID_MODELID_VENDOR、一意の ID_SERIAL など、貴重な詳細情報が得られます。これらのプロパティは、カーネルによって検出された順序に関係なく、特定のデバイスに適用される udev ルールを記述するためによく使用されます。

さらに詳細な階層ビューを表示するには、sysfs パスを使用してデバイスを照会できます。まず、/dev/vdasysfs パスを確認します。

udevadm info -q path -n /dev/vda

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

/devices/pci0000:00/0000:00:04.0/virtio1/block/vda

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

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

このコマンドは非常に長い出力を生成し、ブロックデバイス自体の属性だけでなく、その親である virtio デバイスや 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 バスの階層をツリー構造で表示するには、lspci コマンドに -t オプションを付けて使用します。

lspci -t

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

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

このツリーは接続を示していますが、デバイスが何であるかは示していません。より実用的にするために、-v (verbose) オプションを追加します。これにより、デバイス名と各デバイスで使用されているカーネルドライバが含まれるようになります。出力が長くなる可能性があるため、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.1  Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
           +-01.3  Intel Corporation 82371AB/EB/MB PIIX4 ACPI
           +-04.0  Red Hat, Inc. Virtio block device
           \-05.0  Red Hat, Inc. Virtio network device

この出力から、IDE コントローラや Virtio デバイスなど、PCI バスに接続されている具体的なハードウェアコンポーネントを確認できます。

次に、SCSI バスを見てみましょう。この仮想環境では、ハードディスク /dev/vda は Virtio ブロックデバイスとして提示されていますが、SCSI デバイスが存在すれば探索可能です。この情報を表示する使いやすい方法は systool コマンドです。これを提供する sysfsutils パッケージをインストールしましょう。

sudo apt-get install -y sysfsutils

次に、systool-b scsi オプションを付けて、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

出力には、ループデバイスやメインディスク vda を含むブロックデバイスが表示されます。これらが /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 vda -> ../devices/pci0000:00/0000:00:04.0/virtio1/block/vda

次に、vda デバイスのディレクトリを調べてみましょう。このディレクトリには、デバイスの属性を表すさまざまなファイルが含まれています。

ls /sys/block/vda

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

alignment_offset  bdi  capability  dev  device  discard_alignment  events  events_async  events_poll_msecs  ext_range  holders  inflight  integrity  power  queue  range  removable  ro  vda1  vda2  vda3  size  slaves  stat  subsystem  trace  uevent

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

cat /sys/block/vda/size

出力は数値になります。

83886080

この数値は、512 バイトセクタ単位でのデバイスのサイズを表しています。また、vda1vda2vda3 などの各パーティションのディレクトリもあり、それぞれに独自の属性セットが含まれています。

次に、/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

ディスク /dev/vda が Virtio ブロックデバイスであることを知っているので、/sys/bus/virtio/devices ディレクトリの中を見てみましょう。ここには、検出されたすべての Virtio デバイスがリストされます。

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 コマンドを使用してより詳細なハードウェア仕様を取得する練習を行いました。また、udevadm を使用して udev サブシステムによって管理されるデバイスプロパティを検査する方法や、PCI および SCSI デバイスのシステムバス階層を表示する方法についても学習しました。

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