ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
Main Menu
Tweet
Facebook
Line
:-?
スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
webadm
投稿日時: 2006-3-14 21:53
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3084
vfatをroofファイルシステムに使う時の罠
最初に気づくべきだったが、vfatをrootファイルシステムに使おうとするとすぐに限界にぶつかる。

通常uClinuxのルートファイルシステムでは/sbinは/binのシンボリックリンクになっている、どちらのディレクトリからも同じバイナリが参照されるようにするためだ。

mount -t vfat /dev/hda1 /mnt
cd /mnt
mkdir bin
cp /bin/* bin

とここまでは順調だったが、

ln -s bin sbin

とやったところエラーが出てシンボリックリンクが作成できない。

よく考えたらvfatにはシンボリックリンクという概念がないので作成できるはずもなかった。uClinuxの標準的なファイルシステムではあたりまえのように使われているのでこれは少しまずい。でも容量がいっぱいあるから必要なファイルをコピーしておけばこれはなんとかなる。

これでrootファイルシステムとして立ち上がることはするのだが、もうひとつ/dev配下のデバイスノードを作らないといけない。

これも

cd /mnt
mknod console c 5 1

とかやるとエラーが出る。

vfatにはデバイススペシャルファイルなどの概念はないのであった。

そこでdevfsがあるのかとひらめく。後でやり方を調べてみよう。
webadm
投稿日時: 2006-3-16 3:00
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3084
devfsを有効にすると__set_bitが未解決シンボルになる
とりあえずmake menuconfigでdevfsを有効にしてビルドしてみた。

すると__set_g e2bc47e1860756a435e93604aa9bf0957$df827fd5e9727dec15fa22239bba38332982f85d58cc2c6d34f4bd5c7132ae/16afd396ce6bbec1bd24de4886637b88帚f86fee3cc1ae9f658539266d5810273
JLia7f8c9e638af481664e5a35fb63097i/be7cbb776425e0f7544c4af76e1d514lDf5da4cc33180d0280e656da5668f38427968d81f0be7512ba3bfccd2b7fdc*$I3a819ed3e4a78698aa0b6e6c3b35aa)s;4c1f63e4a552be7457522ad8da63e87jTi8b05d582093aa60694b63240675114Xjb6f69332821147ff9e5a0f1bde8cfd辟d5d49735bbc97dff745b52915f0d226"$
webadm
投稿日時: 2006-3-16 7:35
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3084
inittabの変更が必要だった
以前は/etc/inittabを

ttySC1:linux:/bin/sh

としていたのをとりあえず

console:linux:/bin/sh

に変えてshellが立ち上がるようになった。

引用:
/> ls /dev
root rd pty urandom zero kmem
discs cusc console random port mem
ide ttsc tty full null
/> ls /dev/tty
/dev/tty
/> ls -l /dev
lr-xr-xr-x 1 0 0 33 root -> ide/host0/bus0/target0/lun0/part1
drwxr-xr-x 1 0 0 0 discs
drwxr-xr-x 1 0 0 0 ide
drwxr-xr-x 1 0 0 0 rd
drwxr-xr-x 1 0 0 0 cusc
drwxr-xr-x 1 0 0 0 ttsc
drwxr-xr-x 1 0 0 0 pty
crw------- 1 0 0 5, 1 console
crw-rw-rw- 1 0 0 5, 0 tty
crw-r--r-- 1 0 0 1, 9 urandom
crw-r--r-- 1 0 0 1, 8 random
crw-rw-rw- 1 0 0 1, 7 full
crw-rw-rw- 1 0 0 1, 5 zero
crw-r----- 1 0 0 1, 4 port
crw-rw-rw- 1 0 0 1, 3 null
crw-r----- 1 0 0 1, 2 kmem
crw-r----- 1 0 0 1, 1 mem
/> free
total used free shared buffers
Mem: 2780 1500 1280 0 192
/> ls dev/ttsc
2 1 0
/> ls -l dev/ttsc
crw------- 1 0 0 204, 10 2
crw------- 1 0 0 204, 9 1
crw------- 1 0 0 204, 8 0


devfsを使用した場合にはttySC1はttysc/1
にマップされるのでttySC1は使えなくなったのだった。

あとはuserlandのflatバイナリをもう圧縮する必要がないので非圧縮にしてビルドしなおしてftpでコピーすればコマンドの起動はすばやくなると思われる。さすがに圧縮イメージだと遅い。
webadm
投稿日時: 2006-3-16 17:45
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3084
空きメモリ量がかえって減っている
VFATファイルシステムのHDDをrootファイルシステムにしてromfsを含まないカーネルのみロードして立ち上げても期待したような空きメモリーの増加が得られないことが判明。

ちょっとファイルをアクセスしただけで、空きが1MBを割ってしまうとはなさけない。

引用:

/> free
total used free shared buffers
Mem: 2796 1676 1120 0 192
/> ls
var usr proc mnt home dev etc bin tmp sbin
/> free
total used free shared buffers
Mem: 2796 2080 716 0 356
/>


もしかしてvfatファイルシステムをmountするとFATテーブルとかをメモリ上で管理するためにごっそりカーネルメモリ消費量が増えているのだろうか。それだったらまだビットマップだけで済むext2ファイルシステムの方が効率的ではないのか。

真偽のほどは調査しないとなんとも言えないがあり得る話だ。
webadm
投稿日時: 2006-3-17 19:40
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3084
vfatがメモリを食うわけではないようだ
もう一度romfsに戻して立ち上げてvfatのhddをmountする前と後でfreeメモリー残量を比較してみると、確かに多少はメモリを食うが気にするほどでもなく微量であった。カーネルのソースを見ると最大8ページ分しかFATはメモリ上にキャッシュしないようだし、結果はそれを裏付けていた。

むしろhddをアクセスした時に生じるバッファキャッシュの方が量的には多い。

気になるのはそうすると立ち上がった時点で利用可能なメモリが2796KBあったのに既にそのうちの1676KBが使われてしまっている点だろうか。

それとカーネルが1MBも占有するのも気になるところ。

psを入れて立ち上がった直後のプロセスリストを表示してみるとカーネルプロセスがほとんどでユーザーランドではinitとshellにpsコマンドという感じ。カーネルswapperとかが動いているけどuClinuxはswapをサポートしているのか? なら余っているHDDのスペースにswapパーティションを作ってswapに割り当ててやればメモリを無駄に塞いでいるユーザーランドのプロセスを追い出してくれるのだろうか? 調べてみないとなんとも。

でもswapをサポートしているならforkもサポートできるとは思うのだが。昔から元祖unixはswapをサポートしていたし、forkした子プロセスにメモリを割り当てられない場合にはswap領域に親プロセスのメモリ内容をコピーして後でメモリにswapinされて動くようにお膳立てしてくれたのが少ないメモリ量の時代でも端末を複数つないでマルチユーザーをサポートできたゆえんでもある。

uClinuxは組み込み用でHDDのような大容量の二次記憶装置が利用できないことを前提としているのでswapも働くかどうかも怪しいところではある。
webadm
投稿日時: 2006-3-17 20:28
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3084
swapはサポートされていなかった
busyboxのmkswapやswaponoffを入れてやってみた。

fdiskで2番目のパーティションを切ってlinux swapタイプに設定。

mkswapでswapエリア初期化。

/> mkswap /dev/ide/host0/bus0/target0/lun0/part2
Setting up swapspace version 1, size = 271429632 bytes

これはOK

あとはswaponコマンドで利用開始するだけ

/> swapon /dev/ide/host0/bus0/target0/lun0/part2
swapon: /dev/ide/host0/bus0/target0/lun0/part2: Unknown error 38
pid 30: failed 256

あら、error 38ってなんだろうと調べたら

#define ENOSYS 38 /* Function not implemented */

やはりサポートされてませんでした。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
ページ変換(Google Translation)
サイト内検索