そのための initrd, rootdisk が mizuka-xxx.gz, mizuka-xxx.tar.bz2 である。
なお Initrd の mizuka-0.9.gz は /bin, /sbin, /etc, /lib が e2compr の lzrw3a で圧縮されている。 このため組み合わせるカーネルではかならず ext2 file compression, lzrw3a algorithm, indirect cluster bitmap を 'y' にしなければならない (上述カーネルは 'y' になっている)。
# bzip2 -d < mizuka-0.9.tar.bz2 | tar -xpC /flash必要空き容量は 10 Mbytes 弱、少なくとも 15 Mbytes 欲しい。
bin/
boot/
canna/
dev/
etc/
emacs/
home/
lib/
mgl/
modules/
2.0.37/
block/
fs/
misc/
net/
pcmcia/
sbin/
usr/
sbin/
var/
boot/, dev/, etc/, usr/sbin/ 以外のディレクトリは起動後 /usr/local に mount
されてはじめて意味をもつ。立ち上がるまでに必要なのは boot, dev, etc くらいである。
さて、次に boot/ に mizuka-0.9.gz を gunzip して initrd という名で置く。
# zcat mizuka-0.9.gz > boot/initrdakane, mayu などでは圧縮して(/boot/initrd.gz にして)置いたが mizuka では使用中に initrd の中身を書き換える可能性がある。 loopback mount するため、伸長しておかなければならない。
lib/modules/2.0.37/ 以下に modules-xxxx.tar.gz を展開して置く。 後で注意するが、modules はカードの lib/modules/ 以外に ramdisk の /lib/modules にも置かれている(mizuka-0.9.gz に含まれているのは modules-0804 のサブセット)。 そのため、modules を新しく compile しなおした場合は両方に install する必要がある。 ... というより、ちゃんと両方に install しなおすべきである。
ここでカードの etc/lilo.conf を mglilo かなにかで書き換える。 ちなみに神木の環境での etc/lilo.conf はこんなもの。
カードが /flash に mount されているなら、# LILO configuration file # generated by 'mglilo' # # Start LILO global section boot = /dev/hda disk = /dev/hda bios=0x80 heads=4 sectors=32 cylinders=492 #compact # faster, but won't work on all systems. # delay = 5 # End LILO global section # Linux bootable partition config begins image = /boot/zImage label = linux append = "ide0=noprobe ide1=noprobe" # fstype = ext2 # root = /dev/hda2 root = /dev/ram0 initrd = /boot/initrd read-only # Linux bootable partition config ends
で lilo が install されるのはいつもどおり。 さて、カードをモバイルギアに挿して linux を起動する。 うまくいけば ramdisk を / として立ち上がる。# lilo -r /flash
すればカード(/dev/hda2)を /usr/local に、 boot に使ったカードの initrd を /initrd に mount し、background で cannaserver が立ち上がるはずである。# connect
ディレクトリ構造
/ ......... / は本体 ramdisk の /dev/ram0
bin/
dev/
dos/
c/ ......... いわゆる MG-DOS の C: (/dev/romc)
i/ ......... 同 I: (/dos/c/dblspace.001)
j/ ......... 同 J: (/dos/c/dblspace.002)
etc/
home/
initrd/ ......... カードの boot/initrd が loopback で
bin/ . マウントされる。
dev/ .
dos/ . 当然ながら / と同じディレクトリを
etc/ . 持っている...
home/ . 次回の boot 時に /etc の変更を反映させ
initrd/ . たいなら、/initrc/etc のほうを
lib/ . いじらなければならない。
mnt/
sbin/
tmp/
usr/
var/
lib/
modules/
2.0.37/
fs/ ......... modules は ATA カードを抜いた状態で
misc/ . 使う可能性のあるものだけが pickup して
net/ . ここに置かれている。自分が使うものを
pcmcia/ . あらたに選んで置き直すべきである。
mnt/
sbin/
tmp/
usr/
lib/
local/ ........ /usr/local はカードの /dev/hda2.
bin/
canna/
etc/ ........ ここに "/usr/local/etc/lilo.conf" が
emacs/ . あるが、消してはいけない。
home/ . lilo の設定用の本物の lilo.conf である。
lib/
mgl/
modules/
sbin/
var/
connect, disconnect ともまだ完全ではない、というより単に cannaserver と swap を切り離したり繋いだりするだけなので、/usr/local/bin 以下を使っている最中に disconnect してもちゃんとカードを抜いていい状態になったりはしない。
# cat /sbin/connect
#!/bin/sh swapon /dev/hda3 mount /usr/local /usr/local/sbin/depmod -a insmod /usr/local/lib/modules/2.0.37/block/loop.o mount /initrd cd /etc rm ld.so.conf ln -sf ld.so.connect ld.so.conf ldconfig /usr/local/canna/bin/cannaserver
# cat /sbin/disconnect
#!/bin/sh
sync
kill `ps axw | grep cannaserver | grep -v grep | /usr/local/bin/awk '{print \$1;}'`
swapoff /dev/hda3
umount /initrd
rmmod loop
cd /etc
rm ld.so.conf
ln -sf ld.so.disconnect ld.so.conf
ldconfig
umount /usr/local
/usr/local 下のコマンドをあらたに daemon にして使う場合には connect, disconnect とも適切に書き直さなければならないのは当然である。
具体的には
いちばん階層が深いのは J: ドライブなので、これについて説明する。
C:, J: へのアクセスはカードが挿さっていない状態で使う可能性は ほとんどないし、いずれにせよカードを挿した状態で mount できればカードを抜いても問題はない。 そのため関連 modules はカードに置かれている。
J: の実態は C: にある dblspace.002 なので J: を mount するには C: を先に mount しなければならない。この手順はそのためのものである。# cd /usr/local/lib/modules/2.0.37 # insmod misc/mgdisk.o /* これで C: が使えるようになる。 */ # insmod misc/nls.o # insmod misc/fat.o # insmod misc/msdos.o /* msdos fs を mount するには この三つが必要 */ # mount -r -t msdos /dev/romc /dos/c /* 実際には /etc/fstab にも設定がある。*/ # insmod block/loop.o # insmod misc/dmsdos.o /* 圧縮ドライブを mount するには この二つが必要 */ # mount -r -t msdos /dos/c/dblspace.002 /dos/j -o loop /* 実際には /etc/fstab にも設定がある。*/
ちなみに実際には
で良い ── でもまだコマンド列が長いな (^^;# depmod mgdisk # depmod msdos # mount /dos/c # depmod dmsdos # mount /dos/j
もし .emacs や、あるいは /etc の下を変更する場合には直接書き換えてはいけない。 書き換えた結果を次回の boot 時にも有効にしたいなら /initrd/ 下の対応ファイルを書き換えるべきである。 また、書き換えたあとで
しておくこと。 理論上はしなくても大丈夫な筈だけども、見落としがあるといけないので 記しておく。# /usr/local/sbin/lilo -r /usr/local
そのため、LAN カードを挿してある場合には PPP 発信する前に default route を削除するか LAN 向け専用に宣言するかしなければならない。
ルータみたいな苦労を PDA でもする ... 一番上の構築済みカーネルは IP forwarding に対応していないので そういうことをしたければ自分で compile するように :-)
ディスクキャッシュが効いている間は問題ないが、 swap を使わずに運用し、キャッシュメモリが減るにつれ みるみるうちに遅くなっていく。ここで swapon すると一気に軽くなるあたり、 キャッシュの支配力は大きいようだ。
ATA カードを外した状態、つまり LAN カードや PHS カードを挿した状態で どの程度重い作業をするかにもよるが、 神木のところでは LAN では telnet くらいしか使わないから問題は少ない ...
/lib の内容:--c----B--- 32 lzrw3a 53.2% ld-linux.so.1.9.9 --c----B--- 32 lzrw3a 61.2% ld.so.1.9.9 --c----B--- 32 lzrw3a 57.3% libc.so.5.4.44 --c----B--- 32 lzrw3a 58.2% libcanna.so.1.0.0 --c----B--- 32 lzrw3a 66.7% libdl.so.1.9.9 --c----B--- 32 lzrw3a 57.6% libm.so.5.0.9 --c----B--- 32 lzrw3a 58.3% libtermcap.so.2.0.8 --c----B--- 32 lzrw3a 66.7% libuuid.so.1.1 --c-------- 32 lzrw3a n/a modules... 60% 前後というところで圧縮によって 300kB ほど減っている。 これを伸長しておくのは困難だと思う。
でもやっぱりメモリ 16MB くらい欲しいです > NEC 様。
/bin, /sbin, /etc, /lib とほとんど書き換えることのないディレクトリ下のみ 圧縮しているのは e2fsck を掛けて壊れるのは圧縮されたファイルに限るからで、 復旧を容易にした意味があるが、 e2compr patch のあたっている e2fsck でも initrd に対しては できるだけ fsck するべきではない。
もともと initrd file は読みだし一方であり、/ が幾ら壊れようと あまり困ることはないし(reboot すれば自動的にクリーンになる)、 たかだか 2.5MB のディスクである。2.5MB の initrd を新たに作って tar かなにかでコピーして修復すべきである。