ROM 周りの扱いがなんとなく分かったところで ROM root fs の入れ換え。
リセット押すたびに /etc/inetd.conf を echo で書き換えるのはごめんである。
... と、そのまえにカーネルも作っておく。
まだ交換はしないけど、ROM 書き込み時に中途半端に誤動作されても困る。
ここで「面倒」っつうのは、既に /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 に入れ換えたいぞぅ。
/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 しなおした。
デフォルトのカーネルで気になった点:
# 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/grephardlink されてないけど実体は同じ。実際、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/varsymlink 先が絶対パスになっていることだ。 適当な位置にマウントしておいて適当に 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みたいに相対パスで書いてあればいいんだけどね ... そのうち書き直すが、今の段階では あんまり大きく書き換えると何がおこるかわからんのでそのまんま。
起動後に /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)。
# 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
ホームキーを押したままリセット。 リセットの手を離すと緑のランプ点灯、そこでホームキーから手を放す ──要約すればそれだけのことだが、実際に実行するとなると意味不明。とりあえず 押す側は書いてあっても何時どのタイミングで放せばいいんか書いてない ... ホームキーとリセットを押したまんま延々と待ち続けるが LED は消灯したまんまで、 こんな非人道的タイミングのはずはないと放した瞬間に点いた。
LED が点灯し、さらにそのままホームキーを押し続けること約 1 分、 やっぱり非人道的タイミング以下略ということで放してみた。 「ランプが点灯(あるいは点滅)するまで押しつづけてください」 とは点灯したら放してもええよということだとは思うが、文面的には当然のように思えても ふっとばしたらそれっきりの 1 回目にそんなことまで確信でけん。
しばらくほっといてもぜんぜん変化せんのでおそるおそる全初期化してみたら ROM は更新されてなかった。... 実はファイル名が間違っていた。あう。 「間違っててもそんなにむちゃくちゃな動作はしないのね」と負け惜しみしてからやりなおし。
こんどはホームキーを押したままリセットちょい押し。 ランプがすぐに橙から緑に変わるのでホームキーから指を放す。 手を放すと同時に緑点灯から緑点滅に入り、10 秒ほど経って緑点灯に変化。 以下、点滅〜常灯をくりかえすのを眺め続けて約 5 分。
ランプが消灯した。ふたたび全初期化して ROM の更新を確認。 reboot 時、welcome message まで 1 分 30 秒、 タッチして Qt のタッチパネルキャリブレーション〜時刻設定に入った。 システム情報をみると ROM Version が '--.--' に変わっていた: