関連記事:Linux の基本機能 | |||||
---|---|---|---|---|---|
udev とは
デバイスって何?
基本的にコンピュータに繋がった機械だと考えて貰えばOKです。
wikipedia に代表的なデバイスとデバイスファイル(デバイスノード)の命名規則が記載されているので抜粋します。
<デバイスファイルの命名規則>:<デバイス名>で記載
fd: フロッピーディスク
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
hd: IDE ハードディスクドライブ
lp: プリンター
sd: SCSI 接続のハードディスク(SSDもこれ)
pt: 擬似端末(コンピュータ上に仮想で作成された端末)
tty: (物理)端末
USB メモリとかマウスとかも全部デバイスです。
デバイス管理とは具体的に何をするのか?
前提として、 Linux では全てのデバイスを /dev ディレクトリ配下でデバイスファイルとして管理します。例えば SSD はデバイスファイル /dev/sda として管理します。(2つ目以降の SSD は/dev/sdb, /dev/sdc・・・となります。)
Linux カーネルのデバイス管理ツールである udev で実施できるデバイス管理は以下のとおりです。
新しいデバイスがコンピュータに接続もしくは接続解除された時に、udevは事前に定義したルールを実行することでデバイスを管理します。
udev を使うと何がうれしいか?
udev が登場する以前は、あらかじめコンピュータに接続する可能性のあるすべてのデバイスに対してデバイスファイルを作成していました。
しかし、現在コンピュータに接続されていないデバイスのデバイスファイルってディスク容量の無駄ですよね。udev は以下の処理によりこの問題を解決します。
- コンピュータにデバイスを接続した時、Linux カーネルはデバイスを検知
- Linux カーネルは udev デーモンに uevent と呼ばれるイベント通知を実施
- uevent を受け取った udev デーモンは事前に定義した udev ルールに応じてデバイスファイルを作成
デバイスの接続を解除した時も同様の処理の流れにより、デバイスファイルが削除されます。
このように udev により、現在接続されているデバイスだけ /dev ディレクトリにデバイスファイルを作成できます。
udev ルールの使い方
ここでは udev ルールの書き方について説明します。
udev ルール の実体
udev ルールの実体は下記のパスに存在する *.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 ルールが優先されます。
上記の場合は /etc/udev/rules.d/hoge.rules だけが実行され、その他は/dev/nullに捨てられます。
udev ルールの書き方
udev ルールは *.rules ファイルには以下のフォーマットで記載します。
<キー> <演算子> <値>,[<キー> <演算子> <値>,・・・]
<キー>について
<キー>は<match key>と<assign key>が存在します。
- <match key>は<assign key>を実行するための条件を記載します。
- <assign key>は実行する内容を記載します。
match key 一覧
assign key 一覧
例:ブロックデバイスが接続された時、ログを残す 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 ルールのサンプルコード
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の背景から具体的なルールの書き方までとてもわかりやすい。
wikipedia
SUSEのudev公式ドキュメント。気づいたら日本語のページが出来てました。
udevで調べると一番上に出てくるやつ。全体の流れがあって良き