ROM の入れ換え


ROM 周りの扱いがなんとなく分かったところで ROM root fs の入れ換え。 リセット押すたびに /etc/inetd.conf を echo で書き換えるのはごめんである。
... と、そのまえにカーネルも作っておく。 まだ交換はしないけど、ROM 書き込み時に中途半端に誤動作されても困る。

arm-linux-gcc

面倒なので宝箱からとってきた rpm を alien で直して入れた。コードは /opt/Embedix/tools 以下に入る。

ここで「面倒」っつうのは、既に /usr/local/bin/arm-linux-gcc とか入ってんだけど、 ザウルスのカーネルを make するときに正しく動くんかとかあるからだ。 glibc 2.2.2 の前後っていろいろ面倒くって。
たとえば、29 日の項でちらと書いたが、glibc 2.2.2 は 2.2.x を名乗ってても woody の 2.2.5 より potato の 2.1.3 に近いくらいで、woody のコードは 2.2.2 じゃ動かんことがある。 さっさと 2.2.5 に入れ換えたいぞぅ。

カーネル

細かいことだがソースのページに唯一 URL の記述がない patch-2.4.13-ac5-rmk2-iop310.1.gz は <ftp://source.mvista.com/pub/ds-patches/old/> の下にある。 ところで、これはファイル名を google に突っ込んで出てきたディレクトリの近所を漁ったら出てきた。 それくらいはシャープさんとこでもやってくれ。ディレクトリが消えてたくらいで諦めんなよな ...

