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つ(MODE、OPTIONS)です。KERNEL一致ルールはconsoleタイプのアイテムをデバイスリストから検索します。正確な一致だけが有効であり、このルールの実行をトリガします。MODEキーは、特別パーミッションをデバイスノードに割り当てます。この例では、読み取り/書き込みパーミッションをこのデバイスの所有者にのみ割り当てます。OPTIONSキーは、この規則をこのタイプのデバイスに適用される最後の規則にします。以降の規則は、この特定デバイスタイプとマッチしても、どのような結果も生じません。
serial devicesルールは、50-udev-default.rulesには存在しなくなりましたが、依然その知識は重要です。この規則は、2つの一致キー(KERNEL、ATTRS)および1つの割り当てキー(SYMLINK)で構成されます。KERNELキーは、ttyUSBタイプのすべてのデバイスを検索します。このキーで*ワイルドカードを使用すると、これらのデバイスのいくつかとマッチします。2つ目の一致キーATTRSは、ttyUSBデバイスのsysfsにあるproduct属性ファイルに一定の文字列が含まれているかどうかをチェックします。割り当てキー(SYMLINK)は、/dev/pilotの下に、このデバイスへのシンボリックリンクを追加します。このキーで演算子(+=)を使用すると、前/後の規則が他のシンボリックリンクを追加した場合でも、udevはこの操作を追加実行します。この規則は、2つの一致キーを含むので、両方の条件が満たされる場合のみ適用されます。
printerルールは、USBプリンタを対象とし、2つの一致キー(SUBSYSTEM、KERNEL)を含みます。規則全体を適用するには、これらのキーを両方とも適用する必要があります。3つの割り当てキーは、このデバイスタイプの名前付け(NAME)、シンボリックデバイスリンクの作成、(SYMLINK)、およびこのデバイスタイプのグループメンバーシップ(GROUP)を処理します。KERNELキーで*ワイルドカードを使用すると、いくつかのlpプリンタデバイスとマッチします。NAMEおよびSYMLINKの両キーで置き換えを使用すると、これらの文字列を内部デバイス名で拡張できます。たとえば、最初のlp USBプリンタへのシンボリックリンクは/dev/usblp0となります。
kernel firmware loaderルールでは、ランタイム時の外部ヘルパースクリプトで、udevが追加ファームウェアをロードします。SUBSYSTEM一致キーは、firmwareサブシステムを検索します。ACTIONキーは、firmwareサブシステムに属するデバイスが追加されているかどうかをチェックします。RUN+=キーは、firmware.shスクリプトの実行をトリガして、ファームウェアを見つけます。
すべての規則に共通する一般的特性は次の通りです。
各規則は、カンマで区切られた1つ以上のキー値ペアで構成されます。
キーの動作は、演算子で決定されます。udevルールは、いくつかの異なる演算子をサポートします。
指定する各値は、引用符で囲む必要があります。
規則ファイルの各行が1つの規則に相当します。規則が1行を超える場合は、shell構文のように、\を使用して異なる行を結合してください。
udevルールは、shell型パターンをサポートします。このパターンは、*、?、および[]の各パターンとマッチします。
udevルールは、置換をサポートします。
キーを作成する場合は、作成するキーのタイプによって、いくつかの異なる演算子から選択できます。一致キーは、通常、検索値とマッチするか、明示的にミスマッチする値を見つけるためにだけ使用されます。一致キーは、次の演算子のいずれかを含みます。
等価の比較。キーに検索パターンが含まれている場合は、そのパターンと一致するすべての結果が有効です。
非等価の比較。キーに検索パターンが含まれている場合は、そのパターンと一致するすべての結果が有効です。
割り当てキーでは、次のどの演算子でも使用できます。
値をキーに割り当てます。既に値のリストで構成されているキーはリセットされ、指定した1つの値だけが割り当てられます。
エントリのリストを含むキーに値を追加します。
最終値を割り当てます。以降の規則による変更は許可されません。
udevルールは、プレースホルダと置換の使用をサポートします。それらは、他のスクリプトでの使用と同様な方法で使用します。udevルールでは、次の置換を使用できます。
デフォルトのデバイスディレクトリ/dev。
DEVPATHの値。
KERNELの値または内部デバイス名。
デバイス番号。
デバイスファイルの一時名。
デバイスのメジャー番号。
デバイスのマイナー番号。
sysfs属性の値(attributeで指定)。
環境変数の値(variableで指定)。
PROGRAMの出力。
%文字。
$文字。
一致キーは、udevルールの適用前に満たす必要のある条件を記述します。次の一致キーが使用可能です。
イベント動作の名前。たとえば、addまたはremove(デバイスの追加または削除の場合)。
イベントデバイスのデバイスパス。たとえば、DEVPATH=/bus/pci/drivers/ipw3945(ipw3945ドライバに関連するすべてのイベントを検索する場合)。
イベントデバイスの内部(カーネル)名。
イベントデバイスのサブシステム。たとえば、SUBSYSTEM=usb(USBデバイスに関連するすべてのイベント用)。
イベントデバイスのsysfs属性。vendor属性ファイル名に含まれた文字列とマッチするには、たとえば、ATTR{vendor}=="On[sS]tream"を使用できます。
デバイスパスを上方に検索して、一致するデバイス名を見つけます。
デバイスパスを上方に検索して、一致するデバイスサブシステム名を見つけます。
デバイスパスを上方に検索して、一致するデバイスドライバ名を見つけます。
デバイスパスを上方に検索して、一致するsysfs属性値を持つデバイスを見つけます。
環境変数の値。たとえば、ENV{ID_BUS}="ieee1394でFireWire bus IDに関連するすべてのイベントを検索します。
外部プログラムを実行します。成功の場合は、プログラムが終了コードとしてゼロを返します。stdoutに印刷されるプログラムの出力は、RESULTキーで使用できます。
最後のPROGRAM呼び出しの出力文字列とマッチします。このキーは、PROGRAMキーと同じ規則に含めるか、それ以降のキーに含めてください。.
上記で説明した一致キーとは対照的に、割り当てキーは、満たすべき条件を記述しません。割り当てキーは、udevにより保守されるデバイスノードに値、名前、および動作を割り当てます。
作成するデバイスノードの名前。いったん規則でノード名が設定されると、このノードのNAMEキーを持つ他の規則はすべて無視されます。
作成するノードに関連するシンボリックリンクの名前。複数の一致ルールで、デバイスノードとともに作成するシンボリックリンクを追加できます。1つのルール内で、スペース文字でシンボリックリンク名を区切ることで、1つのノードに複数のシンボリックリンクを指定することもできます。
新しいデバイスノードのパーミッションここで指定する値は、既にコンパイルされている値を上書きします。
イベントデバイスのsysfs属性に書き込む値を指定します。==演算子を使用すると、このキーは、sysfs属性の値とのマッチングにも使用されます。
環境への変数のエクスポートをudevに指示します。==演算子を指定すると、このキーは、環境変数とのマッチングにも使用されます。
このデバイスに対して実行されるプログラムのリストにプログラムを追加するように、udevに指示します。このデバイスのイベントをブロックしないようにするため、これは非常に短いタスクに限定してください。
GOTOのジャンプ先にするラベルを追加します。
いくつかの規則をスキップし、GOTOキーで参照されるラベルを含む規則から続行するように、udevに指示します。
変数をイベント環境(外部プログラムの出力など)にロードします。udevは、いくつかの異なるタイプの変数をインポートします。タイプが指定されていない場合、udevは、ファイルパーミションの実行可能ビットに基づいてタイプを決定しようとします。
program - 外部プログラムを実行し、その出力をインポートします。
file - テキストファイルをインポートします。
parent - 親デバイスから保存されたキーをインポートします。
一定のデバイスに指定されたsysfsファイルが作成されるまで、udevを待機させます。たとえば、WAIT_FOR_SYSFS="ioerr_cnt"では、ioerr_cntファイルが作成されるまで、udevを待機させます。
OPTIONキーには、次の可能な値があります。
last_rule - 以降のすべての規則を無視します。
ignore_device - このイベントを完全に無視します。
ignore_remove - このデバイスの以降のすべての削除イベントを無視します。
all_partitions - ブロックデバイス上のすべての使用可能なパーティションにデバイスノードを作成します。