Fedora での udev

by Harald Hoyer

訳: MUNEDA Takahiro <mail address>
2006 08 02 (第2版)

訳者が追記した行をわかりやすくするために,行頭に縦棒を記してある.

この文章のオリジナル版は以下の場所にある: http://fedora.redhat.com/docs/udev/
和訳版は以下の場所にある: http://mux03.panda64.net/docs/udev_on_fedora_ja.html

この文章では udev のナゾと, udev が Fedora では どのように動くのかを明らかにする.

udev は Greg Kroah-Hartman <greg@kroah.com> と Dan Stekloff <dsteklof@us.ibm.com>, Kay Sievers <kay.sievers@vrfy.org> の多大な協力,さらにその他大勢の協力によって開発された.

udev のホームページと Linux-hotplug-devel メーリングリスト https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel がおもな開発拠点である.

内容

  1. Fedora での udev
  2. 内容
  3. udev は何をするのか
  4. udev は Fedora ではどのように統合されているのか?
  5. Fedora での udev のカスタマイズ
  6. /dev/ なしで udev をアップデートする
  7. initrd なしで udev
  8. Fedora での現在の問題
  9. 脚注
  10. 更新履歴

udev は何をするのか

udev は実際に存在しているデバイスのためのファイルを置くための 動的なデバイスディレクトリを作成する. udev は通常 /dev/ ディレクトリに存在するデバイスノードファイルを 作成したり削除したり,ネットワークインターフェイスの名前を変更したりする.

システムにデバイスが追加もしくは削除されると, ホットプラグシステムの一部として udev が実行される. デバイス追加のときは,ラベル,シリアル番号,バス番号などの デバイス情報を集めるため udev は追加されたデバイスに対応する sysfs ディレクトリを読む. これらの情報はデバイスを一意に特定するためのキーとして使われるときがある. udev は現在システムに接続されているデバイスについてのデータベースを持っている. デバイス削除のときは, udev はデータベースに削除されるデバイスのファイル名を 問い合わせる.

モジュールがロードされていれば, udev はホットプラグから呼び出され デバイスが追加もしくは削除される. ドライバが "dev" を作成していれば udev は /sys/ ディレクトリを参照する. そのファイルには,デバイスノードがドライバとやりとりをするために必要な メジャー番号とマイナー番号が書かれている. デバイスノードの名前やシンボリックリンクを特定する udev ルールファイル (/etc/udev/rules.d/ ディレクトリに存在する)を参照したあと, /etc/udev/permissons.d/ で指定されているパーミッションを適用したデバイスノードが /dev/ 配下に作成される.

デバイスノードが作成,削除,またはネットワークデバイス名が変更されたのち, udev は /etc/dev.d/ ディレクトリツリー配下に存在するプログラムを実行する. プログラムの名前は拡張子が .dev で終わるもののみ認識される. ホットプラグ環境変数に加え, DEVNAME が作成されたノードの名前を作るため, または,名前が変更されるネットワークデバイスの名前を作るために出力される. ディレクトリにあるプログラムは辞書順に並び替えられ, ディレクトリは以下の順で検索される.

udev は Fedora ではどのように統合されているのか?

initrd / initfs*1

mkinitrd は /sbin/udev.static を initrd 内の /sbin/udev にコピーし, /sbin/udevstart としてシンボリックリンクを貼る.

カーネルが起動すると, initrd の nash スクリプトが実行される. nash スクリプトは /dev/ に tmpfs をマウントする. initrd の段階ではホットプラグの代わりに /sbin/udev が呼ばれる. udevstart がすべてのデバイスのデバイスノードを作成する. 作成されるデバイスはデバイスはカーネルに組み込まれたものと nash によってロードされるモジュールである.

問題

initrd では udev と hotplug のすべての機能が利用可能というわけではない. ホットプラグスクリプトも udev ルールもパーミッションもないので カーネルから送ってこられるすべてのホットプラグイベントに対し, /etc/dev.d/ スクリプトはひとつも実行されない.

rc.sysinit

