by Harald Hoyer
訳: MUNEDA Takahiro <>
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 がおもな開発拠点である.
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 が作成されたノードの名前を作るため, または,名前が変更されるネットワークデバイスの名前を作るために出力される. ディレクトリにあるプログラムは辞書順に並び替えられ, ディレクトリは以下の順で検索される.
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/ スクリプトはひとつも実行されない.
まず, 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 などで指定されるコンソールユーザの ためのパーミッションを設定する.
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 のエントリーに登録すること.
以下の手順が Anaconda や レスキュー CD なしで アップグレードする方法である(おすすめしない):
ふつうに Fedora Core をインストールしリブートする. 以下のコマンドを実行する.
mkdir /tmp/dev mount --move /dev /tmp/dev sbin/MAKEDEV null console zero mount --move /tmp/dev /dev
initrd なしでカーネルをインストールしリブートする.
SELinux のエラーが出るだろう. syslogd が期待どおりに動かないだろう.
早期解決策: もし 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 である.
もし 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"
もし udev の 032-5 以上を使っているのならば
/sbin/MAKEDEV -d /etc/udev/devices isdn
を実行する.
訳者注:2005 11 20 現在最新の mkinitrd(5.0.10-1) では initrd 内で udev を使っていない.代わりに自前で mknod を実行している.(本文へ戻る)
訳者注:日本語訳は http://mux03.panda64.net/docs/udevrules_ja.htmlにある.(本文へ戻る)
2006 08 02 - 第2版
パーミッション設定用ファイルの拡張子が間違っていたのを修正.メールでの指摘感謝します.
2005 11 20 - 初版
新規作成