GNU/Linux >> Linux の 問題 >  >> Cent OS

Linux での Udev の初心者向けガイド

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 トリガーを実行してシンボリック リンクを削除します。


Cent OS
  1. Device Mapper (DM) マルチパスの初心者向けガイド

  2. Linux でのカーネル モジュール構成の初心者向けガイド

  3. CentOS / RHEL における NFS の初心者向けガイド

  1. 初心者向けのLinuxターミナルガイド

  2. Linuxの権限101

  3. Udev :ネットワーク インターフェイスの名前を変更する

  1. CentOSとは–初心者向けガイド

  2. CentOS8からOracleLinux8への移行:ステップバイステップガイド

  3. Linuxでルートパスワードをリセットする