設定 - udev
概要
udev (userspace device management) とは、Linuxにおけるデバイス管理の中核を担うデーモンプロセスである。
カーネルのsysfsおよびdevfsと密接に連携して動作する。
udevの役割は、デバイスの動的な追加・削除の検知、それに応じた適切な対応の実行がある。
例えば、USBメモリを接続した場合、自動的にデバイスファイルを作成して、必要なドライバを読み込み、マウントポイントを設定するといった一連の処理を担当する。
Linuxでの位置付けにおいて、udevはカーネルからのデバイスイベント (uevent) を受け取り、それに基づいて動作する。
システムの起動時には、既存のデバイスの初期化も行う。
udevの特徴としては、ルールベースの設定が挙げられる。
/etc/udev/rules.dディレクトリ内に設定ファイルを配置することにより、特定のデバイスに対する独自の処理を定義することができる。
# udevの設定例: SUBSYSTEM=="usb", ATTR{idVendor}=="0483", NAME="mydevice", MODE="0666"
このようなルールにより、特定のベンダーIDを持つUSBデバイスに対して、カスタマイズされた名前や権限を設定できる。
現在のLinuxでは、udevはsystemdの一部として統合されており、systemd-udevdとして実行されている。
これにより、システムの他の部分との連携がより緊密になっている。
また、デバイス管理以外にも、udevは以下のような機能を提供している。
- ネットワークインターフェースの命名の永続化
- 各種センサやハードウェアの監視
- デバイス接続時の自動的なスクリプト実行
デバッグやトラブルシューティングを行う場合は、udevadm monitor
コマンドが使用される。
これは、リアルタイムでのデバイスイベントの監視が可能である。
ルールファイルの基本構文
udevはルールを適切に組み合わせることにより、柔軟なデバイス管理が可能になる。
また、セキュリティや利便性の観点から、必要最小限の権限設定のみを行うことが重要である。
# ルールファイルの基本構造 MATCH_KEY=="<マッチング用のキー>", ASSIGNMENT_KEY="<代入用のキー>", ACTION_KEY="<アクションキー>"
MATCH_KEY (マッチング用のキー)
- KERNEL
- カーネルが提供するデバイス名
- SUBSYSTEM
- デバイスのサブシステム (例: usb, input, net)
- DRIVER
- デバイスが使用するドライバ名
- ATTR{name}
- sysfsの属性値
- ENV{key}
- 環境変数
代入用のキー (ASSIGNMENT_KEY)
- NAME
- デバイスノード名の設定
- SYMLINK
- シンボリックリンクの作成
- MODE
- パーミッションの設定
- OWNER
- 所有者の設定
- GROUP
- グループの設定
設定例
# プリンタの設定例: SUBSYSTEM=="usb", ATTRS{idVendor}=="04a9", ATTRS{idProduct}=="1709", MODE="0666", GROUP="lp", SYMLINK+="my_printer" # 外付けディスクの設定例: SUBSYSTEM=="block", ATTRS{serial}=="ABC123", SYMLINK+="my_backup_drive", MODE="0660", GROUP="backup"
演算子について
- ==
- 完全一致
- !=
- 不一致
- =
- 単純な代入
- +=
- 追加の代入
- :=
- 最終的な代入 (上書き不可)
条件の組み合わせも可能である。
SUBSYSTEM=="usb", ATTRS{manufacturer}=="Apple", ACTION=="add", RUN+="/usr/local/bin/apple_device_handler.sh"
変数の使用
- %k
- カーネルデバイス名
- %n
- カーネル番号
- $attr{name}
- 属性値
- $env{name}
- 環境変数
# 変数の使用例: KERNEL=="sd*", SUBSYSTEM=="block", ATTRS{serial}=="*", SYMLINK+="disk/by-serial/%s{serial}"
# 特定の条件での処理分岐: SUBSYSTEM=="net", ACTION=="add", \ # ネットワークサブシステム(net)に関するデバイスが追加(add)された時にのみ適用されるという条件を示す ATTR{address}=="00:11:22:33:44:55", \ # このデバイスのMACアドレスが"00:11:22:33:44:55"と一致する場合のみ、このルールが適用される \ # これにより、特定のネットワークインターフェースカードを識別することができる IMPORT{program}="/usr/local/bin/check_network.sh", \ # 指定された外部スクリプトを実行して、その結果を環境変数としてudevのルール処理に取り込む \ # 例えば、スクリプト内でネットワークの状態確認や追加の条件の確認を行う等 PROGRAM=="/bin/sleep 2", \ # 2秒間の待機を挿入する \ # これは、デバイスの初期化や前述の外部スクリプトの完了を待機するために設定する \ # ネットワークデバイスの場合、完全に初期化される前にルールが適用されるのを防ぐために待機時間を設定することがある NAME="eth0" # このデバイスにeth0という名前を割り当てる
ルールの処理順序
ルールの処理順序は、ファイル名の辞書順に従う。
数字の小さい順に処理される。(例: 50-udev.rules -> 60-local.rules)
- システムルール
- /lib/udev/rules.dディレクトリ
- カスタムルール
- /etc/udev/rules.dディレクトリ
デバッグ / テスト
デバッグおよび動作確認を行う。
# ルールのテスト udevadm test /sys/class/net/eth0
# 現在のデバイス情報の表示 udevadm info --query=all --name=/dev/sda
# ルールの再読み込み udevadm control --reload-rules