はじめに
この実験では、Linux 環境においてハードウェアデバイスを探索、特定、および検査するための不可欠なスキルを習得します。強力なコマンドラインユーティリティを用いたハンズオンを通じて、オペレーティングシステムが物理コンポーネントとどのようにやり取りしているかを理解します。この実験の目的は、システム管理、パフォーマンスチューニング、およびトラブルシューティングに不可欠な、Linux におけるハードウェア管理の基礎知識を構築することです。
まず、lsblk と lshw を使用してブロックデバイスを一覧表示し、ストレージの概要を把握することから始めます。次に、udevadm を使用して、詳細なデバイスプロパティとルールを検査します。その後、PCI および SCSI バスの階層構造を確認し、デバイスがどのように接続されているかを学習します。最後に、/proc および /sys 仮想ファイルシステムを調べることで、カーネルの視点からシステムのハードウェアを包括的に把握し、低レベルのシステム情報に深く踏み込みます。
lsblk と lshw によるブロックデバイスの一覧表示
このステップでは、システムに接続されているブロックデバイスを特定し、一覧表示する方法を学びます。ブロックデバイスとは、ハードディスク、SSD、USB メモリなど、固定サイズのブロック単位でデータを転送するストレージデバイスのことです。ここでは、lsblk と lshw という 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
lsblk と lshw を使い分けることで、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_MODEL、ID_VENDOR、一意の ID_SERIAL など、貴重な詳細情報が得られます。これらのプロパティは、カーネルによって検出された順序に関係なく、特定のデバイスに適用される udev ルールを記述するためによく使用されます。
さらに詳細な階層ビューを表示するには、sysfs パスを使用してデバイスを照会できます。まず、/dev/vda の sysfs パスを確認します。
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 はシステムのデバイスモデルをより構造化された形で提供します。これは、カーネルオブジェクト、デバイス、およびドライバの階層的な表現をエクスポートします。lsblk や udevadm など、これまでのステップで使用したツールの多くは、/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 バイトセクタ単位でのデバイスのサイズを表しています。また、vda1、vda2、vda3 などの各パーティションのディレクトリもあり、それぞれに独自の属性セットが含まれています。
次に、/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 ファイルシステムをナビゲートしてシステムのデバイスとその属性の構造化された表現を探索しました。これにより、オペレーティングシステムから直接ハードウェア情報を見つけ出し、解釈する方法を包括的に理解することができました。



