udev は、Linux カーネルのデバイス マネージャーです。 Udev は、起動時にすべてのタイプのデバイスの /dev ディレクトリにデバイス ノード ファイルを動的に作成または削除します。 systemd RPM パッケージに含まれる「udev」ファイル名を見るとわかるように、udev は systemd の一部になりました。
# rpm -ql systemd | grep udev /etc/udev /etc/udev/hwdb.bin /etc/udev/rules.d /etc/udev/udev.conf /usr/bin/udevadm ...
Udev デーモン、systemd-udevd は、デバイスがシステムに追加またはシステムから削除されるたびに、カーネルから直接デバイス uevent を受け取ります。イベントごとに、systemd-udevd は Udev ルールで指定された一致する命令を実行します。
障害が原因でディスクがシステムから取り外されると、デバイス ファイル名が変更される場合があります。たとえば、デバイスは起動時に /dev/sda、/dev/sdb、および /dev/sdc という名前になります。しかし、次の再起動時に /dev/sdb が失敗し、以前は /dev/sdc だったものが /dev/sdb という名前になります。 /dev/sdb への構成参照には、元々 /dev/sdc によって参照されていたコンテンツが含まれるようになりました。
このような状況を回避するための解決策は、再起動によってデバイスの一貫した名前を保証することです。永続的な名前を作成し、これらの名前をファイル システム マウント テーブル /etc/fstab で使用するか、mount コマンドの引数として使用するように Udev を構成できます。
Udev ルール ファイルとディレクトリ
Udev ルールは、デバイスを識別する方法と、再起動またはディスクの変更によって永続的な名前を割り当てる方法を決定します。 Udev がデバイス イベントを受信すると、構成されたルールを sysfs のデバイス属性と照合して、デバイスを識別します。ルールは、デバイス イベント処理の一部として実行する追加プログラムを指定することもできます。
Udev ルール ファイルは次のディレクトリにあります:
- /lib/udev/rules.d/ – デフォルトのルール ディレクトリ
- /etc/udev/rules.d/ – カスタム ルール ディレクトリ。これらの規則が優先されます。
ルール ファイルには一意の名前が必要です。カスタム ルール ディレクトリ内のファイルは、デフォルト ルール ディレクトリ内の同じ名前のファイルを上書きします。ルール ファイルは語彙順にソートされ、処理されます。以下は、デフォルトおよびカスタム ルール ディレクトリからのルール ファイルの部分的なリストです:
# ls -l /lib/udev/rules.d/ total 348 -r--r--r--. 1 root root 7266 Aug 5 2017 10-dm.rules -r--r--r--. 1 root root 2454 Aug 5 2017 11-dm-lvm.rules -rw-r--r--. 1 root root 2865 Jan 25 16:05 11-dm-mpath.rules -r--r--r--. 1 root root 1499 Aug 5 2017 13-dm-disk.rules -rw-r--r--. 1 root root 553 Aug 6 2017 39-usbmuxd.rules -rw-r--r--. 1 root root 1622 Mar 7 13:27 40-redhat.rules ...
# ls -l /etc/udev/rules.d/ total 8 -rw-r--r--. 1 root root 709 Aug 4 2017 70-persistent-ipoib.rules -rw-r--r--. 1 root root 96 Apr 21 05:09 70-persistent-net.rules lrwxrwxrwx. 1 root root 9 Sep 29 2014 80-net-name-slot.rules -> /dev/null
サンプル Udev ルール
以下の例には、/lib/udev/rules.d/50-udev-default.rules から選択されたエントリが含まれています ファイル。このルール ファイルには 60 を超えるエントリが含まれています。
# cat /lib/udev/rules.d/50-udev-default.rules # do not edit this file, it will be overwritten on update SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}" # select "system RTC" or just use the first one SUBSYSTEM=="rtc", ATTR{hctosys}=="1", SYMLINK+="rtc" SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100" SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", IMPORT{builtin}="usb_id", IMPORT{builtin}="hwdb --subsystem=usb" SUBSYSTEM=="input", ENV{ID_INPUT}=="", IMPORT{builtin}="input_id" ENV{MODALIAS}!="", IMPORT{builtin}="hwdb --subsystem=$env{SUBSYSTEM}" ACTION!="add", GOTO="default_permissions_end" SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666" SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620" SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620" ....
選択したエントリは、ルール ファイルの構文を説明するのに役立ちます。
1.コメントは # 記号で始まります。
2.ルール ファイル内のコメント化されていない各行は、コンマで区切られた 1 つ以上のキーと値のペアのリストで構成されます。キーには次の 2 種類があります:
- マッチキー
- 割り当てキー
3. すべての一致キーがそれぞれの値と一致する場合、ルールが適用され、指定された値が割り当てキーに割り当てられます。各キーには、オペレーターに応じて異なる操作があります。有効な演算子は次のとおりです:
- == :等しいかどうか比較
- != :不等式の比較
- = :キーに値を割り当てます
- += :キーの現在の値に値を追加します
- := :キーに最終的な値を割り当てます。以降のルールによる変更を禁止する
4. シェル スタイルのパターン マッチング (*、?、[]) も Udev ルールでサポートされています。
一致キー
次のキー名は、デバイス プロパティとの照合に使用されます。一部のキーは、イベントを生成したデバイスだけでなく、sysfs 内の親デバイスのプロパティとも一致します。 1 つのルールで複数のキーが指定されている場合、これらすべてのキーが一致する必要があります。
- アクション :イベント アクションの名前と一致します。
- DEVPATH :イベント デバイスの devpath と一致します。
- カーネル :イベント デバイスの名前と一致します。
- 名前 :ネットワーク インターフェイスの名前と一致します。前述のルールのいずれかで NAME キーが設定されている場合に使用できます。
- SYMLINK :ノードを対象とするシンボリック リンクの名前と一致します。前述のルールのいずれかで SYMLINK キーが設定されている場合に使用できます。複数のシンボリック リンクが存在する可能性がありますが、一致する必要があるのは 1 つだけです。
- サブシステム :イベント デバイスのサブシステムと一致します。
- TEST{オクタル モード マスク} :ファイルの存在をテストします。 8 進モード マスクを指定できます。
その他の一致キーには、DRIVER、ATTR{filename}、KERNELS、SUBSYSTEMS、DRIVERS、ATTRS{filename}、TAGS、ENV{key}、TAG、PROGRAM、および RESULT が含まれます。
割り当てキー
次のキーには値を割り当てることができます:
- 名前 – ネットワーク インターフェイスに使用する名前。デバイス ノードの名前を Udev で変更することはできません。追加のシンボリック リンクを作成することしかできません。
- SYMLINK – ノードを対象とするシンボリック リンクの名前
- オーナー、グループ、モード – デバイス ノードの権限
- オプション – ルールとデバイスのオプション。この例で使用されている ignore_remove オプションは、「デバイスがなくなったときにデバイス ノードを削除しない」という意味です。
その他の割り当てキーには、ATTR{key}、ENV{key}、TAG、RUN{type}、LABEL、GOTO、IMPORT{type}、WAIT_FOR、および OPTIONS が含まれます。
文字列の置換
NAME、SYMLINK、PROGRAM、OWNER、GROUP、MODE、および RUN キーは、多くの printf のような文字列置換をサポートしています。この例で使用されている置換は次のとおりです:
- %M – デバイスのカーネル メジャー番号
- %m – デバイスのカーネル マイナー番号
追加の文字列置換がサポートされています。サポートされているすべての置換と、追加の一致キー、追加の割り当てキー、および追加のルールとデバイス オプションの詳細については、udev のマニュアル ページを参照してください。
udevadm ユーティリティ
udevadm ユーティリティは、Udev のユーザー空間管理ツールです。他の機能の中でも、udevadm を使用して sysfs を照会し、デバイス属性を取得して、デバイスに一致する Udev ルールを作成するのに役立てることができます。 udevadm の使用状況を表示するには:
# udevadm --help udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS] Send control commands or test the device manager. Commands: info Query sysfs or the udev database trigger Request events from the kernel settle Wait for pending udev events control Control the udev daemon monitor Listen to kernel and udev events test Test an event run test-builtin Test a built-in command
各 udevadm コマンドの使用法も取得できます。たとえば、info コマンドの使用に関するヘルプを表示するには:
# udevadm info --help udevadm info [OPTIONS] [DEVPATH|FILE] Query sysfs or the udev database. -h --help Print this message --version Print version of the program -q --query=TYPE Query device information: name Name of device node symlink Pointing to node path sysfs device path property The device properties all All values -p --path=SYSPATH sysfs device path used for query or attribute walk -n --name=NAME Node or symlink name used for query or attribute walk -r --root Prepend dev directory to path names -a --attribute-walk Print all key matches walking along the chain of parent devices -d --device-id-of-file=FILE Print major:minor of device containing this file -x --export Export key/value pairs -P --export-prefix Export the key name with a prefix -e --export-db Export the content of the udev database -c --cleanup-db Clean up the udev database
udevadm ユーティリティの例
以下にいくつかの例を示します。 /dev/xvdd のデバイス パスを Udev データベースに照会するには:
# udevadm info --query=path --name=/dev/xvdd /devices/vbd-5696/block/xvdd
/dev/xvda のすべてのデバイス情報を Udev データベースに照会するには:
# udevadm info --query=all --name=/dev/xvda P: /devices/vbd-768/block/xvda N: xvda E: DEVNAME=/dev/xvda E: DEVPATH=/devices/vbd-768/block/xvda E: DEVTYPE=disk E: DM_MULTIPATH_TIMESTAMP=1524287355 E: ID_PART_TABLE_TYPE=dos E: MAJOR=202 E: MINOR=0 E: MPATH_SBIN_PATH=/sbin E: SUBSYSTEM=block E: TAGS=:systemd: E: USEC_INITIALIZED=476119
次のように入力して、/dev/xvda のすべての sysfs プロパティを出力します。これらのプロパティは、デバイスを一致させるために Udev ルールで使用できます。 sysfs のルートまで、チェーンに沿ってすべてのデバイスを出力します。
# udevadm info --attribute-walk --name=/dev/xvda Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at device '/devices/vbd-768/block/xvda': KERNEL=="xvda" SUBSYSTEM=="block" DRIVER=="" ATTR{ro}=="0" ATTR{size}=="41943040" ATTR{stat}==" 16775 4 686095 36372 2953 313 203104 42044 0 19603 78392" ATTR{range}=="16" ATTR{discard_alignment}=="0" ATTR{ext_range}=="16" ATTR{alignment_offset}=="0" ATTR{badblocks}=="" ATTR{inflight}==" 0 0" ATTR{removable}=="0" ATTR{capability}=="10" looking at parent device '/devices/vbd-768': KERNELS=="vbd-768" SUBSYSTEMS=="xen" DRIVERS=="vbd" ATTRS{devtype}=="vbd" ATTRS{nodename}=="device/vbd/768"
デバイス ノードへのシンボリック リンクの作成
ルールが評価される順序は重要です。独自のルールを作成する場合、デフォルトの前にこれらを評価する必要があります。ルールは字句順に処理されるため、最初に処理されるように /etc/udev/rules.d/10-local.rules などのファイル名でルール ファイルを作成します。
次のルールは、/dev/xvdd デバイス ノードへの /dev/my_disk シンボリック リンクを作成します。ネットワーク インターフェイスの名前を変更する Udev ルールを作成できますが、デバイス ノードの名前は Udev で変更できません。デバイス ノードには、追加のシンボリック リンクのみを作成できます。
KERNEL=="xvdd", SUBSYSTEM=="block", SYMLINK="my_disk"
ルールファイルを処理するために udevadm トリガーを実行します:
# udevadm trigger
シンボリック リンクが存在します。
# ls –l /dev/my* lrwxrwxrwx. ... /dev/my_disk -> xvdd
10-local.rules ファイルを削除し、udevadm トリガーを実行してシンボリック リンクを削除します。