第2章 ハードウェア設定の確認
LPIC-1 101.1 相当
サーバーやPCにどんなハードウェアが接続されているかを、コマンドラインだけで確認する方法を学びます。トラブル対応や初期セットアップで頻繁に使う知識です。
デバイス情報を確認する主なコマンド
| コマンド | 確認できる情報 |
|---|---|
lspci | PCIバスに接続されたデバイス(グラフィックカード、ネットワークカードなど) |
lsusb | USBバスに接続されたデバイス |
lsblk | ブロックデバイス(ディスク・パーティション)の一覧をツリー表示 |
lscpu | CPUの情報(コア数、アーキテクチャなど) |
free -h | メモリの使用状況 |
dmesg | カーネルが出力したメッセージ(起動時のハードウェア認識ログなど) |
$ lsblk
NAME SIZE TYPE MOUNTPOINT
sda 100G disk
├─sda1 1G part /boot
└─sda2 99G part /
/proc と /sys — カーネルが公開する情報
/proc と /sys は、実際のディスク上のファイルではなく、カーネルが動的に生成する疑似ファイルシステムです。ここを読むことで、実行中のシステムの内部状態を確認できます。
$ cat /proc/cpuinfo # CPU情報
processor : 0
vendor_id : GenuineIntel
model name : Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
cpu MHz : 3000.000
cache size : 12288 KB
...(processor: 1以降、論理コアの数だけ同様の情報が繰り返される)
$ cat /proc/meminfo # メモリ情報
MemTotal: 16302184 kB
MemFree: 842916 kB
MemAvailable: 11203344 kB
Buffers: 201344 kB
Cached: 9821456 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
...(この後も多数の項目が続く)
この行のこの値に注目: /proc/cpuinfoは論理コアごとに1つのprocessorブロックを持つため、ブロックの数を数えれば論理コア数が分かります。/proc/meminfoのMemAvailableは、単純な空き容量(MemFree)とは異なり、キャッシュなどを解放すれば実際に新しいプロセスへ割り当てられる見込みのメモリ量を示す、より実態に近い指標です。
udev という仕組みがそれを検知し、/dev 以下にデバイスファイルを自動的に作成します。
ハードウェアの詳細情報を確認する
各コマンドは、オプションを付けることでより詳細な情報を取得できます。
| コマンド | 用途 |
|---|---|
lspci -v | PCIデバイスの詳細情報(使用中のカーネルモジュールなど)を表示 |
lspci -k | 各PCIデバイスに紐づくカーネルドライバ名を表示 |
lsusb -v | USBデバイスの詳細情報(ベンダーID・プロダクトIDなど)を表示 |
dmidecode | BIOS/UEFIが保持するハードウェア情報(マザーボード型番、メモリスロット構成など)を表示 |
カーネルモジュールの管理
デバイスドライバの多くは、必要なときにだけ読み込まれる「カーネルモジュール」として実装されています。
| コマンド | 役割 |
|---|---|
lsmod | 現在読み込まれているカーネルモジュールの一覧を表示 |
modprobe モジュール名 | 依存関係を解決しながらモジュールを読み込む |
modprobe -r モジュール名 | モジュールを取り外す |
lsmod | grep モジュール名 | 特定のモジュールが読み込まれているか確認 |
coldplugとhotplug
ハードウェアがシステムに認識されるタイミングには2種類の考え方があります。
- hotplug: システム稼働中に接続したデバイスを、udevがその場で検知して即座に認識する方式(USBメモリの抜き差しなど)。
- coldplug: システム起動時にすでに接続されていたデバイスを、起動処理の一環としてまとめて認識する方式。
udevadm info や udevadm monitor を使うと、udevが実際にどのようなデバイスイベントを検知しているかをリアルタイムで確認できます。
lspciの出力を読む
実際の lspci の出力は、先頭に「バス番号:デバイス番号.機能番号」、続けてデバイスの種類とベンダー名・製品名が並びます。
$ lspci
00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge
00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630
02:00.0 Ethernet controller: Intel Corporation Ethernet Connection I219-V
特定のデバイスだけ調べたいときは grep と組み合わせるのが定番です。
$ lspci | grep -i ethernet # ネットワークカードの型番を確認
02:00.0 Ethernet controller: Intel Corporation Ethernet Connection I219-V
$ lspci -k -s 02:00.0 # バス番号を指定して特定デバイスの詳細・使用ドライバを確認
02:00.0 Ethernet controller: Intel Corporation Ethernet Connection I219-V
Subsystem: Dell Ethernet Connection I219-V
Kernel driver in use: e1000e
Kernel modules: e1000e
この行のこの値に注目: Kernel driver in useの行が、そのデバイスを実際に制御しているドライバ名です。ネットワークカードが認識されない・動作がおかしいといったトラブルでは、まずこの行を確認し、ドライバが正しく割り当てられているか、意図したモジュール(この例ではe1000e)になっているかを調べます。
より詳細な情報を得るためのツール
| コマンド | 用途 |
|---|---|
lshw | CPU・メモリ・ディスク・ネットワークなど、システム全体のハードウェア構成をまとめて表示(要インストールなことが多い) |
hwinfo | lshwと同様に詳細なハードウェア情報を表示する別実装のツール |
lsblk -f | ブロックデバイスにファイルシステムの種類やUUID、ラベルを付加して表示 |
inxi -Fx | ハードウェア情報を人間が読みやすい形にまとめて表示(デスクトップ環境でよく使われる) |
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda1 vfat 1234-ABCD /boot/efi
└─sda2 ext4 5678-90ab-cdef-1234-567890abcdef /
/procでよく見るファイルの補足
/procには他にも実務でよく参照されるファイルがあります。
| パス | 内容 |
|---|---|
/proc/interrupts | 各デバイスが発生させている割り込み(IRQ)の回数 |
/proc/modules | 現在読み込まれているカーネルモジュール(lsmodの出力元) |
/proc/partitions | 認識されているブロックデバイス・パーティションの一覧 |
/proc/version | カーネルのバージョン情報 |
/procや/sysの中身は「今動いているカーネルが作り出している情報」であり、テキストエディタで編集しても再起動すれば消えます。恒久的な設定変更をしたい場合は/etc以下の設定ファイルやsysctlの設定(/etc/sysctl.confなど)を使う必要があります。
lsmod / modprobe — カーネルモジュールの管理
ハードウェアを動かすためのドライバの多くは、カーネル本体に組み込まれているのではなく、必要になったタイミングで動的に読み込まれるカーネルモジュールという形で提供されています。現在読み込まれているモジュールの一覧はlsmodで確認でき、これは前述の/proc/modulesの内容を読みやすく整形したものです。特定のモジュールを手動で読み込みたい・外したい場合は、それぞれmodprobe モジュール名・modprobe -r モジュール名を使います。新しいUSB機器を接続したのに認識しない、といったハードウェアトラブルの調査では、「対応するモジュールがそもそも読み込まれているか」をlsmod | grep 名前で確認するのが定番の初手です。
modprobeで読み込んだモジュールは、そのままでは再起動すると消えてしまいます。次回起動時にも自動で読み込ませたい場合は、モジュール名を/etc/modules(Debian系)や/etc/modules-load.d/*.confに1行ずつ記述しておきます。逆に、特定のモジュールが自動で読み込まれるのを防ぎたい場合(トラブルの原因になっているドライバを一時的に無効化したいときなど)は、/etc/modprobe.d/blacklist.confにモジュール名を記載しておくブラックリスト機能を使います。