A.3. デバイスマッパーの udev デバイスマネージャサポート

udev デバイスマネージャーの主な役割は、/dev ディレクトリー内でノードを設定する動的な手段を提供することです。これらのノードの作成は、ユーザースペースで udev ルールを適用することによって実行されます。これらのルールは、特定のデバイスを追加、削除、または変更した結果、カーネルから直接送信される udev イベント上で処理されます。これはホットプラグサポートの便利な中央メカニズムを提供します。
udev デバイスマネージャーは、実際のノードを作成するだけでなく、ユーザーによる名前付けが可能なシンボリックリンクも作成できます。これによりユーザーは、独自のカスタマイズされた名前付け、および /dev ディレクトリーのディレクトリー構造を必要に応じて自由に選択できるようになります。
それぞれの udev イベントには、処理されるデバイスに関する基本情報が含まれます。これには、デバイスの名前、デバイスが属するサブシステム、デバイスのタイプ、使用されているメジャーとマイナーの番号、イベントのタイプなどが含まれます。udev ルール内でもアクセス可能な /sys ディレクトリー内のすべての情報にアクセスする可能性があることを考慮すると、ユーザーはこの情報に基づく単純なフィルターを利用し、この情報に基づいて条件付きでルールを実行することができます。
udev デバイスマネージャーは、ノードのパーミッション設定の一元化された方法も提供します。ユーザーはカスタマイズされたルールセットを簡単に追加し、イベント処理中に入手可能な情報のいずれかのビットで指定する、任意のデバイスのパーミッションを定義することができます。
udev ルール内にプログラムのフックを直接追加することも可能です。udev デバイスマネージャーは、これらのプログラムを呼び出して、イベントを処理するために必要とされる追加処理を行うことができます。さらにプログラムは、この処理の結果として、環境変数をエクスポートすることもできます。追加の情報源として、任意の結果をルール内で追加で使用することが可能です。
udev ライブラリーを使用するソフトウェアは、入手可能なすべての情報とともに、udev イベントを受信し、処理することができます。このため、処理は、udev デーモンのみにバインドされません。

A.3.1. udev のデバイスマッパーとの統合

デバイスマッパーは udev 統合に対して直接のサポートを提供します。これによって、デバイスマッパーは、LVM デバイスを含むデバイスマッパーデバイスに関連したすべての udev 処理と同期します。udev デーモンにルールを適用する方式は、デバイスの変更元であるプログラム (dmsetup や LVM など) を使用した並列処理であるため、同期が必要です。このサポートがなかったため、前回の変更イベントの結果、引き続きオープンな udev ルールで処理されたデバイスをユーザーが削除しようとする問題が頻繁に発生していました。この問題は、デバイスに対する変更の間隔が短い場合にとくに多く発生していました。
Red Hat Enterprise Linux は、一般的なデバイスマッパーデバイスおよび LVM 向けの udev ルールを正式にサポートしています。表A.1「デバイスマッパーデバイス向けの udev ルール」 は、/lib/udev/rules.d にインストールされているこれらのルールについてまとめています。

表A.1 デバイスマッパーデバイス向けの udev ルール

ファイル名説明
10-dm.rules
一般的なデバイスマッパールールを格納し、/dev/mapper 内に /dev/dm-N をターゲットとするシンボリックリンクを作成します。ここで N は、カーネルによってデバイスに動的に割り当てられる数です (/dev/dm-N はノードです)。
注意: /dev/dm-N ノードは、デバイスにアクセスするスクリプトには 決して 使用されるべきではありません。N の数は動的に割り当てられ、デバイスがどのように有効化される順序とともに変化します。したがって、/dev/mapper ディレクトリー内の真の名前を使用すべきです。このレイアウトは、ノード/シンボリックリンクが作成されるべき方法の要件をサポートします。
11-dm-lvm.rules
LVM デバイス用に適用されるルールを格納し、ボリュームグループの論理ボリュームのシンボリックリンクを作成します。このシンボリックリンクは、/dev/vgnameディレクトリーに、/dev/dm-N をターゲットとして作成されます。
注意: デバイスマッパーサブシステムの今後のすべての命名基準に一致させるには、udev ルールは、11-dm-subsystem_name.rules の形式に従う必要があります。udev を提供する libdevmapper ユーザーはいずれも、この基準に従う必要があります。
13-dm-disk.rules全デバイスマッパーデバイスに適用されるルールを格納し、/dev/disk/by-id ディレクトリーおよび /dev/disk/by-uuid ディレクトリーにシンボリックリンクを作成します。
95-dm-notify.ruleslibdevmapper を使用する待機中のプロセスを通知するルールを格納します。(LVM や dmsetup と同様)。以前の全ルールが適用された後で通知が行われ、udev 処理が確実に完了するようにします。通知されたプロセスは、その後で再開します。
69-dm-lvm-metad.rulesシステムに新たに表示されるブロックデバイスで LVM スキャンをトリガーするためのフックが含まれ、可能な場合は LVM の自動アクティブ化を実行します。これは、lvmetad デーモンをサポートし、lvm.conf ファイルの use_lvmetad=1 で設定されます。クラスター環境では、lvmetad デーモンと自動アクティブ化はサポートされません。
12-dm-permissions.rules ファイルを用いて、カスタマイズされたパーミッションルールをさらに追加することができます。このファイルは /lib/udev/rules ディレクトリーにはインストール されず/usr/share/doc/device-mapper-version ディレクトリーにあります。12-dm-permissions.rules ファイルは、パーミッションの設定方法のヒントが記載されたテンプレートで、一例として取り上げられている一部のマッチングルールをベースとしています。このファイルには、一般的な状況についての例が記載されています。このファイルを編集して、/etc/udev/rules.d ディレクトリーに手動で配置すると、アップデート後もそのまま残り、設定がそのまま維持されます。
これらのルールは、イベントの処理中に、他のルールによっても使用可能なすべての基本的な変数を設定します。
以下の変数は、10-dm.rules で設定されています。
  • DM_NAME: デバイスマッパーデバイスの名前
  • DM_UUID: デバイスマッパーデバイスのUUID
  • DM_SUSPENDED: デバイスマッパーデバイスの停止状態
  • DM_UDEV_RULES_VSN: udev ルールバージョン (これは主に、前述の変数が正式なデバイスマッパールールによって直接設定されていることを、他すべてのルールが確認するためのものです)
