PocketLinux は initrd という仕掛けを経由してブートします。 また、設定の多くはカードが母艦に繋がった段階で行なわれます。 普段から linux を使っていてもあまり気にしたことのない設定があらわれます。
詳細は ext-root-mini-HOWTO を参照してください。 この章ではモバイルギア特有のものについて説明します。
PocketLinux の場合、 初めて LILO を設定するマシンと、LILO によって起動されるマシンが異なる、 という点に難しさがあります。
以下は PocketLinux 用 /etc/lilo.conf の一例 ( akane 用) です。
# LILO configuration file # generated by 'mglilo ver. 0.4' # # Start LILO global section boot = /dev/sdc # serial=0,9600n8 disk = /dev/sdc bios=0x80 heads=4 sectors=32 cylinders=491 #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 initrd = /boot/initrd read-only # Linux bootable partition config ends
boot, disk が /dev/sdc になっていますが、これは手元の環境ではカードを母艦で
マウントした時に /dev/sdc に見えるからです。
多くの場合、/dev/hdc や /dev/hde に見えるでしょう。
lilo -r で lilo を設定する場合には、boot, disk には母艦でのカードのデバイス名を指定します。
# mount -t ext2 /dev/sdc1 /mnt
# lilo -r /mnt
などとして lilo を設定します。
注意点は二つ。
モバイルギアでの / パーティションは 3 箇所で指定可能です。 いずれの場合も / として指定するのはモバイルギアが立ち上がった時の デバイス名になります。母艦での名前ではありません。
この中の /proc/sys/kernel/real-root-dev への代入による指定。
これが最優先になります。
これを省略し、lilo.conf に / パーティション指定を任せた場合、まれに
/ の remount に失敗して read-only のままになってしまうことがあるようです。
この中の "root =" による指定。
lilo.conf 内で指定した場合、linuxrc を読みにいかないことがあるようです。
rdev zImage による指定。linuxrc, lilo.conf に何も指定しないとき、 カーネル内で指定された / が使われます。
mizuka など ramdisk を(最終的な) ルートパーティションにする場合には "root = /dev/ram0" を設定して下さい。この場合は linuxrc は使われず、 直接 init が立ち上がります。
無くても動くものもありますが、 あって困る副作用は無いので、念のためつけておいてください。
mglilo は母艦からモバイルギアのカード用の lilo の設定をする簡単なスクリプトです。
[usage] mglilo [-d] [-r path] [-k zImage] [-l lilodir] [-i initrd] [-g C/H/S] [-v] device
[option]
-d デバッグモード。カードに何も書き込みません。
-r / partition を指定します。
-k 母艦上の zImage のパスを指定します。
-l モバイルギアパッチのあたった lilo ソースディレクトリを指定します。
-i 母艦上の initrd, initrd.gz のパスを指定します。
-g カードのジオメトリを直接指定します。
-v verbose option.
カードに lilo を移し、ジオメトリを取得して etc/lilo.conf をつくり、lilo -r という動作をします。
# ./mglilo カードデバイス(eg. /dev/hde)
する。一般に PC 用のハードディスクの BR (boot record) の最後は 0x55 0xAA になっています。 PC の BIOS は、ここが 0x55 0xAA になっている BR を正常な PC の boot record とみなして実行します。
モバイルギアの場合、ATA カードの MBR (master boot record) の最後が '55AA' になっているだけでは カードの BR を読み込みません。 55AA の直前の 2 バイトが 0x4e 0x53 になっている場合にのみ、boot record と解釈します。
DOS 化モバイルギアでの carb は、この位置に 4e 53 を書き込んだり外したりするソフトですが、 同じことは linux からでも必要です。
まず、 major 78, minor 83 なる blk device の /dev/necmg を母艦につくります。
% ls -l /dev/necmg
brw-r--r-- 1 root root 78, 83 Mar 4 22:34 /dev/necmg
です。ここでフラッシュカードのデバイスが /dev/sdc とすれば
rdev /dev/sdc /dev/necmg
とすると、カードに上記のマーカが書き込まれます。 rdev は本来 / partition の位置や ramdisk のサイズなどを zImage に書き込むプログラムですが、 zImage 上の / partition を指定する位置がちょうど上記マーカの部分にあたっているので、 代用してしまっています。
一般の PC の場合、MBR 上のこのマーカの位置は partition table の 4 つ目の最後の 2 バイトにあたります。 このため、マーカを書き込むと 4 番目のパーティション(のサイズの項)が破壊されるので、 モバイルギアではカードには基本パーティションは 3 つしか置けません。
linux が起動し、カードのパーティションテーブルを認識した際に
Partition check:
hda: hda1 hda2 hda4
などと存在しない筈の hda4 が見えているのはマーカのためです。
fdisk では、そのまま p としたのでは hda4 は見えませんが、x で
expert mode に入ったのちに p とすると hda4 が空 (すべてのバイトがゼロ) ではないことが確認できます:
Command (m for help): x
Expert command (m for help): p
Disk /dev/sdc: 4 heads, 32 sectors, 491 cylinders
Nr AF Hd Sec Cyl Hd Sec Cyl Start Size ID
1 00 1 1 0 3 32 80 32 10336 82
2 80 0 1 81 3 32 490 10368 52480 83
3 00 0 0 0 0 0 0 0 0 00
4 00 0 0 0 0 0 0 01314062336 00
Expert command (m for help): q
initrd は原則として内容を触るべきではありませんが、 / partition の位置の設定は initrd の中で行なうのが確実ということもあって akane のデフォルトでは initrd 内で /dev/hda2 を指定しているので、 /dev/hda1 などを / にしたい場合には initrd (のうちの linuxrc) の内容を書き換える必要があります。 もっとも、これもカードの partitioning のほうで /dev/hda1 を / にするのでなく、/dev/hda2 を / にするようにしたほうがトラブルは少ないでしょう。
また、pcmcia-cs を再構築した際には initrd 内に含まれる pcmcia-cs も書き換える必要があります。
Linux が立ち上がる時、initrd ファイルは gzip 圧縮されていても構わないことになっていますが、 mizuka では圧縮しませんし、akane も MK32 の場合は圧縮する意味はほとんどないようです。
initrd ファイルは圧縮して initrd.gz の形で
rootdisk の /boot/ に収められています
(mizuka では initrd のままの形で /boot/
に置かれています)。
母艦が loopback filesystem をサポートしているなら、
# zcat < initrd.gz > /tmp/initrd
# mount -t ext2 /tmp/initrd /mnt -o loop
として /mnt にマウントできるでしょう。initrd の customization が終わったら
# sync
# umount /mnt
# gzip -9 < /tmp/initrd > initrd.gz
として圧縮し、initrd.gz に上書きします。
実際に書き換える可能性があるのは initrd 内の pcmcia-cs と linuxrc でしょう。
linuxrc は(コアパッケージ mizuka など少数の例外を除いて) initrd を ramdisk にコピーし、 これを / として linux が起動した時に最初に実行するスクリプトです。
/ に置かれていて、以下のような内容になっています (akane 用)。
#!/bin/sh # Should be either i82365 or tcic PCIC=i82365 # Put socket driver timing parameters here PCIC_OPTS= # Put pcmcia_core options here CORE_OPTS= mount -t proc /proc /proc echo "" echo "==== initrd: starting PCMCIA services ====" echo "" PC=/lib/pcmcia insmod $PC/pcmcia_core.o $CORE_OPTS insmod $PC/$PCIC.o $PCIC_OPTS insmod $PC/ds.o if [ "$DEBUG" != "" ] ; then V=-v ; fi cardmgr $V -q -o -c /etc -m /lib -s /tmp/stab -p /tmp/pid # sleep 15 echo "" echo "go /dev/hda2 ...." echo "0x0302" > /proc/sys/kernel/real-root-dev umount /proc
このスクリプトの場合、pcmcia-cs の各ファイルは pcmcia ide に関するごく少数のファイルだけということもあって 通常の /lib/modules/`uname -r`/pcmcia/ ではなく /lib/pcmcia 下に置かれることを仮定しています。
最後から 2 行目の
echo "0x0302" > /proc/sys/kernel/real-root-devは本当の / partition を定め、この場合は /dev/hda2 (major = 3, minor = 2) になります。
ところで、 一部のカードでは pcmcia-cs のリセットが間に合わず、/ の remount に失敗することがあります。 この場合は
# sleep 15のコメントをはずしてみてください。