第32章 ホットプラグシステム

目次

32.1. デバイスとインタフェース
32.2. ホットプラグイベント
32.3. ホットプラグデバイスの設定
32.4. 自動的なモジュール読み込み
32.5. ブートスクリプトcoldplug
32.6. エラーの解析

概要

ホットプラグシステムでコンピュータのほとんどのデバイスの初期化を管理します。ホットプラグシステムは、稼動中に取り付け/取り外しできるデバイスに使用されるだけでなく、システムのブート中に検出されるすべてのデバイスにも使用されます。また、sysfsファイルシステムやudev(章 33. udevをもつ動的デバイスノードを参照)と密接に連携します。

カーネルのブートが完了するまでは、バスシステム、ブートディスク、およびキーボードのような絶対に必要なデバイスだけが初期化されます。カーネルは、検出されたすべてのデバイスのホットプラグイベントをトリガします。udevdデーモンはこれらのイベントをリスンしてudevを実行し、デバイスノードを作成してデバイスを設定します。旧式のISAカードなど、自動的に検出することができないデバイスの場合には、静的な設定が使用されます。

過去の少数の例外を除き、ほとんどのデバイスは、システムのブート時またはデバイスの接続時にアクセス可能になり次第、すぐに初期化されます。初期化中に、インタフェースはカーネルに登録されます。この登録によって、それぞれのインタフェースを自動的に設定させるためのホットプラグイベントがさらにトリガされます。

SUSE Linuxの以前のバージョンでは、デバイスを初期化する基礎として一連の静的な設定データが使用されていました。ホットプラグイベントは、エージェントと呼ばれる個別のスクリプトで処理されました。SUSE Linuxのこのリリースでは、 ホットプラグサブシステムがudevに統合され、以前のホットプラグエージェントの機能はudevルールによって提供されるようになりました。

ホットプラグサブシステムの一般設定は、/etc/sysconfig/hotplugに記述されています。すべての変数にはコメントが付いています。一般的なデバイス設定は、/etc/udev/rules.dで見つかった、一致するルールに基づいて行われます(章 33. udevをもつ動的デバイスノードを参照)。特定のデバイスの設定ファイルは、/etc/sysconfig/hardware内に配置されます。以前のバージョンのSUSE Linuxで用いられていたホットプラグイベントコールバックについては、/proc/sys/kernel/hotplugは通常空白です。udevdはホットプラグメッセージをnetlinkソケットから受け取るからです。

32.1. デバイスとインタフェース

ホットプラグシステムでは、デバイスだけでなくインタフェースも設定します。デバイスは通常、バスに接続され、インタフェースで必要とされる機能を提供します。インタフェースは、デバイス全体、またはデバイスの特定のサブセットの、ユーザーから見える抽象化となっています。デバイスが正しく動作するためには、通常、カーネルモジュールの形式でのデバイスドライバを必要とします。加えて、ユーザにインタフェースを提供するために、より高いレベルの特定のドライバが必要になることもあります。ほとんどのインタフェースは、udevによって作成されたデバイスノードで表されます。全体的な概念を把握するには、デバイスとインタフェースを区別することが重要です。

sysfsファイルシステム内に入力されたデバイスは、/sys/devices内で見つかります。インタフェースは、/sys/classまたは/sys/blockの下に配置されています。sysfs内のすべてのインタフェースには、それぞれのデバイスへのリンクが必要です。ただし、このリンクを自動的に追加しないドライバもあります。該当するリンクがない場合は、このインタフェースがどのデバイスに属しているかが不明なので、適切な設定を検索することができません。

デバイスのアドレス指定には、デバイス記述が使用されます。これには、sysfs内のデバイスパス(/sys/devices/pci0000:00/0000:00:1e.0/0000:02:00.0)、接続ポイントの記述(bus-pci-0000:02:00.0)、および個々のID (id-32311AE03FB82538)などがあります。従来、インタフェースは名前で処理されていました。こうした名前は既存のデバイスの単純な番号を表しており、デバイスが追加または削除されると変更されることがありました。

関連デバイスの記述を使用してインタフェースをアドレス指定することもできます。通常、コンテキストは、記述がデバイス自体を指すのか、またはそのインタフェースを指すのかを示します。デバイス、インタフェース、および記述の標準的な例として、次のものを挙げることができます。

PCIネットワークカード

PCIバス(/sys/devices/pci0000:00/0000:00:1e.0/0000:02:00.0またはbus-pci-0000:02:00.0)に接続され、ネットワークインタフェース(eth0id-00:0d:60:7f:0b:22またはbus-pci-0000:02:00.0)を持つ1つのデバイス。ネットワークインタフェースはネットワークサービスに使用されるか、トンネルやVLANなど、インタフェースを持つ仮想ネットワークデバイスに接続されます。

PCI SCSIコントローラ

複数の物理インタフェースをバス(/sys/class/scsi_host/host1)の形式で使用可能にする1つのデバイス(/sys/devices/pci0000:20/0000:20:01.1/host1/1:0:0:0またはbus-scsi-1:0:0:0)。

SCSIハードディスク

複数のインタフェース(/sys/block/sda*)を使用する1つのデバイス(/sys/devices/pci0000:20/0000:20:01.1/host1/1:0:0:0またはbus-scsi-1:0:0:0)。