/opt/Embedix/tools/* で Psion5/mx のカーネル作れるかってのも未検証なので PATH には入れず、かわりにカーネルソースの Makefile を一行いじった。

  - CROSS_COMPILE   = arm-linux-
  + CROSS_COMPILE   = /opt/Embedix/tools/bin/arm-linux-

てとこで make config:

% cp arch/arm/def-configs/discovery-MV .config
% make xconfig
% make menuconfig
% ( make depend && make clean && make zImage && make modules ) |& tee ../make.log

注釈がふたつ。SL-A300 のデフォルトが discovery-MV というのは ソースコードのビルド手順 のページにあった。
ふたつめ。make xconfig だと save したとこで warning が出て煩いので make menuconfig で 無変更のまま save しなおした。

デフォルトのカーネルで気になった点:

デフォルトの config まんまでのカーネルのサイズは 908784 Byte. いまんとこ使えない ppp, IrDA をモジュールに追い出し、NFS client を入れて 827328 Byte になった。そのうちこっちに入れ換えるつもりだが、 サイズを減らすっつうても ROM 的には小さくしても何の意味もない (RAM 的には少し嬉しい)。 モジュールに追い出したぶんが ROM ファイルシステムを喰うのでむしろ悪い。 ROM ん中のカーネルとファイルシステムの境界をいじらんと何の意味もなしと。

cramfs の hardlink, symlink

吸い出した ROM を覗く ... なんてことは前回やった。 いちいち cramfs でマウントするのもナンなんで、 そのまま tar で吸い上げて普通のディレクトリに中身を突っ込んであった。
# mount -t cramfs -o loop dev.mtdblock0 /mnt
# cd /mnt
# mkdir /home/src/zaurus/rootfs/root
# tar -cvp . | tar -xpC /home/src/zaurus/rootfs/root
# cd /home/src/zaurus/rootfs
# tar -xvf root/root/.home_default.tar
こうして普段は /home/src/zaurus/rootfs/{root, home} のほうを覗いてるわけだが、 /bin/*grep/bin/{gzip, gunzip, zcat} が hard link (nor symlink) されてないという事実に気付く。 ディスクがもったいないので ROM を書き換えるまえに順繰りに symlink しなおしたが ... 実は cramfs の状態では:
% ls -il /mnt/bin/*grep
 633280 -rwxrwxr-x    1 root     root        68456 Oct  6 19:53 /mnt/bin/egrep
 633280 -rwxrwxr-x    1 root     root        68456 Oct  6 19:52 /mnt/bin/fgrep
 633280 -rwxrwxr-x    1 root     root        68456 Oct  6 19:52 /mnt/bin/grep
hardlink されてないけど実体は同じ。実際、hardlink を外しても hardlink or symlink にしても mkcramfs した結果は一緒だった。 吸い出すと hardlink が外れてしまうが、そういうことは気にしなくていいらしい。

もひとつめんどうだったのは、

% ls -l /mnt
合計 9
drwxrwsr-x    1 root     root         1228 Oct  6 19:53 bin
drwxrwxr-x    1 root     root            0 Oct  6 20:02 boot
drwxrwxr-x    1 root     root          304 Oct  6 20:02 dev
lrwxrwxrwx    1 root     root            9 Oct  6 20:02 etc -> /home/etc
drwxrwxr-x    1 root     root           16 Oct  6 20:03 home
drwxrwxr-x    1 root     root         1140 Oct  6 20:02 lib
lrwxrwxrwx    1 root     root            8 Oct  6 20:02 mnt -> /var/mnt
drwxrwxr-x    1 root     root           44 Oct  6 20:02 opt
drwxrwxr-x    1 root     root            0 Oct  6 20:02 proc
drwxrwxr-x    1 root     root          184 Oct  6 20:03 root
drwxrwxr-x    1 root     root         1952 Oct  6 20:02 sbin
lrwxrwxrwx    1 root     root            9 Oct  6 20:02 tmp -> /home/tmp
drwxrwsr-x    1 root     root          304 Oct  6 20:02 usr
lrwxrwxrwx    1 root     root           16 Oct  6 20:02 var -> /home/system/var
symlink 先が絶対パスになっていることだ。 適当な位置にマウントしておいて適当に tar か何かで overwrite しようとする ── たとえば /mnt/etc/の下を書き換えようとすると本物の /home/etc/ を書き換えにいく。 存在しないディレクトリならともかく、 マウントしてたマシン上にはたまたま /home/etc, /home/tmp があった。 こーして /home/etc は書き潰されてリカバリするはめになった (-_-#

書き変わる可能性のあるディレクトリのうち、しゃれにならんのが /home/root/ である ... root のホームを /home/root/ に置いてるマシンってけっこうありそうだ。 作業してたマシンは幸い /root/ だったので被害は免れた。

/home/src/zaurus/rootfs/ 以下は arm バイナリしか入ってないのでリンク回避のために chroot することもできない。ったく。

lrwxrwxrwx    1 root     root           16 Oct  6 20:02 var -> ./home/system/var
みたいに相対パスで書いてあればいいんだけどね ... そのうち書き直すが、今の段階では あんまり大きく書き換えると何がおこるかわからんのでそのまんま。

home fs の書き換え

まだ root fs (起動後に / としてマウントされる側) のほうはなんにも触ってない。 /root/.home_default.tar から /home/ に展開されるほうは fstab, inetd.conf, securetty, hosts, HOSTNAME, ... といったところを適当に直した他、 samba を止めた。/etc/rc.d/init.d/samba の冒頭に exit 0 をいれただけだけど。

起動後に /usr/local/bin になる /home/root/usr/local/bin/ を、 おもに Debian potato から加えて:

% ls -al root/usr/local/bin/ 
合計 772
drwxrwxr-x    2 root     root         4096 Oct  4 22:13 .
drwxrwxr-x    3 root     root         4096 Jul 29 14:59 ..
lrwxrwxrwx    1 root     root           22 Oct  4 21:49 apm -> /usr/local.rom/bin/apm
lrwxrwxrwx    1 root     root           23 Oct  4 21:49 apmd -> /usr/local.rom/bin/apmd
-rwxr-xr-x    1 root     root        32592 Oct  4 22:10 dd
-rwxr-xr-x    1 root     root        28568 Oct  4 22:10 df
-rwxr-xr-x    1 root     root         6828 Oct  4 22:13 fbinfo
-rwxr-xr-x    1 root     root        97516 Oct  4 22:10 fdisk
-rwxr-xr-x    1 root     root        61192 Oct  4 22:10 find
-rwxr-xr-x    1 root     root         4921 Oct  4 22:10 ldd
-rwxr-xr-x    1 root     root       108700 Oct  4 22:10 less
-rwxr-xr-x    1 root     root        59372 Oct  4 22:10 mount
-rwxr-xr-x    1 root     root       170892 Oct  4 22:10 ng
lrwxrwxrwx    1 root     root           24 Oct  4 21:49 tailf -> /usr/local.rom/bin/tailf
-rwxr-xr-x    1 root     root       147068 Oct  4 22:10 tar
-rwxr-xr-x    1 root     root        10616 Oct  4 22:10 time
-rwxr-xr-x    1 root     root        12996 Oct  4 22:13 ttcp
とする。最悪、外から login できなくなっても /etc/inetd.conf の書き換えに 今度からは ng が使える :-)

約 700kB 増えたわけだが、さすがに食いすぎて ROM に入らなかったので /usr/sbin.rom/ の smbd, nmbd を消した (両者合わせて 1.2MB)。

ROM への書き込みのためのファイルの用意

# cd /home/src/zaurus/rootfs
# tar -cpvf home > root/root/.home_default.tar
# mkcramfs root initrd.bin 
て訳で、この initrd.bin と zimage, それに updater.pro なるファイルを SD に持ち込んで、update する。

今回、zimage もちゃんと SD にいれたわりに使うつもりがないので zimage のほうはコメントアウトした。
updater.pro.romfsonly :

;ZIMAGE ,   ,0x00060000,1024
INITRD ,BIN,0x00160000,14464

ROM への書き込み

ホームキーを押したままリセット。 リセットの手を離すと緑のランプ点灯、そこでホームキーから手を放す ──
要約すればそれだけのことだが、実際に実行するとなると意味不明。とりあえず 押す側は書いてあっても何時どのタイミングで放せばいいんか書いてない ... ホームキーとリセットを押したまんま延々と待ち続けるが LED は消灯したまんまで、 こんな非人道的タイミングのはずはないと放した瞬間に点いた。

LED が点灯し、さらにそのままホームキーを押し続けること約 1 分、 やっぱり非人道的タイミング以下略ということで放してみた。 「ランプが点灯(あるいは点滅)するまで押しつづけてください」 とは点灯したら放してもええよということだとは思うが、文面的には当然のように思えても ふっとばしたらそれっきりの 1 回目にそんなことまで確信でけん。

しばらくほっといてもぜんぜん変化せんのでおそるおそる全初期化してみたら ROM は更新されてなかった。... 実はファイル名が間違っていた。あう。 「間違っててもそんなにむちゃくちゃな動作はしないのね」と負け惜しみしてからやりなおし。

こんどはホームキーを押したままリセットちょい押し。 ランプがすぐに橙から緑に変わるのでホームキーから指を放す。 手を放すと同時に緑点灯から緑点滅に入り、10 秒ほど経って緑点灯に変化。 以下、点滅〜常灯をくりかえすのを眺め続けて約 5 分。

ランプが消灯した。ふたたび全初期化して ROM の更新を確認。 reboot 時、welcome message まで 1 分 30 秒、 タッチして Qt のタッチパネルキャリブレーション〜時刻設定に入った。 システム情報をみると ROM Version が '--.--' に変わっていた:

システム情報


[日記へ] [目次へ]