仙石浩明の日記

2007年12月18日

La Fonera+ へ ssh でログインする (2) root イメージの抽出

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 ライブラリとリンク して作ったコマンドである。

(つづく)

Filed under: La Fonera — hiroaki_sengoku @ 08:53

No Comments »

No comments yet.

RSS feed for comments on this post.

Leave a comment