カードに /usr/local のみを置く PocketLinux システム

カードに / を置くとカードが外せなくなるし、 Ramdisk に / を以下すべてを置くのはメモリもディスクも狭すぎて論外だ。 カードを外さなければならないのは LAN カードなどを使う時というような やや特殊な状況であることに鑑み、 カードを外した状態でも使う可能性のあるもののみを ramdisk 上に置くのが妥当なところだろう。

そのための initrd, rootdisk が mizuka-xxx.gz, mizuka-xxx.tar.bz2 である。

Requirements

zimage-xxxx
カーネル(linux-2.0.37p3a-mg xxxx)。 いや、ほんとは自力で構築すべきである ...
modules-xxxx
Kernel modules. もちろん自力で構築すべきである。
mizuka-0.9.gz
Initrd.
mizuka-0.9.tar.bz2
Rootdisk.
これ以外にモバイルギア対応化 LILO や mglilo などが要るのは他のケースと同様。 ここでは mizika 特有の事項のみ説明する。

なお Initrd の mizuka-0.9.gz は /bin, /sbin, /etc, /lib が e2compr の lzrw3a で圧縮されている。 このため組み合わせるカーネルではかならず ext2 file compression, lzrw3a algorithm, indirect cluster bitmap を 'y' にしなければならない (上述カーネルは 'y' になっている)。

Install 前のカードの準備

mizuka-0.9 が期待するカードの構造は、
/dev/hda1
使用せず。
/dev/hda2
ext2 で mkfs されている。boot partition 兼 /usr/local. 10 M バイト以上必要。
/dev/hda3
swap 用。mkswap されていること。 なくてもかまわない。
となっている。akane, mayu と違い、/dev/hda1 は使わない。

カード上への構築

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 は 0.4 から非圧縮 initrd に対応した(する予定)。

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 はこんなもの。

# 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
カードが /flash に mount されているなら、
# lilo -r /flash
で lilo が install されるのはいつもどおり。 さて、カードをモバイルギアに挿して linux を起動する。 うまくいけば ramdisk を / として立ち上がる。
ここで 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 の設定用の本物の lilo.conf である。
           lib/
               mgl/
               modules/
           sbin/
 var/

カードの挿抜

問答無用でいきなりカードを抜き挿ししてはいけない。
  1. カードに書き込んだ(ことになっている)データがまだ実際には 書き込まれていないかもしれない。
  2. カード上のファイルやディレクトリにアクセスしているかもしれない。
    具体的には、card 上の cannaserver が裏で動いているし、 emacs はカード上 (/usr/local/bin/emacs) にあるので emacs を立ち上げたまま カードを抜くと、ことによると emacs が壊れる。
  3. カードを射してある状態では /usr/local/lib のライブラリの存在を ld.so は知っている。カードを抜くまえに /etc/ld.so.conf を書き換えて ldconfig してやらないといけない。
という訳で ATA カードを抜く前に disconnet, ATA カードを挿した後に connect コマンドを使う。 じつは connect は pcmcia-cs で auto run させるべきかもしれないが、 使い方を対称的にするためだけに auto run させていない。
なお、もちろん LAN カード等を挿した時には connect する必要はない。

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 とも適切に書き直さなければならないのは当然である。

modules と各資源

mizuka では ramdisk によって実メモリが圧迫される分、 module として切り離すことができる部分は徹底してカーネルから切り離されている。 立ち上がった時点で 4.7 Mbytes のフリーメモリが残っているので 余裕があるといえばあるが、LAN カードを挿したりした状態では swap がとれないことに注意。

具体的には

それぞれ modules として切り離されているため、各資源を使う前には適切なものを insmod してやらねばならない。

いちばん階層が深いのは 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 しなければならない。この手順はそのためのものである。

ちなみに実際には

# depmod mgdisk
# depmod msdos
# mount /dos/c
# depmod dmsdos
# mount /dos/j
で良い ── でもまだコマンド列が長いな (^^;

運用上の注意事項

ramdisk を / としているために

/ が 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 と LAN カードの routing の衝突

どちらも動き出すと default route を自分のほうに向けようとするが、 たとえば LAN カードの default route が宣言されている状態で PPP を発信すると PPP の default routing で route の気が狂う。

そのため、LAN カードを挿してある場合には PPP 発信する前に default route を削除するか LAN 向け専用に宣言するかしなければならない。

ルータみたいな苦労を PDA でもする ... 一番上の構築済みカーネルは IP forwarding に対応していないので そういうことをしたければ自分で compile するように :-)

特徴、特長

欠陥、バグ