まず, SELinux がロード,有効化され, /dev/ の内容が設定される. rc.sysinit は /sbin/start_udev を実行する. start_udev は /dev/ に何もマウントされていないようであれば /dev/ に tmpfs ファイルシステムをマウントする. そのあと, start_udev はデバイスノードを作成する. カーネルモジュールが自動的にロードされるか, カーネルモジュールがないことが必要である. そのあと, /sbin/udevstart が再度実行され,すべての udev ルールと パーミッションを適用するために initrd 段階のすべてのホットプラグを シミュレートする. そのあと, rc.sysinit は /sbin/kmodule の出力を解析し, すべてのモジュールをロードする. これでシステム上に見つかるすべてのハードウェアに対する すべてのデバイスノードが作成される.

コンソールのユーザパーミッション

/etc/dev.d/default/pam_consle.dev はデバイスノードが作成されるといつも実行され, /sbin/pam_console_setowner コマンドをデバイスノードの ファイル名(とオプションでシンボリックリンク)をつけて実行する. これが /etc/security/console.perms などで指定されるコンソールユーザの ためのパーミッションを設定する.

Fedora での udev のカスタマイズ

udev と udevinfo の man ページを読むこと. RPM パッケージのファイルを編集しようとしないこと.

新しいルール

新しいルールは名前が .rules で終わるファイルに記述し, /etc/udev/rules.d/ に置くのがよい. 50-udev.rules を使わないこと. "NAME" タグを使わずに "SYMLINK" だけを使うルールを書くのが 好ましいサポートされた方法である.

ルールの書き方についてのよい文章が http://www.reactivated.net/udevrules.php にある.*2

パーミッション

新しいパーミッションは .permissions で終わるファイルに記述し, /etc/udev/permissions.d/ に置くのがよい. 50-udev.permissions を使わないこと.

でも自分のデバイスノードが欲しい!

/etc/udev/devices/ にデバイスノードを置けば. /dev/ にコピーされる. もしそれが標準で行われるべきだと思うのであれば, Bugilla のエントリーに登録すること

/dev/ なしで udev をアップデートする

以下の手順が Anaconda や レスキュー CD なしで アップグレードする方法である(おすすめしない):

initrd なしで udev

ふつうに Fedora Core をインストールしリブートする. 以下のコマンドを実行する.

mkdir /tmp/dev
mount --move /dev /tmp/dev
sbin/MAKEDEV null console zero
mount --move /tmp/dev /dev

initrd なしでカーネルをインストールしリブートする.

SELinux のエラーが出るだろう. syslogd が期待どおりに動かないだろう.

Fedora での現在の問題

オープンされている udev のバグ全部

Nvidia

早期解決策: もし rhgb が必要なければ,/etc/rc.local で nvidia モジュールをロードするだけ.

もし udev の 032-5 以上を使っているのならば, nvidia モジュールをロードする

cp -a /dev/nvidia* /etc/udev/devices
chown root.root /etc/udev/devices/nvidia*

この問題に対応する Bugizilla は 133900 である.

Palm Pilot

もし udev の 032-5 以上を使っているのならばコマンドを実行する

ln -s ttyUSB1 /etc/udev/devices/pilot

または /etc/udev/rules.d/10-custum.rules のようなファイルに
以下のようなものを書いてもいい

BUS="usb", SYSFS{product}="palmOne Handheld*", KERNEL="ttyUSB*", NAME{ignore_remove}="pilot", MODE="666"

ISDN

もし udev の 032-5 以上を使っているのならば

/sbin/MAKEDEV -d /etc/udev/devices isdn

を実行する.

脚注

fn1

訳者注:2005 11 20 現在最新の mkinitrd(5.0.10-1) では initrd 内で udev を使っていない.代わりに自前で mknod を実行している.(本文へ戻る)

fn2

訳者注:日本語訳は http://mux03.panda64.net/docs/udevrules_ja.htmlにある.(本文へ戻る)

更新履歴

2006 08 02 - 第2版
パーミッション設定用ファイルの拡張子が間違っていたのを修正.メールでの指摘感謝します.

2005 11 20 - 初版
新規作成