udev とは【Linux 入門】

udev とはudev とは、Linux カーネル 用のデバイス管理ツールです。
関連記事:Linux の基本機能
スポンサーリンク

udev とは

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

デバイスって何?

基本的にコンピュータに繋がった機械だと考えて貰えば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 が登場する以前は、あらかじめコンピュータに接続する可能性のあるすべてのデバイスに対してデバイスファイルを作成していました。

しかし、現在コンピュータに接続されていないデバイスのデバイスファイルってディスク容量の無駄ですよね。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 一覧

https://documentation.suse.com/ja-jp/sles/12-SP4/html/SLES-all/cha-udev.html#sec-udev-rules-match

assign key 一覧

https://documentation.suse.com/ja-jp/sles/12-SP4/html/SLES-all/cha-udev.html#sec-udev-rules-assign

例:ブロックデバイスが接続された時、ログを残す 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: デバイスが接続されました。
スポンサーリンク

関連記事

関連記事:Linux の基本機能
Linux カーネルの機能

参考 Web ページ

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

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

wikipedia

udev - Wikipedia

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

https://documentation.suse.com/ja-jp/sles/12-SP4/html/SLES-all/cha-udev.html

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

404 Not Found - Qiita - Qiita