Gentoo udev ガイド
1.
udevって何?
/devディレクトリ
Linuxはウィルスの一種かコーヒーのブランドの何かかな思う人たちの中で、Linuxユーザがシステムのハードウェアについて話すとき、「スラッシュdevスラッシュ何とか」という言葉を使うと、確かに奇妙に映るでしょう。
ですが、幸運なユーザ(読者であるあなたも含む)にとって/dev/hda1と使うのは、プライマリマスタIDEの一番目のパーティションについて話しているということを説明するのには手っ取り早い方法ですよね?
私たちの全てがデバイスファイルとは何であるかを知っています。そのうちの幾人かは/devディレクトリでls -lを実行して、その結果をより詳しく見たときに、なぜデバイスファイルが特別な数値を持っているのかさえも知っています。しかし、プライマリマスタIDEディスクが/dev/hdaとして参照されるということを、私たちは常に当然だと考えます。あなたはこのように判断しないかもしれませんが、そうであればそれは設計上の欠陥です。
USBやIEEE1394、ホットスワップ可能なPCIのようなホットプラグ可能デバイスについて考えてみてください...何が一番目のデバイスですか。
そしてそれはどれだけの期間ですか。一番目のものが外されたとき、他のデバイスは何と名前を割り当てられるでしょうか。
現在進行中のトランザクションにどう影響するでしょうか。
あなたのママが、たまたま一番目のプリンタだったレーザープリンタのプラグを引き抜くことにしたために、印刷ジョブがすごく新しいレーザプリンタから、ほとんど死んでしまっているマトリックスプリンタに突然移動されてしまうことは嬉しいですか。
udevの話題に入りましょう。udevプロジェクトの目標は、以下のように興味深くもあり必要なことでもあります。
- ユーザスペースでの実行
- デバイスファイルを動的に作成/削除
- 一貫性のある命名規則の提供
- ユーザスペース向けAPIの提供
これらの特徴を提供するために、udevは三つに分かれたプロジェクトで開発されています。それはnamedevとlibsysfs、そしてもちろんudevです。
namedev
namedevは、デバイスの命名規則を、udevプログラムとは分離して定義することを可能にします。
これは、柔軟な命名規則方針や体系を独立した団体が開発することを可能にします。
デバイスネーミングサブシステム(namedev)は、udevから使用できる標準インターフェースを提供します。
現在のところnamedevによって一つの命名体系だけが提供されます。
それはLANANAによって提供され、現在のLinuxシステムの大多数によって採用されているので、ほとんどのLinuxユーザにとても馴染みやすいです。
(訳注: LANANA - Linux Assigned Name And Number Authority - http://www.lanana.org/)
namedevは、デバイスの名前を見つけるために、5つのステップを踏みます。
デバイスの名前がそのステップの一つで見つかると、その名前が使用されます。
それらのステップは、以下の通りです。
- ラベルまたはシリアルナンバー
- バスデバイスナンバー
- バストポロジ
- 静的に与えられる名前
- カーネルが提供する名前
ラベルまたはシリアルナンバーのステップは、デバイスが固有の識別子を持つかどうかをチェックします。例えばUSBデバイスは、固有のUSBシリアルナンバーを持っています。SCSIデバイスは固有のUUIDを持っています。namedevが、指定された設定ファイルで、この固有ナンバーと一致するものを見つけた場合、設定ファイルで提供される名前を使用します。
バスデバイスナンバーのステップは、デバイスバスナンバーをチェックします。
ホットスワップ可能でない環境にとっては、このステップはハードウェアデバイスを識別するのに十分に機能します。例えば、PCIバスナンバーは、システムの生存期間中にめったに変わりません。この場合もやはり、namedevは、指定された設定ファイルの中でこの位置関係と一致するものを見つけたら、設定ファイルで提供される名前を使用します。
同様にバストポロジのステップは、ユーザがデバイスを抜き差しして変更しない限り、定義を変更しないやや静的な方法です。ユーザによって提供される設定とデバイスの位置が一致した場合、併記されている名前が使用されます。
四つ目のステップ、静的に与えられる名前は、単純な文字列の置換です。カーネルの名前(デフォルトの名前)が、指定される置換文字列に一致する場合、置換した名前が使用されます。
最後のステップ(カーネルが提供する名前)は、あらゆる状況に対応します。
このステップは、カーネルによって提供されるデフォルトの名前を取得します。
現在のLinuxシステム上で使用されるデバイスの命名規則に一致するので、ほとんどの状況において十分機能します。
libsysfs
udevは、sysfs仮想ファイルシステムを通してカーネルと情報のやりとりを行います。
libsysfsプロジェクトは、sysfsファイルシステムによって提供される情報に、共通の方法でアクセスするための、共通API層を提供します。
このAPIは、ハードウェアの種類が何であろうと、すべてのハードウェアに対して問い合わせることを可能にします。
udev
カーネルは、デバイス構造の変更を検知すると、/sbin/hotplugプログラムを実行します。hotplugは、/etc/hotplug.d/defaultディレクトリにリンクされたアプリケーションを実行します。そのディレクトリには、さらにudevアプリケーションへのシンボリックリンクが見つかるでしょう。
hotplugは、/devに必要なアクション(デバイスファイルの作成もしくは削除)を実行するudevアプリケーションに、カーネルによって提供される情報を配送します。
2.
Gentooでのudevの使用
必要条件
udevは、(デフォルトの2005.0のプロファイルにあるvanilla-sourcesもしくはgentoo-sourcesのような)カーネル2.6との組み合わせで使用されるように意図されています。
このようなカーネルを使用しているなら、最新のsys-apps/baselayoutバージョンを使用しているか確認する必要があります。必要な条件はこれだけです。
Code Listing 2.1: udevのインストール |
# emerge udev
|
udevは、依存するものの一つとしてhotplug-baseをインストールします。
デバイスの接続時に、モジュールが自動的にロードされるのを望まない場合は、hotplugをインストールする必要はありません。hotplugは、ネットワークデバイスの自動起動やファームウェアのダウンロードも処理します。
Code Listing 2.2: オプション扱いのhotplugスクリプトのインストール |
# emerge hotplug
|
接続済みのデバイスに対するモジュールが、起動前から自動でロードされてほしいなら、coldplugパッケージを使用してください。
Code Listing 2.3: coldplugパッケージのインストール |
# emerge coldplug
|
bootランレベルにcoldplugを追加することを忘れないでください。
Code Listing 2.4: bootランレベルにcoldplugを追加 |
# rc-update add coldplug boot
|
カーネルに関しては、以下のオプションを必ず有効にしてください。
Code Listing 2.5: 要求されるカーネルオプション |
General setup --->
[*] Support for hot-pluggable devices
File systems --->
Pseudo filesystems --->
[*] /proc file system support
[*] Virtual memory file system support (former shm fs)
|
以下のように、希望するなら/dev file system support (OBSOLETE)を有効のままにしておくことができます。ですが、"Automatically mount at boot"は、確実に無効にされなければなりません。
Code Listing 2.6: 自動でdevfsdをマウントしてはいけません |
File systems --->
Pseudo Filesystems --->
[*] /dev file system support (OBSOLETE)
[ ] Automatically mount at boot
|
genkernelを使用するなら、すべての必要なカーネル設定を有効にするために、--udevオプションを付けて実行することを忘れないでください。
このgenkernelによって提供される一般的な設定は、必要なものを満たします。
設定
あなたのシステム環境を快適にするためにGentooが追加したudev-tweaksを使用したいなら、これ以上読まないでください。不足しているデバイスノードが少しもないように、Gentooはudevを使用しても、静的な/devを維持し続けます。
Gentooのinitスクリプトは、devfsdデーモンを実行しませんし、ブート時にdevfsを停止状態にします。
しかし、あなたが頑固な人で、udev開発者によって意図される(udevがまだサポートしていないことによるデバイスノード不足の障害も含む)通りに、udev-tweaksを使用しない、udevだけのシステムを走らせたいなら、必ずこのまま読み続けてください。
デバイスファイルノードの保存機能を停止します。
/etc/conf.d/rcの中のRC_DEVICE_TARBALL変数を編集し、それにnoを設定してください。
Code Listing 2.7: /etc/conf.d/rc |
RC_DEVICE_TARBALL="no"
|
カーネルにdevfsサポートが含まれているなら、ブートローダ設定でそれを無効にできます。
カーネルパラメータにgentoo=nodevfsを追加してください。
devfsを使用しudevを無効にしたいなら、カーネルパラメータにgentoo=noudevを追加してください。
3.
既知の問題
ブート時のデバイスノードファイル不足
/dev/nullが見つからないというエラーが発生するか、最初のコンソールがないのが原因でうまくブートできない場合の問題は、/devがマウントされてudevによって処理される前に利用可能でなければならない、いくつかのデバイスファイルが不足しているということです。古いメディアからインストールされるGentooマシンで共通の問題です。
sys-apps/baselayout-1.8.12もしくはそれ以降のバージョンで実行している場合、ブートプロセスは最低でもなんとか完走するので、この問題は多少解決されます。しかし、うるさい警告をなくすために、以下で述べられる通りにして不足しているデバイスノードを作成するべきです。
/devファイルシステムがマウントされる前に存在しているデバイスノードを確認するために、以下のコマンドを実行してください。
Code Listing 3.1: ブート時に利用可能なデバイスノードのリスト表示 |
# mkdir test
# mount --bind / test
# cd test/dev
# ls
|
うまくブートするために必要なデバイスは、/dev/nullと/dev/consoleです。もし上記のテストでそれらが表示されないなら、手動で作成しなければなりません。以下のコマンドをtest/dev/ディレクトリで実行してください。
Code Listing 3.2: 必要なデバイスノードファイルの作成 |
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3
|
完了したら、test/ディレクトリをアンマウントすることを忘れないでください。
Code Listing 3.3: test/ディレクトリのアンマウント |
# cd ../..
# umount test
# rmdir test
|
udevとnvidia
udevのみのシステムでnVidia社が開発したドライバを使用し、Xサーバが起動に失敗したら、以下のものを確認してください。
-
/etc/modules.autoload.d/kernel-2.6にnvidiaモジュールが記述されているか
-
nvidia-kernelのバージョンがmedia-video/nvidia-kernel-1.0.5336-r2と同じかより大きいものであるか
-
baselayoutのバージョンがsys-apps/baselayout-1.8.12と同じかより大きいものであるか
xorg-x11が立ち上がろうとしないなら、/dev/nvidiaデバイスファイルがないことが原因かもしれません。
この場合、そのファイルを(再)作成するために/sbin/NVmakedevices.shを実行してください。
LVM2での名前の消失
udevとLVM2を一緒に使用するときは、ユーザが作成したボリュームグループと論理ボリュームが消失してしまうことに注意してください。それらは消失していますが、不運にも/dev/dm-#(#は0, 1, ...である)という名前を割り当てらています。
これを修正するために、/etc/udev/rules.d/50-udev.rulesを編集し、以下の行のコメントを外してください。
Code Listing 3.4: /etc/udev/rules.d/50-udev.rulesのこの行のコメントを外す |
KERNEL="dm-[0-9]*", PROGRAM="/sbin/devmap_name %M %m", NAME="%k", SYMLINK="%c"
|
次に、devmap_nameアプリケーションを含むsys-fs/multipath-toolsをインストールしてください。
Code Listing 3.5: multipath-toolsのインストール |
# echo "=sys-fs/multipath-tools-0.4.2 ~x86" >> /etc/portage/package.keywords
# emerge multipath-tools
|
DevFSとudevとの間で矛盾する命名規則
私たちが、両方の動的デバイス管理手法間(DevFSとudev間)で矛盾しない命名体系を使用するつもりでも、ときどき命名規則の違いが発生します。
HP Smart Array 5i RAID コントローラ(より正確にはccissカーネルモジュール)に関して、命名規則の矛盾があることが報告されています。
udevでは、そのデバイスは、/dev/cciss/cXdYpZ(X, Y, Z は規則的な数値)と名前を割り当てられます。devfsでは、そのデバイスは、/dev/hostX/targetY/partZであり、もしくは/dev/cciss/cXdYからシンボリックリンクされます。
このような場合、/etc/fstabとブートローダの設定ファイルを適宜変更することを忘れてはいけません。
例えば/dev/mouseのような、以前は/devに存在していた、すべてのシンボリックリンクにも同じことが起こります。それらは、もはやudevは作成しません。
Xの設定ファイルを必ずチェックして、マウスのDeviceルールが、存在するデバイスファイルを指しているか確認してください。
devfsとudevでは端末デバイスの命名方法に違いがあるという別の問題があります。
devfsは端末デバイスをttyと呼び、udevはvcと呼びます。
これは/etc/securettyを使用してコンソールからrootログインを
制限している場合に問題を引き起こします。
rootユーザがコンソールを使用してログインできるようにするために、
/etc/securettyにおいてtty1がvc/1に変更されているこ
とをよく確かめる必要があります。
その他の問題
デバイスノードが、/etc/modules.autoload.d/kernel-2.6からモジュールが自動でロードされるときには作成されず、modprobeで手動でモジュールをロードしたときには作成されるなら、sys-apps/baselayout-1.8.12かそれ以降のバージョンに更新してみるべきです。
フレームバッファデバイス(/dev/fb/*)のためのサポートは、2.6.6-rc2のバージョンからカーネルに備わっています。
2.6.4より古いカーネルに対しては、/dev/ptsファイルシステムのサポートを明示的に含めなければなりません。
Code Listing 3.6: /dev/ptsファイルシステムの有効化 |
File systems --->
Pseudo filesystems --->
[*] /dev/pts file system for Unix98 PTYs
|
4.
資料と謝辞
Greg Kroah-Hartman(IBM社)による、Linuxシンポジウム(カナダ、オンタリオ州、オタワ - 2003年)でのudev議論は、udevアプリケーションに関して確実な理解を広めました。
Decibel's
UDEV Primer(訳注: decibelsのUDEV手引書)(日本語訳)は、udevとGentooについての詳細な文書です。
Gentoo開発者仲間のDaniel DrakeによるWriting udev rules(訳注: udevルールの書き方)(日本語訳)は、udevの設定をカスタマイズする方法を学ぶためのすばらしい文書です。
The contents of this document are licensed under the Creative Commons -
Attribution / Share Alike license.
|