5 ブートまでの設定

この章の目次へ

PocketLinux は initrd という仕掛けを経由してブートします。 また、設定の多くはカードが母艦に繋がった段階で行なわれます。 普段から linux を使っていてもあまり気にしたことのない設定があらわれます。

詳細は ext-root-mini-HOWTO を参照してください。 この章ではモバイルギア特有のものについて説明します。

5.1 LILO の設定

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 を設定します。

注意点は二つ。

root 項

モバイルギアでの / パーティションは 3 箇所で指定可能です。 いずれの場合も / として指定するのはモバイルギアが立ち上がった時の デバイス名になります。母艦での名前ではありません。

linuxrc

この中の /proc/sys/kernel/real-root-dev への代入による指定。 これが最優先になります。 これを省略し、lilo.conf に / パーティション指定を任せた場合、まれに / の remount に失敗して read-only のままになってしまうことがあるようです。

lilo.conf

この中の "root =" による指定。 lilo.conf 内で指定した場合、linuxrc を読みにいかないことがあるようです。

zImage

rdev zImage による指定。linuxrc, lilo.conf に何も指定しないとき、 カーネル内で指定された / が使われます。

mizuka など ramdisk を(最終的な) ルートパーティションにする場合には "root = /dev/ram0" を設定して下さい。この場合は linuxrc は使われず、 直接 init が立ち上がります。

append="ide0=noprobe" 項

無くても動くものもありますが、 あって困る副作用は無いので、念のためつけておいてください。

5.2 mglilo

mglilo とは

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 の使い方

  1. mglilo を パッチをあてた lilo ディレクトリに置く。
  2. 適当にフラッシュカードを ext2 or minix で mkfs し、 上記パッチをあてた kernel から make した zImage を カードの boot/zImage にコピー。
  3. initrd.gz もカードの boot/initrd.gz へ。
  4. lilo ディレクトリにうつって su root し、
    # ./mglilo カードデバイス(eg. /dev/hde)
    
    する。
として使いますが、詳細は mglilo の
ソース を参照してください。

5.3 モバイルギアのブートマーカ

一般に 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

5.4 initrd ファイルの設定

initrd は原則として内容を触るべきではありませんが、 / partition の位置の設定は initrd の中で行なうのが確実ということもあって akane のデフォルトでは initrd 内で /dev/hda2 を指定しているので、 /dev/hda1 などを / にしたい場合には initrd (のうちの linuxrc) の内容を書き換える必要があります。 もっとも、これもカードの partitioning のほうで /dev/hda1 を / にするのでなく、/dev/hda2 を / にするようにしたほうがトラブルは少ないでしょう。

また、pcmcia-cs を再構築した際には initrd 内に含まれる pcmcia-cs も書き換える必要があります。

initrd のマウント

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 スクリプト

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
のコメントをはずしてみてください。

次の章へ , 前の章へ

この章の目次へ, この文書の目次へ

この文書の最初へ , この章の最初へ