はじめに
この実験では、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
/
VMイメージによっては、プライマリディスク名が vda、sda、または 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
lsblk と lshw を使用することで、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_MODEL、ID_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 はシステムのデバイスモデルのより構造化されたビューを提供します。これは、カーネルオブジェクト、デバイス、ドライバーの階層的な表現をエクスポートします。前のステップで使用した lsblk や udevadm などのツールの多くは、/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バイトセクター単位でのデバイスサイズを表しています。また、nvme0n1p1、nvme0n1p2、nvme0n1p3 のような各パーティションのディレクトリもあり、それぞれ独自の属性セットが含まれています。他のイメージでは、パーティション名に異なるデバイスプレフィックスが使用される場合があります。
次に、/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 ファイルシステムをナビゲートしてシステムデバイスとその属性の構造化された表現を探索しました。これにより、オペレーティングシステムから直接ハードウェア情報を検索し、解釈する方法について包括的な理解が得られました。



