11.6 udevルールを処理するカーネルデバイスイベントへの影響

udevルールは、カーネルがイベント自体に追加するすべてのプロパティ、またはカーネルがsysfsにエクスポートするすべての情報と一致します。また、この規則で、外部プログラムからの追加情報を要求することもできます。各イベントは、指定されたすべての規則と一致します。すべての規則は、/etc/udev/rules.dディレクトリにあります。

規則ファイル内の各行には、少なくとも1つのキー値ペアが含まれています。これらは、一致と割り当てキーという2種類のキーです。すべての一致キーが各値と一致する場合、その規則が適用され、割り当てキーに指定された値が割り当てられます。一致する規則がある場合、デバイスノードの名前を指定、ノードを指すシンボリックリンクを追加、またはイベント処理の一部として指定されたプログラムを実行できます。一致する規則がない場合、デフォルトのデバイスノード名を使用して、デバイスノードが作成されます。データのマッチまたはインポートのためのルール構文およびキーの詳細については、udevのマニュアルページで説明されています。以下に示す規則の例では、udevルール構文の基本を紹介します。これらの規則の例は、すべて、/etc/udev/rules.d/50-udev-default.rulesにあるudevデフォルトルールセットに含まれています。

例 11-1 udevルールの例

# console
KERNEL=="console", MODE="0600", OPTIONS="last_rule"

# serial devices
KERNEL=="ttyUSB*", ATTRS{product}=="[Pp]alm*Handheld*", SYMLINK+="pilot"

# printer
SUBSYSTEM=="usb", KERNEL=="lp*", NAME="usb/%k", SYMLINK+="usb%k", GROUP="lp"

# kernel firmware loader
SUBSYSTEM=="firmware", ACTION=="add", RUN+="firmware.sh"

consoleルールは、3つのキーで構成されています。その内訳は、一致キーが1つ(KERNEL)、割り当てキーが2つ(MODEOPTIONS)です。KERNEL一致ルールはconsoleタイプのアイテムをデバイスリストから検索します。正確な一致だけが有効であり、このルールの実行をトリガします。MODEキーは、特別パーミッションをデバイスノードに割り当てます。この例では、読み取り/書き込みパーミッションをこのデバイスの所有者にのみ割り当てます。OPTIONSキーは、この規則をこのタイプのデバイスに適用される最後の規則にします。以降の規則は、この特定デバイスタイプとマッチしても、どのような結果も生じません。

serial devicesルールは、50-udev-default.rulesには存在しなくなりましたが、依然その知識は重要です。この規則は、2つの一致キー(KERNELATTRS)および1つの割り当てキー(SYMLINK)で構成されます。KERNELキーは、ttyUSBタイプのすべてのデバイスを検索します。このキーで*ワイルドカードを使用すると、これらのデバイスのいくつかとマッチします。2つ目の一致キーATTRSは、ttyUSBデバイスのsysfsにあるproduct属性ファイルに一定の文字列が含まれているかどうかをチェックします。割り当てキー(SYMLINK)は、/dev/pilotの下に、このデバイスへのシンボリックリンクを追加します。このキーで演算子(+=)を使用すると、前/後の規則が他のシンボリックリンクを追加した場合でも、udevはこの操作を追加実行します。この規則は、2つの一致キーを含むので、両方の条件が満たされる場合のみ適用されます。

printerルールは、USBプリンタを対象とし、2つの一致キー(SUBSYSTEMKERNEL)を含みます。規則全体を適用するには、これらのキーを両方とも適用する必要があります。3つの割り当てキーは、このデバイスタイプの名前付け(NAME)、シンボリックデバイスリンクの作成、(SYMLINK)、およびこのデバイスタイプのグループメンバーシップ(GROUP)を処理します。KERNELキーで*ワイルドカードを使用すると、いくつかのlpプリンタデバイスとマッチします。NAMEおよびSYMLINKの両キーで置き換えを使用すると、これらの文字列を内部デバイス名で拡張できます。たとえば、最初のlp USBプリンタへのシンボリックリンクは/dev/usblp0となります。

kernel firmware loaderルールでは、ランタイム時の外部ヘルパースクリプトで、udevが追加ファームウェアをロードします。SUBSYSTEM一致キーは、firmwareサブシステムを検索します。ACTIONキーは、firmwareサブシステムに属するデバイスが追加されているかどうかをチェックします。RUN+=キーは、firmware.shスクリプトの実行をトリガして、ファームウェアを見つけます。

すべての規則に共通する一般的特性は次の通りです。

11.6.1 udevルールでの演算子の使用

キーを作成する場合は、作成するキーのタイプによって、いくつかの異なる演算子から選択できます。一致キーは、通常、検索値とマッチするか、明示的にミスマッチする値を見つけるためにだけ使用されます。一致キーは、次の演算子のいずれかを含みます。

==

等価の比較。キーに検索パターンが含まれている場合は、そのパターンと一致するすべての結果が有効です。

!=

非等価の比較。キーに検索パターンが含まれている場合は、そのパターンと一致するすべての結果が有効です。

割り当てキーでは、次のどの演算子でも使用できます。

=

値をキーに割り当てます。既に値のリストで構成されているキーはリセットされ、指定した1つの値だけが割り当てられます。

+=

エントリのリストを含むキーに値を追加します。

