udev とは

Linux

udev とは

udev とは、Linuxカーネル 用のデバイス管理ツールです。

新しいデバイスがコンピュータに接続もしくは接続解除された時に、udevは事前に定義したルールを実行することでデバイスを管理します。

デバイスって何?

基本的にコンピュータに繋がった機械だと考えて貰えばOKです。

wikipedia に代表的なデバイスとデバイスファイル(デバイスノード)の命名規則が記載されているので抜粋します。

<デバイスファイルの命名規則>:<デバイス名>で記載

fd: フロッピーディスク
hd: IDE ハードディスクドライブ
lp: プリンター
sd: SCSI 接続のハードディスク(SSDもこれ)
pt: 擬似端末(コンピュータ上に仮想で作成された端末)
tty: (物理)端末

https://ja.wikipedia.org/wiki/%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB#%E6%85%A3%E7%BF%92%E7%9A%84%E3%81%AA%E5%91%BD%E5%90%8D

USB メモリとかマウスとかも全部デバイスです。

デバイス管理とは具体的に何をするのか?

前提として、 Linux では全てのデバイスを /dev ディレクトリ配下でデバイスファイルとして管理します。例えば SSD はデバイスファイル /dev/sda として管理します。(2つ目以降の SSD は/dev/sdb, /dev/sdc・・・となります。)

Linux カーネルのデバイス管理ツールである udev で実施できるデバイス管理は以下のとおりです。

  • デバイスファイルを作成、削除する
  • デバイスファイルの設定をする
    • デバイスファイル名の決定
    • パーミッションの設定
    • シンボリックリンクの作成

udev を使うと何がうれしいか?

udev が登場する以前は、あらかじめコンピュータに接続する可能性のあるすべてのデバイスに対してデバイスファイルを作成していました。

しかし、現在コンピュータに接続されていないデバイスのデバイスファイルってディスク容量の無駄ですよね。udev は以下の処理によりこの問題を解決します。

  1. コンピュータにデバイスを接続した時、Linux カーネルはデバイスを検知
  2. Linux カーネルは udev デーモンに uevent と呼ばれるイベント通知を実施
  3. uevent を受け取った udev デーモンは事前に定義した udev ルールに応じてデバイスファイルを作成

デバイスの接続を解除した時も同様の処理の流れにより、デバイスファイルが削除されます。

このように udev により、現在接続されているデバイスだけ /dev ディレクトリにデバイスファイルを作成できます。

udev ルールの使い方

ここでは udev ルールの書き方について説明します。

udev ルール の実体

udev ルールの実体は下記のパスに存在する *.rules ファイルです。

  1. /etc/udev/rules.d/*.rules
  2. /run/udev/rules.d/*.rules
  3. /usr/lib/udev/rules.d/*.rules

udev ルールの優先度

優先度その1:udev ルールはファイル名の辞書順に実行される

例えば以下の場合は、10-dm.rulesが一番最初に実行されます。

$ ls /usr/lib/udev/rules.d/
10-dm.rules 
11-dm-lvm.rules 
13-dm-disk.rules 
40-redhat.rules 
42-usb-hid-pm.rules 
50-udev-default.rules

優先度その2:ディレクトリによって優先度が違う

以下のように同じファイル名が各ディレクトリに存在する場合は、上のディレクトリから順番に udev ルールが優先されます。

  1. /etc/udev/rules.d/hoge.rules
  2. /run/udev/rules.d/hoge.rules
  3. /usr/lib/udev/rules.d/hoge.rules

上記の場合は /etc/udev/rules.d/hoge.rules だけが実行され、その他は/dev/nullに捨てられます。

udev ルールの書き方

udev ルールは *.rules ファイルには以下のフォーマットで記載します。

<キー> <演算子> <値>,[<キー> <演算子> <値>,・・・]

<キー>について

<キー>は<match key>と<assign key>が存在します。

  • <match key>は<assign key>を実行するための条件を記載します。
  • <assign key>は実行する内容を記載します。

match key 一覧

SUSE Linux Enterprise Server 11 SP4: 第15章 udevによる動的カーネルデバイス管理 (管理ガイド)
カーネルは、実行中のシステムのほぼすべてのデバイスを追加または削除できます。デバイス状態の変更(デバイスが接続されているか、または取り外されたか)をユーザスペースに反映させる必要があります。デバイスは、接続後、検出されるとすぐに設定されなければなりません。特定のデバイスのユーザは、このデバイスの認識された状態が変更され...

assign key 一覧

SUSE Linux Enterprise Server 11 SP4: 第15章 udevによる動的カーネルデバイス管理 (管理ガイド)
カーネルは、実行中のシステムのほぼすべてのデバイスを追加または削除できます。デバイス状態の変更(デバイスが接続されているか、または取り外されたか)をユーザスペースに反映させる必要があります。デバイスは、接続後、検出されるとすぐに設定されなければなりません。特定のデバイスのユーザは、このデバイスの認識された状態が変更され...

例:ブロックデバイスが接続された時、ログを残す udev ルール

ブロックデバイスのデバイス名は下記のコマンドで確認可能です。

$ lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 64G 0 disk
├─nvme0n1p1 259:1 0 64G 0 part /
└─nvme0n1p128 259:2 0 1M 0 part
nvme1n1 259:3 0 8G 0 disk

デバイス名が “nvme1n1” であるブロックデバイスが接続された時、コンソールに”デバイスが接続されました”と表示する udev ルールを作成してみます。

udev ルールのサンプルコード

$vim /etc/udev/rules.d/1-test.rules
KERNEL=="nvme1n1",SUBSYSTEM=="block",ACTION=="add", RUN="/usr/bin/logger デバイスが接続されました。"

キーの意味

  • KERNEL: イベントデバイス名
  • SUBSYSTEM: イベントデバイスのサブシステム名
  • ACTION: イベントの動作 “add” ならデバイスが接続された時
  • RUN: 実行するプログラムを指定する。

udev ルールの実行結果の確認

物理環境ならデバイスを抜き差しする、クラウド環境ならブロックストレージをインスタンスからデタッチした後、アタッチしてみてください。

$ sudo tail /var/log/messages
Oct 4 03:57:09 ip-**** root: デバイスが接続されました。

参考にした Web ページ

udevの背景から具体的なルールの書き方までとてもわかりやすい。

Writing udev rules - ja
udevルールの書き方

wikipedia

udev - Wikipedia

SUSEのudev公式ドキュメント。気づいたら日本語のページが出来てました。

SUSE Linux Enterprise Server 11 SP4: 第15章 udevによる動的カーネルデバイス管理 (管理ガイド)
カーネルは、実行中のシステムのほぼすべてのデバイスを追加または削除できます。デバイス状態の変更(デバイスが接続されているか、または取り外されたか)をユーザスペースに反映させる必要があります。デバイスは、接続後、検出されるとすぐに設定されなければなりません。特定のデバイスのユーザは、このデバイスの認識された状態が変更され...

udevで調べると一番上に出てくるやつ。全体の流れがあって良き

udevルールの書き方 - Qiita
1 udevとは? udevはデバイスファイルを動的に作成、削除する仕組みです。 以下にデバイスファイルを作成するまでの流れを示します。 (1) カーネルがデバイスの追加、削除を検知 (2) /sys配下にデバイスの情報を反映 ...
0

コメント

タイトルとURLをコピーしました