La Fonera+ の場合、 全てのソースが公開されているわけでは無い (例えば fonsmcd などが非公開)。 したがって La Fonera+ の機能を出来るかぎり損なわずに ファームウェアの改変を行なうには、 ソースから全てをビルドすることを目指すよりは、 純正ファームウェアの root イメージを入手して、 それをベースに改変を行なう方がよい。
純正ファームウェアの root イメージを入手する方法としては、 La Fonera+ をディスクレス (フラッシュメモリレス?) 起動させて フラッシュ・メモリの内容を丸ごとコピーする方法がまず考えられる。 実際、私はこの方法で La Fonera+ のフラッシュ・メモリの内容を抽出したのだが、 La Fonera+ は 純正ファームウェアがダウンロードできる。 わざわざ実機からファームウェアを抽出しなくてもいいのでお手軽である。 そこで今回はダウンロードした純正ファームウェアから root イメージを取り出して 改変を行なう方法を紹介する。
まず FON のダウンロードページ から foneraplus_1.1.1.1.fon をダウンロードする。 「.fon」という見慣れない拡張子だが、 このファイルの 519 バイト目以降が tar + gz アーカイブになっている。 519 という数字はバージョンによって変わるかも知れないので、 算出方法を説明しておく。 先頭 4 バイトは マジック・ナンバー「FON5」なのでスキップ。
余談だが、 La Fonera のファームウェア (例えば fonera_0.7.1.1.fon) の場合だと、 このマジック・ナンバーは「FON3」であり、 La Fonera のファームウェアの更新差分 (例えば upgrade.fon) の場合だと、 「FON4」になっている。
マジック・ナンバーの次、すなわち 4 バイト目 (先頭を 0 バイト目と数える) から 3 バイトに注目する。
% od -t a foneraplus_1.1.1.1.fon | head -1 0000000 F O N 5 5 1 2 ! V sub , cr ^ - k e
ASCII コードで「512」と入っていることが分かる。 この数値は、 tar + gz アーカイブの位置を表わしている。 すなわち、 この「512」の文字列の直後の位置 (つまり 7 バイト目) から数えて 512 バイト目、 先頭から数えれば 519 バイト目が、 tar + gz アーカイブの先頭位置である。 アーカイブを取り出して展開してみる:
% dd if=foneraplus_1.1.1.1.fon bs=1 skip=519 of=foneraplus_1.1.1.1.tgz 2213430+0 records in 2213430+0 records out 2213430 bytes (2.2 MB) copied, 4.95395 seconds, 447 kB/s % tar xvzf foneraplus_1.1.1.1.tgz -rwxr-xr-x iurgi/iurgi 666 2007-09-07 23:39 upgrade -rw-r--r-- iurgi/iurgi 2293764 2007-09-05 23:28 image_full -rw-r--r-- iurgi/iurgi 102 2007-04-23 21:12 hotfix
展開すると「image_full」というファイルが得られる。 これは、 kernel と root イメージをつなげて、 先頭にヘッダをつけた、 次のようなフォーマットのファイル。
┌───────┬───────┬───────┬───<<───┬───<<───┐ │rootイメージの│チェック・サム│rootイメージの│lzma 圧縮した │root イメージ │ │サイズ 4byte│(CRC32) 4byte│位置 4byte│カーネル │squashfs │ └───────┴───────┴───────┴───>>───┴───>>───┘
つまり 前回 flash へ書込んだ image ファイルと同じフォーマットである。
image_full から root イメージを取り出すには、 このファイルのヘッダから 「root イメージサイズ」と「root イメージの位置」を取り出せばよい。
% od -t x1 image_full | head -1 0000000 00 21 bf de a2 14 d3 9b 00 0a 50 34 6d 00 00 80
先頭 4 バイトは「0021BFDE」であり、 これを 10進数に変換すると 2211806 であるから、 root イメージサイズが 2211806 バイトであることがわかる。 また、 8 バイト目から 4 バイトは「000A5034」であり、 これを 10進数に変換すると 675892 であることから、 root イメージの位置がこの「000A5034」の直後の位置 (つまり 12 バイト目) から数えて 675892 バイト目、 すなわち先頭から数えれば 675904 バイト目であることがわかる。 root イメージを取り出して展開してみる:
% dd if=image_full bs=1 skip=675904 count=2211806 of=root.squashfs 1617860+0 records in 1617860+0 records out 1617860 bytes (1.6 MB) copied, 3.61499 seconds, 448 kB/s # unsquashfs-lzma -dest ROOT root.squashfs Reading a different endian SQUASHFS filesystem on root.squashfs created 407 files created 67 directories created 165 symlinks created 0 devices created 0 fifos
これで、La Fonera+ の root ディレクトリ以下の全ファイルが、 ROOT ディレクトリ以下に展開される。 unsquashfs-lzma というコマンドが見慣れないかも知れないが、 これは squashfs に含まれる unsquashfs を lzma ライブラリとリンク して作ったコマンドである。
(つづく)