mdev
この記事は、initramfs なしで、分離された /usr パーティションを作成できるよう、Linux の udev を mdev に置換する方法に関する文書です。記事の執筆者は、IceWM をウィンドウマネージャとして利用し、Gentoo Linux を使用しています。ここにある設定方法は、少し調整をすることで他のディストリビューションでも適用できるはずです。
mdev は Busybox による udev の代替で、/dev の内容を作成および更新します (公式ドキュメント) 。eudev または udev を置き換えることは単純ではありませんが、おそらく組み込みシステムには最適なものでしょう。
mdevは私のシステムで動作しますか?
mdev アプリケーションは、システムが本格的なデスクトップ環境を使用していない限り、絶対適しています。デスクトップ環境が AbiWord、Firefox、GIMP、Gnumeric などの実行を必要としないことに注意してください。しかしながら、KMail のような KOffice アプリケーションは、ほとんどの KDE アプリケーションを依存関係として必要とするようです。一般的には、KDE や GNOME を使用する場合、mdev は適していません。また、LVM を使用すると問題を引き起こすかもしれません。
デフォルトのGentooプロファイルを使用している場合、mdevは非常によく動作します:
- default/linux/x86/13.0
- default/linux/amd64/13.0
次のコマンドを使用して、現在使用されているプロファイルを一覧表示します:
user $
eselect profile list
Current /etc/portage/make.profile symlink: default/linux/amd64/13.0
最近のバージョンのevdev(x11-drivers/xf86-input-evdevやwww-client/chromiumを通して提供される)はudevを必要とします。これらはudevなしではビルド出来ません。
udevの依存関係を確かめるためにGentooのユーザが実行できるサニティチェックがもう一つあります。
サニティチェック
どのパッケージがudevに依存しているかの概要を取得します。出力は以下のような感じでしょう:
user $
equery d udev
* These packages depend on udev: media-libs/mesa-9.0.1 (gbm ? virtual/udev) sys-apps/hwids-20130329 (udev ? >=virtual/udev-197-r1) sys-apps/util-linux-2.22.2 (udev ? virtual/udev) virtual/dev-manager-0 (virtual/udev) x11-base/xorg-server-1.13.4 (udev ? >=virtual/udev-150) x11-drivers/xf86-video-intel-2.20.13 (udev ? virtual/udev) x11-libs/cairo-1.10.2-r3 (drm ? >=virtual/udev-136)
以下の行を /etc/portage/package.mask または /etc/portage/package.mask/mdev ファイルに追加してください (もしまだファイルが存在していなければ作成してください):
sys-fs/udev
/etc/portage/make.confでudev
のUSEフラグをシステム全体で無効にします:
root #
euse -D udev
すべてのパッケージを -udev
USE フラグ付きでリビルドします:
root #
emerge -uDNvp @world
もし発生する唯一のエラーが、virtual/dev-managerがudevを必要とするためにPortageがudevを再インストール出来ないというものならば、次のステージに進んでください。そうでなければ、sys-fs/udevは、システムにインストールされているパッケージ(群)の、難しい依存関係に含まれているかもしれません。
追加の段階を必要とするソフトウェア
ATI/AMD バイナリブロブ
ATI/AMD Radeonカードの中にはバイナリブロブを必要とするものがあります。Gentooのsys-firmware/radeon-ucodeパッケージは、多くの異なったモデルに対応するため、http://people.freedesktop.org/~ag5f/radeon_ucode/で利用できるすべてのバイナリブロブを取得します。
libraryディレクトリにあるすべてのバイナリブロブに対し、カーネルは多くのバイナリブロブの中からどれをロードするかを決定するためにudevを必要とします。もし、libraryディレクトリにある正しいバイナリブロブを残し、それ以外をすべて削除すると、バイナリブロブは自動的にロードされます。
udevをmdevに置き換える
これは非常に重要な段階で、結果的にLinuxシステムが起動不可能になるかもしれません。上記の方法でいかなるudevの依存関係も見つからなかった時だけ実行してください。
devtmpfs用にカーネルを設定する
カーネルが devtmpfs ファイルシステムをサポートし、また /dev に自動的にマウントするように設定します:
Device Drivers --->
Generic Driver Options --->
[*] Maintain a devtmpfs filesystem to mount at /dev
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
変更したらカーネルを再ビルドします。絶対に再起動しないでください。
busyboxのemerge
sys-apps/busybox で、mdev
USE フラグが設定されていることを確かめてください。static
USE フラグを設定することも多分良い考えでしょう。/etc/portage/package.use または /etc/portage/package.use/mdev ファイルに以下の行を追加してください:
sys-apps/busybox static mdev
それでは、busyboxを(再)インストールしましょう:
root #
emerge --ask --oneshot busybox
devptsのマウント
devpts ファイルシステムは普通ではない振る舞いをします。このファイルシステムは、起動時や mount -a では自動的にマウントされません。明示的に mount devpts コマンドを実行することが必要です。udev ベースのシステムの標準的な解決策は、rc-update add udev-mount sysinit をルートで実行し、開始時に udev-mount スクリプトにマウントを行わせることです。mdev ベースのシステムでは、udev は多分インストールされていないでしょう。起動時にマウントさせる他の方法は、mount devpts コマンドを /etc/local.d/ 内のシェルスクリプトに含めることです。以下の例では、ファイルの名前は /etc/local.d/000.start です。
udev-mountを使用しない他の副作用は、/dev/shmがルートにのみ書き込み可能になるということです。通常の振る舞いをさせるために、chmod 1777 /dev/shmコマンドが必要です。このコマンドは開始時にスクリプトから実行させることが出来ます。
#!/bin/bash
mount devpts
chmod 1777 /dev/shm
/etc/local.d/で使用されるスクリプトは
- 実行可能ファイルでなければなりません
- スタートアップ時に実行する場合は".start"拡張子でなければなりません
- シャットダウン時に実行する場合は".stop"拡張子でなければなりません
udevサービスの置換
サービス一覧からudevを削除し、mdevに置き換えます:
root #
rc-update del udev sysinit
root #
rc-update add mdev sysinit
再起動
新しいカーネルを使用するために再起動します。これでシステムはmdevを使用し実行されているはずです。
後片付け
udevをシステムから削除します:
root #
emerge --ask --depclean --verbose sys-fs/udev sys-fs/eudev
/etc/portage/package.mask ファイル (あるいはこのディレクトリ内にあるファイル) に、sys-fs/udev および sys-fs/eudev を追加します。
これで完全にudevを使用しないマシンが完成します。
CUPSの下で動作しているUSBプリンタの設定
起動時早期に'find'を利用可能にする
root #
cd /bin
root #
ln -s /bin/busybox find
カーネルの再ビルド
libusb(そしてCUPS)がUSBポートを確認するために、カーネル設定のCONFIG_USB_DEVICE_CLASS=y
とCONFIG_USB_DEVICEFS=y
を設定してください。そして、cups-1.5.2のebuildが無効にしているのを無視して、CONFIG_USB_PRINTER=y
を有効にしてください。make menuconfigを使用しているなら、これらはここで見つかります:
Device Drivers --->
[*] Support for Host-side USB
[*] USB device filesystem [DEPRECATED]
[*] USB device class-devices [DEPRECATED]
[*] USB Printer support
DEPRECATEDの警告については心配しないでください。
新しいカーネルをブートローダに設定し再起動する
新しいデバイスノードの存在を確かめる
デバイスノードの階層は/dev/bus/usb/以下にあるはずです。プリンタを起動すると、プリンタへのノードは/dev/lp0に出現するはずです。lsusbの実行は成功し、そしてプリンタの詳細を表示するはずです。
CUPSでプリンタの設定をする
通常の方法で CUPS を設定してください。CUPS はプリンタを検出するはずで、parallel:/dev/lp0 のような URI を与えるはずです。
トラブルシューティング
起動シーケンスでLinuxモジュールが見つからない
もしLinuxモジュールが必要で、mdevへの移行後、起動時にロードされない場合、以下の解決策を実行してください:
- Linuxモジュールを/etc/modules-load.d/ファイルの
*.conf
ファイルに追加する
- モジュールをLinuxカーネルにコンパイルします。必要に応じてロードする必要はありません。
- カスタムモジュールローダを書きます:
#!/bin/sh test -n "$MODALIAS" && modprobe "$MODALIAS"; exec /sbin/mdev
これを、mdevの代わりにホットプラグハンドラとしてインストールしてください。より早く実行させるとより良いことに注意してください。このスクリプト/sbin/hotplugの名前を考慮してください、これは/proc/sys/kernel/hotplugの既定値です(あるいはカーネル設定で既定値を変更してください)。
その他
これらのインストラクションは、元々Walter Dnesによって書かれ、彼の個人的なウェブサイトで紹介されていたものです。これらは、gentoo-userメーリングリストでの議論の度に、Michael Molによる少しの編集ののちGentoo wikiに取り込まれました。
- udevと異なり、mdevは自動モジュールロードに対応していません。
.conf
で終わるファイルを/etc/modules-load.d/に作成し、各行にロードされるべきモジュール(nvidia、wlなど)を1つずつファイルに書いてください。/etc/modprobe.d内の.conf
で終わるファイルを利用してオプションを変更してください(文法についてはman 5 modprobe.dを確認してください)。モジュール設定をこの場所に移す必要があるかもしれません。
- mdev -sは/dev/mapperノードを作成しません。手動でこれを作成するか、lvm2からdmsetup mknodesを使用してください。初期スクリプトの中で、mdev -sのあとにそれを追加するのはいい考えです。
- xorgインプットのためにマウスとキーボードのドライバを使用してください。Evdevはビルドするためにudevを必要とします。(マウスドライバのための)Mousedrvとsynapticドライバは、両方がロードされた時に衝突するかもしれません。
- カーネル設定オプションのCONFIG_INPUT_EVDEVは、入力デバイスイベントとしてキーボードとマウスだけではなく、蓋とボタンもacpidに伝えます。
関連項目
- Mdev/Automount USB — describes how to implement automounting of USB devices on a machine using mdev as the device manager.
外部資料
- mdev like a bossプロジェクト.