ramdisk image を探す


やらないといけないこと

カーネル入れ換えの課題を整理する。
  • ramdisk.image.gz を探す
  • firmimg.bin の作成手順の確立。
     クロスコンパイル環境を作るか、ここだけを x86で実行するか
  • make config のパラメータを探す
  • 本物の firmimg.bin の作成
  • インストールして動作確認。多分1発では行かないだろうな
     玄箱は入手困難なので、LinkStation でやったほうがいいかな?
  • 最新カーネルソースベースへの移行

    ramdisk.image.gz は、どこに?

    昨日、arch/ppc/boot/sandpoint/Makefile に
    zImage.initrd: zvmlinux.initrd bootcode
    	$(SETSUM) ../../../../firminfo.txt ../images/vmlinux.gz -r ../images/ramdisk.image.gz -o ../images/firmimg.bin
    	mv zvmlinux.initrd ../images/$@.sandpoint
    	mv bootcode.bin ../images/bootcode.bin
    	rm ../images/vmlinux.gz
    	rm ./bootcode
    
    という記述があることを見つけた。
    setsum は firminfo.txt, vmlinux.gz, ramdisk.image.gz を入力として firmimg.bin を出力しているように見える。
    ということは、firmimg.bin には、 ramdisk.image.gz が含まれているであろう。

    つまり、firmimg.bin は、

  • firminfo.txt から作成されるヘッダ部(108 バイト)
  • 109 バイト目から vmlinux.gz(サイズ不明)
  • オフセット不明から ramdisk.image.gz
    の3つの部分からなっているのではないかと考えられる。

    vmlinux.gz のサイズを調べる

    firmimg.bin から vmlinux.gz (109 バイト目から末尾まで)を抜き出し、 gunzip して vmlinux を取り出し(すると、ゴミが取れる)、 再度 gzip すると、 純粋な vmlinux.gz のサイズがわかるのではないかと考えた。

    /dev/fl1 から firmimg.bin 相当を抜き出す

    玄箱には firmimg.bin は提供されていないので、 /dev/fl1 から firmimg.bin 相当を抜き出す。
    kurobako# cat /dev/fl1 > fl1
    

    vmlinux.gz のオフセットの確認

    (0 オリジンで)108 バイト目に、 gzip ファイルのマジックナンバである 0x1f8b があるはず。
    [yasunari@ls tmp]$ od -xc fl1 | less
    0000000 0000 0001 0000 1001 4b55 524f 2d42 4f58
             \0  \0  \0 001  \0  \0 020 001   K   U   R   O   -   B   O   X
    0000020 2849 4554 5355 4e41 2900 0000 0000 0000
              (   I   E   T   S   U   N   A   )  \0  \0  \0  \0  \0  \0  \0
    0000040 0000 0000 0000 0000 464c 4153 4820 312e
             \0  \0  \0  \0  \0  \0  \0  \0   F   L   A   S   H       1   .
    0000060 3100 0000 0000 0000 0000 0000 0000 0000
              1  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
    0000100 0000 0000 0000 0000 0001 0000 0000 6802
             \0  \0  \0  \0  \0  \0  \0  \0  \0 001  \0  \0  \0  \0   h 002
    0000120 0910 1e2a 002d a21b 320d 8c9f 0000 006c
             \t 020 036   *  \0   - 242 033   2  \r 214 237  \0  \0  \0   l
    0000140 000a f8b5 000a f921 0022 a8fa 1f8b 0808
             \0  \n 370 265  \0  \n 371   !  \0   " 250 372 037 213  \b  \b
    0000160 2037 2740 0203 766d 6c69 6e75 7800 ec5c
                  7   '   @ 002 003   v   m   l   i   n   u   x  \0 354   \
    
    OK。

    テーブル?

    ちょっと気になったのが、92 バイト目にある 0000 006c。 これは、108 ではないか?!
    96 バイト目は 000a f8b5。 先日 sandpoint のデフォルト設定で作ったカーネルが、
    -rwxr-xr-x    1 yasunari root       653164 Mar 23 20:56 vmlinux.gz*
    
    で 000a f8b5 (719029) に近い。 ということは、これはカーネルのサイズか?
    これ足す 108 = 100 バイト目の 000a f921。 次のブロックの開始オフセットか? 104 バイト目 の 0022 a8fa はサイズ?

    仮定をまとめてみると、
    offset
    (0 orig.)
    data(hex) data(dec) 意味(予想)
    92 0000 006c 108 カーネルの始まるオフセット
    96 000a f8b5 719029 カーネルのサイズ
    100 000a f921 719137 ramdisk.image.gz の始まるオフセット?
    104 0022 a8fa 2271482 ramdisk.image.gz のサイズ
    データを読み出すために、 先頭オフセットやサイズをヘッダに収めておくことは、 ごく自然なことである。
    vmlinux の gunzip → gzip などそっちのけで、 まずこの情報を頼りにしてみる。

    ついに取り出した ramdisk

    fl1 のサイズが 3145728、 ramdisk.image.gz の始まるオフセットが 719137、 なので、3145728 - 719137 = 2426591 なので、 fl1 の末尾から 2426591 を取り出せばよいことになる。
    linkstationVine# tail -c 2426591 fl1 > ramdisk.image.gz
    linkstationVine# od -xc ramdisk.image.gz |head
    0000000 1f8b 0808 b634 2740 0203 6c6f 6f70 6669
            037 213  \b  \b 266   4   '   @ 002 003   l   o   o   p   f   i
    0000020 6c65 00ec 9d09 7c54 d5bd c7ef cc64 9dac
              l   e  \0 354 235  \t   |   T 325 275 307 357 314   d 235 254
    0000040 8488 6cc2 0888 8898 65b2 1052 8c43 206c
            204 210   l 302  \b 210 210 230   e 262 020   R 214   C       l
    0000060 b209 48dd 2a66 9998 91c9 4ccc 4c08 2268
            262  \t   H 335   *   f 231 230 221 311   L 314   L  \b   "   h
    0000100 c005 5111 1117 5444 a5d6 bed6 be96 56aa
            300 005   Q 021 021 027   T   D 245 326 276 326 276 226   V 252
    
    見事、gzip のマジックナンバ 1f8b である。\^_^/
    linkstationVine# tar ztvf ramdisk.image.gz |less
    
    gzip: stdin: decompression OK, trailing garbage ignored
    tar: 子プロセスがステータス 2 を返してきました
    tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました
    
    あれ?だめ?
    linkstationVine# gunzip ramdisk.image.gz
    
    gunzip: ramdisk.image.gz: decompression OK, trailing garbage ignored
    linkstationVine# file ramdisk.image
    ramdisk.image: Linux rev 1.0 ext2 filesystem data
    linkstationVine# mkdir /tmp/ramdisk/
    linkstationVine# mount -o loop ramdisk.image /tmp/ramdisk
    linkstationVine# ls /tmp/ramdisk/
    bin  dev  etc  lib  lost+found  mnt  mnt2  proc  root  sbin  tmp  usr  var  www
    
    やったぁ!ついに見つけたぞ、ramdisk image!

    今日はここまで。


     玄人志向 玄箱をハックしよう  → LinkStation の /dev/fl1
    Copyright (C) 2004 Yasunari Yamashita. All Rights Reserved.
    yasunari @ yamasita.jp
    山下康成京都府向日市