以下の変数は、11-dm-lvm.rules で設定されています。
  • DM_LV_NAME: 論理ボリューム名
  • DM_VG_NAME: ボリュームグループ名
  • DM_LV_LAYER: LVM レイヤー名
12-dm-permissions.rules ファイルに文書化されているように、これらの変数すべてを12-dm-permissions.rules ファイル内で使用して、特定のデバイスマッパーデバイスのパーミッションを定義することができます。

A.3.2. udev をサポートするコマンドとインターフェース

表A.2「udev をサポートする dmsetup コマンド」 には、udev の統合をサポートする dmsetup コマンドについてまとめています。

表A.2 udev をサポートする dmsetup コマンド

コマンド説明
dmsetup udevcompleteudev がルールの処理を完了し、待機中のプロセスのロックを解除したことを通知するために使用されます (95-dm-notify.rules 内の udev ルールの中から呼び出されます)。
dmsetup udevcomplete_allデバッグの目的で使用され、待機中の全プロセスのロックを手動で解除します。
dmsetup udevcookiesデバッグの目的で使用され、既存のすべての Cookie (システム全体のセマフォ) を表示します。
dmsetup udevcreatecookieCookie (セマフォ) を手動で作成するのに使用されます。これは、単一の同期リソース下で、より多くのプロセスを実行するのに役立ちます。
dmsetup udevreleasecookie単一の同期 Cookie の下に置かれるすべてのプロセスに関連した、すべての udev 処理を待機するのに使用されます。
udev 統合をサポートする dmsetup オプションは以下のとおりです。
--udevcookie
udev トランザクションに追加したいすべての dmsetup プロセスを対象に定義する必要があります。これは、udevcreatecookie および udevreleasecookie と併用されます。
COOKIE=$(dmsetup udevcreatecookie)
  dmsetup command --udevcookie $COOKIE ....
  dmsetup command --udevcookie $COOKIE ....
  ....
  dmsetup command --udevcookie $COOKIE ....
dmsetup udevreleasecookie --udevcookie $COOKIE
--udevcookie オプションを使用する以外には、プロセスの環境に変数を単にエクスポートできます。
export DM_UDEV_COOKIE=$(dmsetup udevcreatecookie)
  dmsetup command ...
  dmsetup command ...
  ...
  dmsetup command ...
--noudevrules
udev ルールを無効にします。ノード/シンボリックリンクは libdevmapper によって作成されます (以前の方法)。このオプションは、udev が適切に機能しない場合のデバッグを目的としています。
--noudevsync
udev の同期を無効にします。これもデバッグを目的としています。
dmsetup コマンドとそのオプションに関する情報は、dmsetup(8) の man ページを参照してください。
LVM コマンドは、udev の統合に対応した以下のオプションをサポートします。
  • --noudevrules: dmsetup コマンドについて、udev ルールを無効にします。
  • --noudevsync: dmsetup コマンドについて、udev 同期を無効にします。
lvm.conf ファイルには、udev の統合をサポートする以下のオプションが含まれます。
  • udev_rules: すべての LVM2 コマンドを対象に udev_rules をグローバルに有効/無効にします。
  • udev_sync: すべての LVM コマンドを対象に udev 同期をグローバルに有効/無効にします。
lvm.conf ファイルオプションの詳細は、lvm.conf ファイルのインラインコメントを参照してください。