Linuxでデバイスの検出と管理にUdevを使用する方法


ある[ Udev (ユーザースペース/dev )は、カーネルバージョン 2.6 以来、動的なデバイスの検出と管理のためのLinuxサブシステムです。これは devfs hotplug に代わるものです。

起動時または追加したデバイスノード(/dev ディレクトリに格納されている通常のファイルのようにファイルシステムに表示されるデバイスドライバへのインターフェイス)を動的に作成または削除します。システムへのデバイスの追加、またはシステムからのデバイスの削除。その後、デバイスに関する情報を伝播したり、デバイスの状態をユーザー空間に変更したりします。

その機能は、1)システムアプリケーションにデバイスイベントを供給すること、2)デバイスノードの許可を管理すること、および3)デバイスにアクセスするための/dev ディレクトリに便利なシンボリックリンクを作成すること。

udev の長所の1つは、検出順序に関係なく、永続的なデバイス名を使用して再起動後も一貫したデバイス名を保証できることです。カーネルは単に発見の順序に基づいて予測不可能なデバイス名を割り当てるので、この機能は便利です。

この記事では、Linuxシステムでの端末の検出と管理に Udev を使用する方法を学びます。最近のLinuxディストリビューションのすべてではないにしても、ほとんどがデフォルトのインストールの一部として Udev を使用しています。

LinuxでUdevの基礎を学ぶ

udev デーモン、 systemd-udevd (または systemd-udevd.service )がカーネルと通信し、デバイスを受信します uevents システムにデバイスを追加したりシステムからデバイスを削除したり、デバイスがその状態を変更するたびに、そこから直接アクセスできます。

Udev はルールに基づいています - ルールは柔軟で強力です。受信したすべてのデバイスイベントは /lib/udev/rules.d および /run/udev/rules.d にあるファイルから読み取った一連のルールと照合されます。

デバイスを処理するには、 /etc/udev/rules.d/ ディレクトリ(ファイルの拡張子は .rules )にカスタムルールファイルを書き込めます。このディレクトリ内のルールファイルが最も優先度が高いことに注意してください。

デバイスノードファイルを作成するには、ラベルシリアル番号、メジャー番号、マイナー番号などの特定の属性を使用してデバイスを特定する必要があります。使用される、バスデバイス番号とそんなに多く。この情報は sysfs ファイルシステムによってエクスポートされます。

デバイスをシステムに接続するたびに、カーネルがそれを検出して初期化し、デバイスの名前を含むディレクトリが/sys/ディレクトリの下に作成されます。

udevの主な設定ファイルは /etc/udev/udev.conf で、udevデーモンの実行時の動作を制御するには udevadm ユーティリティを使用できます。

受信したカーネルのイベント uevents )と udevイベント(ルール処理後にudevが送信)を表示するには、 udevadm monitorコマンドで。次に、デバイスをシステムに接続して、端末からデバイスイベントがどのように処理されるかを確認します。

次のスクリーンショットは、USBフラッシュディスクをテストシステムに接続した後の ADD イベントの抜粋です。

$ udevadm monitor 

USBディスクに割り当てられている名前を見つけるには、 sysfs ファイルシステムと udev db を読み込むlsblkユーティリティを使用して、処理されたデバイスに関する情報を収集します。

 
$ lsblk

前のコマンドの出力から、USBディスクの名前は sdb1 です(絶対パスは/dev/sdb1 になります)。 udevデータベースからデバイスの属性を問い合わせるには、 infoコマンドを使用します。

$ udevadm info /dev/sdb1

LinuxでUdevルールを操作する方法

このセクションでは、 udev ルールの書き方について簡単に説明します。ルールは、1つ以上のキーと値のペアのカンマ区切りリストで構成されています。ルールを使用すると、デバイスノードのデフォルト名からの名前変更、デバイスノードの権限と所有権の変更、デバイスノードの作成または削除時のプログラムまたはスクリプトの実行のトリガなどを行うことができます。

USBデバイスが追加されたときと実行中のシステムから削除されたときにスクリプトを起動する簡単なルールを書きます。

2つのスクリプトを作成することから始めましょう。

$ sudo vim /bin/device_added.sh

device_added.sh スクリプトに次の行を追加します。

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

2番目のスクリプトを開きます。

$ sudo vim /bin/device_removed.sh

次に、 device_removed.sh スクリプトに次の行を追加します。

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

ファイルを保存し、両方のスクリプトを閉じて実行可能にします。

$ sudo chmod +x /bin/device_added.sh
$ sudo chmod +x /bin/device_removed.sh

次に、 /etc/udev/rules.d/80-test.rules という上記スクリプトの実行をトリガーするルールを作成しましょう。

$ vim /etc/udev/rules.d/80-test.rules

その中に次の2つの規則を追加します。

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

ここで、

  • "==": is an operator to compare for equality.
  • "+=": is an operator to add the value to a key that holds a list of entries.
  • SUBSYSTEM: matches the subsystem of the event device.
  • ACTION: matches the name of the event action.
  • ENV{DEVTYPE}: matches against a device property value, device type in this case.
  • RUN: specifies a program or script to execute as part of the event handling.

ファイルを保存して閉じます。次にrootで、 systemd-udevd にルールファイルを再ロードするように指示します(これにより、カーネルモジュールインデックスなどの他のデータベースも再ロードされます)。

$ sudo udevadm control --reload

今すぐあなたのマシンにUSBドライブを接続し、 device_added.sh スクリプトが実行されたかどうか確認してください。まず最初に scripts.log ファイルを/tmp の下に作成します。

$ ls -l /tmp/scripts.log

スクリーンショットに示すように、ファイルには「 date_timeにUSBデバイスが削除された」などのエントリがあります。

$ cat /tmp/scripts.log

udevのルールを書き、udevを管理する方法の詳細については、次のコマンドを実行して、それぞれ udev udevadm の手動エントリを参照してください。

$ man udev
$ man udevadm

Udev は、/dev ディレクトリにデバイスノードを動的に設定する方法を提供する優れたデバイスマネージャです。デバイスが接続されて検出されるとすぐにデバイスが設定されます。処理されたデバイスに関する情報またはその状態への変更をユーザースペースに伝達します。

このトピックについて質問や意見がある場合は、フィードバックフォームを使用してください。

全著作権所有。 © Linux-Console.net • 2019-2022