naruakiの日記: DEVFS 廃止対応
日記 by
naruaki
DEVFS 廃止対応
==============
2006/08/04
* ----------------------------------------------------------------- *
・はじめに
Linux 2.6.13 以降は、devfs が廃止(OBSOLETE)となった。
.confg : CONFIG_DEVFS_FS
-> File systems
-> Pseudo filesystems
-> /dev file system support
・/dev とは
Unix系オペレーティング・システムでは /dev以下にデバイス・ノードファ
イルという特別なファイル群をあらかじめ設けておいて、ユーザ空間のア
プリケーションとカーネルやデバイスドライバとの接続点として利用され
ている。(歴史的慣例と互換性が理由であることが大きい)
例) open("/dev/stdout")
# cat /dev/device -- read
# echo set > /dev/device -- write
慣例と互換性 --- が、欠点もあり、その克服の Linux での実装が devfs
であった。(2.2.x 系 ~ 2.4.x 系)
・udev の登場と、devfs の廃止
- kernel との連携が面倒である
- デバイスの動的なコンフィギュレーションに対応
例) USB ポートにデバイスが追加された
(1) デバイスのドライバ登録
(2) ユーザから使用可能状態にする。(ex. mount、IP 設定)
=> 最終的にユーザ・ランドが介入せざるをえない。
ならば、devfs で頑張っても仕方ないですね。
- 第三の選択
devfs、udev 機能は使わずに、ストレージ(HDD)に、デバイス・ノード
ファイルを、「あらかじめ」作成しておく。 (先祖返りな手法)
※デバイスが静的(固定)ならば、当手法で問題なし。
・devfs 有/無における相違
(A) devfs 有
# insmod driver.ko ... /dev/driver を利用可
(B) devfs 無
# insmod driver.ko & mknod /dev/driver c 2xx 0
※driver __init() 内で、devfs を利用する register APIを使用
OBSOLETE 後は、当APIが使用不可なので、修正要。
=> kernel include で吸収しているので、当 kernel の include
指定が必須。
(a) devfs 有
- /root ファイル・システムに、/dev エントリのみあれば良い
(b) devfs 無
- /dev 以下にデバイス・ノードファイル(群)を用意しておく必要がある。
>>> #ls /dev ... 何が本当に必要か判断つきますか?
/dev/ppp : kernel が ppp サポートしていなければ不要
(sysfs を参考に判断する:/proc/devices)
※ sysfs 2.6.x系から実装
- デバイス・ノードファイル が無いと ...
o /dev/console : シリアル・コンソールが使用できません
o /dev/pts : telnet login できません ※ftp などは使用できる
o /dev/mtd : flash ファイル・システムが使えない
* ----------------------------------------------------------------- *
・対応方法
- Embedded の強い味方 busybox (http://www.busybox.net/) 1.2.1
- mdev : /etc/init.d/rcS にて、/sbin/mdev -s
=> sysfs より情報入手し、/dev 以下のデバイス・ノードファイルを
作成してくれます。
別途、/etc/mdev.conf による指示も可能。(? 試してません)
<<注意点>>
- 命名則が異なります。
ex) devfs /dev/mtdblock/0 --- mdev /dev/mtdblock0
ある意味、devfs が特殊であった。(先祖返り)
- sysfs に基づいて、/dev/... を作成する
=> # insmod driver.ko --> /sys/class/driver/dev は作成される
# mdev -s とすれば、再参照するので、/dev/driver は作成される
# rmmod driver --> /sys/class/driver/dev は削除される
# mdev -s としても、/dev/driver はそのまま。
※何か抜けている?
<<解決策>> -> # echo "/sbin/mdev" > /proc/sys/kernel/hotplug
[.config]
CONFIG_HOTPLUG=y
[rcS]
/sbin/mdev -s
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
- 些細な変更点
o /root FS、/dev/console を mknod であらかじめ作成
o mkdir /dev/pts を実施 (mount -t devpts none /dev/pts は従来通り)
o /etc/inittab tts/0 -> ttyS0 (Console)
o auxinfo.c の誤り /dev/mem を潰してしまっていた (ポーティング問題)
・その他 (busybox-1.2.0)
- 気をつけて config しましょう
o /bin/sh が無い (とりあえず、ash を選択)
o ipcalc, long option が使えない
o symbolic-link の張り方(install.sh オプション相違)
o cmp、dirname、basename (デフォルトで disable、必要なもの)
- /dev/ram : CONFIG_BLK_DEV_RAM_COUNT (不要な数を減らす)
- /sys/class : char-dev :
- /sys/block : block-dev :
デバイス・ノードファイル が作成されない場合には、上記にて、
kernel の認識を確認する。
- <参考ソース> ~/drivers/net/ppp_generic.c
o デバイスの登録
o sysfs への登録など(など ...)
<<添付>>
ユーザランドの差分 (diff -rcN)
==============
2006/08/04
* ----------------------------------------------------------------- *
・はじめに
Linux 2.6.13 以降は、devfs が廃止(OBSOLETE)となった。
.confg : CONFIG_DEVFS_FS
-> File systems
-> Pseudo filesystems
-> /dev file system support
・/dev とは
Unix系オペレーティング・システムでは /dev以下にデバイス・ノードファ
イルという特別なファイル群をあらかじめ設けておいて、ユーザ空間のア
プリケーションとカーネルやデバイスドライバとの接続点として利用され
ている。(歴史的慣例と互換性が理由であることが大きい)
例) open("/dev/stdout")
# cat /dev/device -- read
# echo set > /dev/device -- write
慣例と互換性 --- が、欠点もあり、その克服の Linux での実装が devfs
であった。(2.2.x 系 ~ 2.4.x 系)
・udev の登場と、devfs の廃止
- kernel との連携が面倒である
- デバイスの動的なコンフィギュレーションに対応
例) USB ポートにデバイスが追加された
(1) デバイスのドライバ登録
(2) ユーザから使用可能状態にする。(ex. mount、IP 設定)
=> 最終的にユーザ・ランドが介入せざるをえない。
ならば、devfs で頑張っても仕方ないですね。
- 第三の選択
devfs、udev 機能は使わずに、ストレージ(HDD)に、デバイス・ノード
ファイルを、「あらかじめ」作成しておく。 (先祖返りな手法)
※デバイスが静的(固定)ならば、当手法で問題なし。
・devfs 有/無における相違
(A) devfs 有
# insmod driver.ko ... /dev/driver を利用可
(B) devfs 無
# insmod driver.ko & mknod /dev/driver c 2xx 0
※driver __init() 内で、devfs を利用する register APIを使用
OBSOLETE 後は、当APIが使用不可なので、修正要。
=> kernel include で吸収しているので、当 kernel の include
指定が必須。
(a) devfs 有
- /root ファイル・システムに、/dev エントリのみあれば良い
(b) devfs 無
- /dev 以下にデバイス・ノードファイル(群)を用意しておく必要がある。
>>> #ls /dev ... 何が本当に必要か判断つきますか?
/dev/ppp : kernel が ppp サポートしていなければ不要
(sysfs を参考に判断する:/proc/devices)
※ sysfs 2.6.x系から実装
- デバイス・ノードファイル が無いと ...
o /dev/console : シリアル・コンソールが使用できません
o /dev/pts : telnet login できません ※ftp などは使用できる
o /dev/mtd : flash ファイル・システムが使えない
* ----------------------------------------------------------------- *
・対応方法
- Embedded の強い味方 busybox (http://www.busybox.net/) 1.2.1
- mdev : /etc/init.d/rcS にて、/sbin/mdev -s
=> sysfs より情報入手し、/dev 以下のデバイス・ノードファイルを
作成してくれます。
別途、/etc/mdev.conf による指示も可能。(? 試してません)
<<注意点>>
- 命名則が異なります。
ex) devfs /dev/mtdblock/0 --- mdev /dev/mtdblock0
ある意味、devfs が特殊であった。(先祖返り)
- sysfs に基づいて、/dev/... を作成する
=> # insmod driver.ko --> /sys/class/driver/dev は作成される
# mdev -s とすれば、再参照するので、/dev/driver は作成される
# rmmod driver --> /sys/class/driver/dev は削除される
# mdev -s としても、/dev/driver はそのまま。
※何か抜けている?
<<解決策>> -> # echo "/sbin/mdev" > /proc/sys/kernel/hotplug
[.config]
CONFIG_HOTPLUG=y
[rcS]
/sbin/mdev -s
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
- 些細な変更点
o /root FS、/dev/console を mknod であらかじめ作成
o mkdir /dev/pts を実施 (mount -t devpts none /dev/pts は従来通り)
o /etc/inittab tts/0 -> ttyS0 (Console)
o auxinfo.c の誤り /dev/mem を潰してしまっていた (ポーティング問題)
・その他 (busybox-1.2.0)
- 気をつけて config しましょう
o /bin/sh が無い (とりあえず、ash を選択)
o ipcalc, long option が使えない
o symbolic-link の張り方(install.sh オプション相違)
o cmp、dirname、basename (デフォルトで disable、必要なもの)
- /dev/ram : CONFIG_BLK_DEV_RAM_COUNT (不要な数を減らす)
- /sys/class : char-dev :
- /sys/block : block-dev :
デバイス・ノードファイル が作成されない場合には、上記にて、
kernel の認識を確認する。
- <参考ソース> ~/drivers/net/ppp_generic.c
o デバイスの登録
o sysfs への登録など(など ...)
<<添付>>
ユーザランドの差分 (diff -rcN)