Ramdisk を / とし、カードを /usr/local/ にするコアパッケージです。 普段はカードを /usr/local にマウントして使い、 LAN に繋ぎたい時だけカードを切り離して使うことを想定したものです。
2.0.38 版はまだ用意されていません。自力構築する必要があります。
カーネル(linux-2.0.37p3a-mg0804)。
上記カーネルの modules.
Initrd.
Rootdisk.
これ以外にモバイルギア対応化 LILO や mglilo などが要るのは他のケースと同様です。 ここでは mizika 特有の事項のみ説明します。
なお initrd の mizuka-0.9.gz は /bin, /sbin, /etc, /itemb が e2compr の lzrw3a で圧縮されているため、 組み合わせるカーネルではかならず ext2 file comverbssion, lzrw3a algorithm, indirect cluster bitmap を 'y' にしなければなりません。 上述カーネルでは 'y' になっています。
mizuka-0.9 が期待するカードの構造は、
使用せず。
ext2 で mkfs されている。boot partition 兼 /usr/local. 10 M バイト以上必要。
swap 用。mkswap されていること。
となっています。
/dev/hda1 は使われていません。
この部分に / partition を用意することで mizuka, akane の dual boot
に対応させることが予定されているからです。
mizuka-0.9.tar.bz2 を ext2 で mkfs した /dev/hda2 に展開します。
# 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/initrd
かつての akane, mayu などでは圧縮して(/boot/initrd.gz にして)置いていますが
mizuka では使用中に initrd の中身を書き換える可能性があります。
直接 loopback mount するために伸長しておくほうが便利でしょう。
なお mglilo は ver. 0.4 から非圧縮 initrd に対応しました。
lib/modules/2.0.37/ 以下に modules-0804.tar.gz を展開して置きます。 modules はカードの lib/modules/ 以外に ramdisk の /lib/modules にも置かれています(こちらは mizuka-0.9.gz に含まれる)。 そのため、modules を新しく compile しなおした場合は両方に install する必要があります。
ここでカードの etc/lilo.conf の root= を root=/dev/ram0 と書き換え、 カードをモバイルギアに挿して linux を起動します。
ここで root で login したのち
# connect
すればカード(/dev/hda2)を /usr/local に、
boot に使ったカードの initrd を /initrd に mount し、background で
cannaserver が立ち上がるはずです。
ディレクトリ構造
/ ......... / は本体 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.conf です。
lib/
mgl/
modules/
sbin/
var/
問答無用でいきなりカードを抜き挿ししてはいけません。
という訳で ATA カードを抜く前に disconnet, ATA カードを挿した後に connect コマンドを使います。 じつは connect は pcmcia-cs で auto run させるべきかもしれませんし、 将来そうなるかもしれませんが、今のところは connect と disconnect で使い方を対称的にするためだけに auto run させていません。 LAN カード等を挿した時には connect する必要はありませんが、 こちらも将来 lan-connect のようなコマンドが用意されるかもしれません。
connect, disconnect ともまだ完全ではありません、というより単に cannaserver と swap を切り離したり繋いだりするだけなので、/usr/local/bin 以下を使っている最中に disconnect してもちゃんとカードを抜いていい状態になったりはしません。
特に、比較的古い mount/umount を使っていると loopback modules が外れなくなることがあります。 新しい、loopback option に対応した mount/umount command を使うように してください。
# 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 とも適切に書き直さなければならないのは当然です。 これも将来、mizuka での設定コマンドが用意されると思います。
mizuka では ramdisk によって実メモリが圧迫される分、 module として切り離すことができる部分は徹底してカーネルから切り離されています。 立ち上がった時点で 4.7 Mbytes のフリーメモリが残っているので 余裕があるといえばありますが、 LAN カードを挿したりした状態では swap がとれないことに注意してください。 また、このメモリには ramdisk 分が含まれているようです。
具体的には
いちばん階層が深いのは J: ドライブなので、これについて説明します。
C:, J: へのアクセスはカードが挿さっていない状態で使う可能性は ほとんどないし、いずれにせよカードを挿した状態で mount できればカードを抜いても問題ないので、 関連 modules はカードに置かれています。
# 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 にも設定がある。*/
J: の実態は C: にある dblspace.002 なので J: を mount するには C: を先に mount しなければなりません。
実際には適切に depmode -a してあれば
# depmod mgdisk
# depmod msdos
# mount /dos/c
# depmod dmsdos
# mount /dos/j
で良いはずです。
/ が ramdisk に置かれているため電源断で内容がクリアされてしまいます。 普段は suspend, resume を使っていること、~/ などの backup/restore の負荷が重いために connect, disconnet では~/ の backup/restore をしていません。 実用上は ~user/ の代りに /usr/local/home/user/ が使われるはずであり、 ~/ には .emacs などの設定ファイルのみになるだろうということもありますが。
もし .emacs や、あるいは /etc の下を変更する場合には直接書き換えてはいけません。
書き換えた結果を次回の boot 時にも有効にしたいなら
かならず /initrd/ 下の対応ファイルを書き換えるべきです。
また、書き換えたあとで
# /usr/local/sbin/lilo -r /usr/local
しておく必要があるかもしれません。
理論上はしなくても大丈夫な筈だけども、見落としがあるといけないので記しておきます。
デフォルトでは PPP も pcmcia-cs LAN もどちらも動き出すと default route を自分のほうに向けようとします。 このため、 たとえば LAN カードの default route が宣言されている状態で PPP を発信すると PPP の default routing の setup のところで route がおかしくなってしまいます。
LAN カードを挿してある場合には PPP 発信する前に default route を削除するか LAN 向け専用に宣言するかしなければなりません。
もっとも connect/disconnect の運用の負担はけっこう重いかもしれません。
必要なものは本体に入っているため、カードへのアクセスは少ないです。
デメリットは以下のようなものでしょうか。
ディスクキャッシュが効いている間は問題ないのですが、 swap を使わずに運用し、キャッシュメモリが減るにつれ みるみるうちに遅くなっていきます。ここで swapon すると一気に軽くなるあたり、 キャッシュの支配力はかなりのものがあります。
/bin, /sbin, /etc, /lib とほとんど書き換えることのないディレクトリ下のみ 圧縮しているのは e2fsck を掛けて壊れるのは圧縮されたファイルに限るからで、 復旧を容易にした意味があるのですが、 e2compr patch のあたっている e2fsck でも initrd に対しては できるだけ fsck するべきではないようです。
cannaserver と交信する /bin/ng は disconnect/connect の最中でも立ち上がったままに できるますが、ふたたび connect したあとには cannaserver との通信ができなくなっています。 当然といえば当然ですが、ng も立ち上げ直さなければなりません。