Linux でのデバイスの検出と管理に Udev を使用する方法
Udev (ユーザースペース /dev) は、カーネル バージョン 2.6 以降の動的なデバイスの検出と管理のための Linux サブシステムです。これはdevfs とホットプラグの代替品です。
ブート時、またはユーザーがデバイスをシステムに接続したり、システムからデバイスを削除したりします。次に、デバイスに関する情報やその状態の変化をユーザー空間に伝播します。
その機能は、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
拡張子で終わる必要があります) デバイスを処理できます。このディレクトリ内のルール ファイルの優先順位が最も高いことに注意してください。
デバイス ノード ファイルを作成するには、udev がラベル、シリアル番号、使用されるメジャー番号とマイナー番号、バス デバイス番号などの特定の属性を使用してデバイスを識別する必要があります。もっとずっと。この情報はsysfs ファイル システムによってエクスポートされます。
デバイスをシステムに接続すると、カーネルがデバイスを検出して初期化し、デバイス属性を保存する /sys/ ディレクトリにデバイス名のディレクトリが作成されます。
udev の主な設定ファイルは /etc/udev/udev.conf で、udev デーモンのランタイム動作を制御するには、udevadm ユーティリティを使用できます。
受信したカーネルイベント (uevents) とudev イベント (udev がルール処理後に送信する) を表示するには、udevadm を実行します。 > 監視コマンドを使用します。次に、デバイスをシステムに接続し、端末からデバイス イベントがどのように処理されるかを監視します。
次のスクリーンショットは、USB フラッシュ ディスクをテスト システムに接続した後の追加 イベントの抜粋を示しています。
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"
どこ :
"=="
: 等しいかどうかを比較する演算子です。"+="
: は、エントリのリストを保持するキーに値を追加する演算子です。- サブシステム: イベント デバイスのサブシステムと一致します。
- アクション: イベント アクションの名前と一致します。
- ENV{DEVTYPE}: デバイスのプロパティ値、この場合はデバイス タイプと照合します。
- RUN: イベント処理の一部として実行するプログラムまたはスクリプトを指定します。
ファイルを保存して閉じます。次に root として、systemd-udevd を実行してルール ファイルをリロードするように指示します (これにより、カーネル モジュール インデックスなどの他のデータベースもリロードされます)。
sudo udevadm control --reload
次に、USB ドライブをマシンに接続し、device_added.sh
スクリプトが実行されたかどうかを確認します。まず、ファイル scripts.log を /tmp の下に作成する必要があります。
ls -l /tmp/scripts.log
スクリーンショットに示すように、ファイルには「USB デバイスが date_time に削除されました」などのエントリが含まれているはずです。
cat /tmp/scripts.log
udev ルールの作成方法と udev の管理方法の詳細については、次のコマンドを実行して、udev および udevadm のマニュアル エントリをそれぞれ参照してください。
man udev
man udevadm
まとめ
Udev は、/dev
ディレクトリにデバイス ノードを動的にセットアップする方法を提供する優れたデバイス マネージャーです。これにより、デバイスが接続されて検出されるとすぐに設定されるようになります。処理されたデバイスまたはその状態の変化に関する情報をユーザー空間に伝播します。
このトピックに関して質問や意見がある場合は、フィードバック フォームを使用してください。