:=

最終値を割り当てます。以降の規則による変更は許可されません。

11.6.2 udevルールでの置換の使用

udevルールは、プレースホルダと置換の使用をサポートします。それらは、他のスクリプトでの使用と同様な方法で使用します。udevルールでは、次の置換を使用できます。

%r$root

デフォルトのデバイスディレクトリ/dev

%p$devpath

DEVPATHの値。

%k$kernel

KERNELの値または内部デバイス名。

%n$number

デバイス番号。

%N$tempnode

デバイスファイルの一時名。

%M$major

デバイスのメジャー番号。

%m$minor

デバイスのマイナー番号。

%s{attribute}$attr{attribute}

sysfs属性の値(attributeで指定)。

%E{variable}$attr{variable}

環境変数の値(variableで指定)。

%c$result

PROGRAMの出力。

%%

%文字。

$$

$文字。

11.6.3 udev一致キーの使用

一致キーは、udevルールの適用前に満たす必要のある条件を記述します。次の一致キーが使用可能です。

ACTION

イベント動作の名前。たとえば、addまたはremove(デバイスの追加または削除の場合)。

DEVPATH

イベントデバイスのデバイスパス。たとえば、DEVPATH=/bus/pci/drivers/ipw3945(ipw3945ドライバに関連するすべてのイベントを検索する場合)。

KERNEL

イベントデバイスの内部(カーネル)名。

SUBSYSTEM

イベントデバイスのサブシステム。たとえば、SUBSYSTEM=usb(USBデバイスに関連するすべてのイベント用)。

ATTR{filename}

イベントデバイスのsysfs属性。vendor属性ファイル名に含まれた文字列とマッチするには、たとえば、ATTR{vendor}=="On[sS]tream"を使用できます。

KERNELS

デバイスパスを上方に検索して、一致するデバイス名を見つけます。

SUBSYSTEMS

デバイスパスを上方に検索して、一致するデバイスサブシステム名を見つけます。

DRIVERS

デバイスパスを上方に検索して、一致するデバイスドライバ名を見つけます。

ATTRS{filename}

デバイスパスを上方に検索して、一致するsysfs属性値を持つデバイスを見つけます。

ENV{key}

環境変数の値。たとえば、ENV{ID_BUS}="ieee1394でFireWire bus IDに関連するすべてのイベントを検索します。

PROGRAM

外部プログラムを実行します。成功の場合は、プログラムが終了コードとしてゼロを返します。stdoutに印刷されるプログラムの出力は、RESULTキーで使用できます。

RESULT

最後のPROGRAM呼び出しの出力文字列とマッチします。このキーは、PROGRAMキーと同じ規則に含めるか、それ以降のキーに含めてください。.

11.6.4 udev割り当てキーの使用

上記で説明した一致キーとは対照的に、割り当てキーは、満たすべき条件を記述しません。割り当てキーは、udevにより保守されるデバイスノードに値、名前、および動作を割り当てます。

NAME

作成するデバイスノードの名前。いったん規則でノード名が設定されると、このノードのNAMEキーを持つ他の規則はすべて無視されます。

SYMLINK

作成するノードに関連するシンボリックリンクの名前。複数の一致ルールで、デバイスノードとともに作成するシンボリックリンクを追加できます。1つのルール内で、スペース文字でシンボリックリンク名を区切ることで、1つのノードに複数のシンボリックリンクを指定することもできます。

OWNER、GROUP、MODE

新しいデバイスノードのパーミッションここで指定する値は、既にコンパイルされている値を上書きします。

ATTR{key}

イベントデバイスのsysfs属性に書き込む値を指定します。==演算子を使用すると、このキーは、sysfs属性の値とのマッチングにも使用されます。

ENV{key}

環境への変数のエクスポートをudevに指示します。==演算子を指定すると、このキーは、環境変数とのマッチングにも使用されます。

RUN

このデバイスに対して実行されるプログラムのリストにプログラムを追加するように、udevに指示します。このデバイスのイベントをブロックしないようにするため、これは非常に短いタスクに限定してください。

LABEL

GOTOのジャンプ先にするラベルを追加します。

GOTO

いくつかの規則をスキップし、GOTOキーで参照されるラベルを含む規則から続行するように、udevに指示します。

IMPORT{type}

変数をイベント環境(外部プログラムの出力など)にロードします。udevは、いくつかの異なるタイプの変数をインポートします。タイプが指定されていない場合、udevは、ファイルパーミションの実行可能ビットに基づいてタイプを決定しようとします。

  • program - 外部プログラムを実行し、その出力をインポートします。

  • file - テキストファイルをインポートします。

  • parent - 親デバイスから保存されたキーをインポートします。

WAIT_FOR_SYSFS

一定のデバイスに指定されたsysfsファイルが作成されるまで、udevを待機させます。たとえば、WAIT_FOR_SYSFS="ioerr_cnt"では、ioerr_cntファイルが作成されるまで、udevを待機させます。

オプション

OPTIONキーには、次の可能な値があります。

  • last_rule - 以降のすべての規則を無視します。

  • ignore_device - このイベントを完全に無視します。

  • ignore_remove - このデバイスの以降のすべての削除イベントを無視します。

  • all_partitions - ブロックデバイス上のすべての使用可能なパーティションにデバイスノードを作成します。