仙石浩明の日記

2007 : December

2007年12月25日

2行でできる高精度ハードウェア自動認識 (initramfs の init を busybox だけで書く) hatena_b

10行でできる高精度ハードウェア自動認識」にコメントを頂いた:

最近の modprobe は、 自分で勝手に modules.alias を探してくれるようになっているようです。 この機能を使うと、 より簡単かつ高速に自動認識が可能になります。

そうだったのか... orz

いままで、 modules.alias から modporbe すべきモジュールを検索するために、 以下のような感じで sh スクリプト (/tmp/dev2mod) を生成し、 それを読み込んで (. $tmp) いたのだが、

tmp=/tmp/dev2mod
echo 'dev2mod(){ while read dev; do case $dev in' > $tmp
sort -r /lib/modules/`uname -r`/modules.alias \
| sed -n 's/^alias  *\([^ ]*\)  *\(.*\)/\1)modprobe \2;;/p' >> $tmp
echo 'esac; done; }' >> $tmp
. $tmp
rm $tmp
cat /sys/bus/*/devices/*/modalias | dev2mod

modprobe が自分で modules.alias を探してくれるとなると、 sh スクリプトを動的生成する必要が無くなってしまい、 上記コードは次のように書けてしまう:

dev2mod(){ while read dev; do modprobe $dev; done }
cat /sys/bus/*/devices/*/modalias | dev2mod

わずかに 2行 (^^;)

/sys/bus/*/devices/*/modalias の内容を手当たり次第 modprobe するので、 modprobe が「failed to load module」というエラー・メッセージを出してしまうが、 特に問題は無さげである。

PCMCIA や USB につないだデバイスも、 以下のように dev2mod を二度呼び出すだけで、 自動認識してしまう。

dev2mod(){ while read dev; do modprobe $dev; done }
cat /sys/bus/*/devices/*/modalias | dev2mod
modprobe pcmcia
cat /sys/bus/*/devices/*/modalias | dev2mod

う~んすごい。

Filed under: プログラミングと開発環境 — hiroaki_sengoku @ 08:04
2007年12月21日

La Fonera+ へ ssh でログインする (3) root イメージの改変

前回抽出した ROOT ディレクトリ を改変する。 真っ先に変更すべきなのは /etc/inittab で、 以下のように 1行挿入して /bin/ash が立ち上がるようにしておく。 これだけで、 シリアル・コンソールでシェルが使えるようになる。

--- ROOT.org/etc/inittab        2007-06-19 03:47:32.000000000 +0900
+++ ROOT/etc/inittab        2007-12-15 10:28:06.317233846 +0900
@@ -1,2 +1,3 @@
 ::sysinit:/etc/init.d/rcS
+ttyS0::askfirst:/bin/ash --login
 #::respawn:/sbin/monit -Ic /etc/monitrc

この変更だけでも、 La Fonera+ がいじり放題になるので、 改変ファームウェアを作ってみる。

当然 kernel が必要になる。 FON のソースからビルドするのは難しくはないが、 クロスコンパイル環境の構築など、 それなりの時間がかかるので、 とりあえず純正ファームウェアのものをそのまま使って、 改変ファームウェアを作ってみる。 まず純正ファームウェアから取り出した image_full のヘッダを参照して、...

senri:/tmp % od -t x1 image_full | head -1
0000000 00 21 bf de a2 14 d3 9b 00 0a 50 34 6d 00 00 80

前回説明したように image_full は以下のフォーマットなので、 「lzma 圧縮したカーネル」は、 12 バイト目から 000A5034 (上記ヘッダ 8 バイト目~ に注目) バイトであることが分かる。

┌───────┬───────┬───────┬───<<───┬───<<───┐
│rootイメージの│チェック・サム│rootイメージの│lzma 圧縮した │root イメージ │
│サイズ   4byte│(CRC32)  4byte│位置     4byte│カーネル      │squashfs      │
└───────┴───────┴───────┴───>>───┴───>>───┘

000A5034 は 10進数に直すと 675892 なので、 以下のように dd コマンドに「count=675892」を指定して、 image_full から lzma 圧縮したカーネル「vmlinux.lzma」を取り出す:

senri:/tmp % dd if=image_full bs=1 skip=12 count=675892 of=vmlinux.lzma
675892+0 records in
675892+0 records out
675892 bytes (676 kB) copied, 1.25156 seconds, 540 kB/s

前述したパッチを前回抽出した ROOT ディレクトリへ適用し、 mksquashfs-lzma コマンドを使って root イメージ root.squashfs を作成する:

senri:/tmp # patch -p0 < patch
patching file ROOT/etc/inittab
senri:/tmp # mksquashfs-lzma ROOT root.squashfs -nopad -noappend -root-owned -be
Creating big endian 3.0 filesystem on root.squashfs, block size 65536.

Big endian filesystem, data block size 65536, compressed data, compressed metadata, compressed fragments
Filesystem size 1499.77 Kbytes (1.46 Mbytes)
        31.47% of uncompressed filesystem size (4766.19 Kbytes)
Inode table size 4802 bytes (4.69 Kbytes)
        23.45% of uncompressed inode table size (20479 bytes)
Directory table size 5571 bytes (5.44 Kbytes)
        56.99% of uncompressed directory table size (9776 bytes)
Number of duplicate files found 4
Number of inodes 639
Number of files 407
Number of fragments 28
Number of symbolic links  165
Number of device nodes 0
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 67
Number of uids 1
        root (0)
Number of gids 0

以上で、 カーネルと root イメージの準備ができた。 vmlinux.lzma と root.squashfs をつなげて image ファイルを作成する:

senri:/tmp % fonimage.pl image vmlinux.lzma root.squashfs

fonimage.pl は、 FON のソース を展開すると、 fon/target/linux/fonera-2.6/image/fonimage.pl にある perl スクリプト。 CRC32 の算出 (前述した image_full のフォーマット参照) のため、 Digest::CRC モジュールが必要。

できた image を TFTP サーバに置いて、 La Fonera+ の flash へ書込む

試しに起動してみる:

RedBoot> fis load loader
RedBoot> go
Failsafe loader v0.2

Looking for board config data... found at offset 0xa87f0000
Reset button GPIO: 6
Reading flash from 0xa8040000 to 0xa825bf48... done.
Verifying CRC... OK - 0x766770d6
Uncompressing Linux... Ok, booting the kernel.
[sighandler]: No more events to be processed, quitting.
[cleanup]: Waiting for children.
[cleanup]: All children terminated.
Unlocking rootfs ...
Could not open mtd device: rootfs
switching to jffs2
init started:  BusyBox v1.4.1 (2007-09-03 10:39:50 UTC) multi-call binary

Please press Enter to activate this console. 


BusyBox v1.4.1 (2007-09-03 10:39:50 UTC) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

  ______                                           __      
 /\  ___\                                         /\ \     
 \ \ \__/  __     ___      __   _ __    __        \_\ \___ 
  \ \  _\/ __`\ /' _ `\  /'__`\/\`'__\/'__`\     /\___  __\
   \ \ \/\ \L\ \/\ \/\ \/\  __/\ \ \//\ \L\.\_   \/__/\ \_/
    \ \_\ \____/\ \_\ \_\ \____\\ \_\\ \__/.\_\      \ \_\ 
     \/_/\/___/  \/_/\/_/\/____/ \/_/ \/__/\/_/       \/_/ 

--------------  Fonera 1.5 Firmware (v1.1.1.1) -----------------

               * Based on OpenWrt - http://openwrt.org
             * Powered by FON - http://www.fon.com
      -----------------------------------------------------
root@OpenWrt:/# 

カーネルは改変していないので、 起動ログを見ることはできないが、 シェルが使えるのでいじり放題。

では早速...

root@OpenWrt:/# cat > /etc/ipkg.conf <<EOF
> src gcd http://www.gcd.org/fonera
> dest root /
> dest ram /tmp
> EOF
root@OpenWrt:/# ipkg update
Downloading http://www.gcd.org/fonera/Packages
Updated list of available packages in /usr/lib/ipkg/lists/gcd
Done.
root@OpenWrt:/# ipkg install dropbear
Installing dropbear (0.48.1-1) to root...
Downloading http://www.gcd.org/fonera/dropbear_0.48.1-1_mips.ipk
xsystem: ERROR: fork failed before execution: `wget --passive-ftp    -q -P /tmp/ipkg-0dCiiX http://www.gcd.org/fonera/dropbear_0.48.1-1_mips.ipk'
Nothing to be done
An error ocurred, return value: 22.
Collected errors:
Failed to download dropbear. Perhaps you need to run 'ipkg update'?
root@OpenWrt:/#

つまり GCD の ipkg feed から dropbear をインストールしようとしたのだが、 La Fonera+ の wget は busybox 内蔵のもので ipkg が期待する wget とは引数の形式が異なるようだ。 ipkg のためだけに GNU Wget をインストールするのも牛刀なので、 手作業で dropbear をインストールしてみる。

root@OpenWrt:~# wget http://www.gcd.org/fonera/Plus/dropbear_0.49-1_mips.ipk
Connecting to www.gcd.org [60.32.85.216:80]
dropbear_0.49-1_mips 100% |*****************************|    98 KB --:--:-- ETA
root@OpenWrt:~# tar xvzf dropbear_0.49-1_mips.ipk
./debian-binary
./data.tar.gz
./control.tar.gz
root@OpenWrt:~# cd /
root@OpenWrt:/# tar xvzf ~/data.tar.gz
./
./usr/
./usr/sbin/
./usr/sbin/dropbear
./usr/bin/
./usr/bin/scp
./usr/bin/ssh
./usr/bin/dbclient
./usr/bin/dropbearkey
./etc/
./etc/config/
./etc/config/dropbear
./etc/init.d/
./etc/init.d/dropbear
root@OpenWrt:/# /etc/init.d/dropbear start
root@OpenWrt:/#

これで外部から ssh でログインできるようになる。

La Fonera+ 起動時に自動的に dropbear (ssh サーバ) を立ち上げるには、

root@OpenWrt:/# /etc/init.d/dropbear enable

を実行すればよい。 以上は、 dropbear を La Fonera+ に直接インストール方法であるが、 もちろん前述した ROOT ディレクトリに対して dropbear をインストールして、 dropbear 入り image ファイルを作って flash メモリに書込んだ方がよい。

Filed under: La Fonera — hiroaki_sengoku @ 14:06
2007年12月19日

ひたすらコンピュータに没頭した学生時代

あすなろ blog の CTO キャリアライフインタビューを受けました。 私は普段、 昔話はできるだけしないように気をつけていた (だって「老害!」って思われちゃいますからね) のですが、 このインタビューでは冒頭いきなり

そもそもコンピュータに興味を持ったきっかけから教えていただけますか

と聞かれてしまい、 封印していた過去が一気に吹き出してしまいました。 なんせ 30年近い昔のことですから、 最近コンピュータを始めた人にとっては 何の興味も持てないんじゃないかとちょっと心配です (インターネット元年であり Windows ブレイクの年でもある 1995年も、 私の感覚だと「つい最近」の出来事だったりします ^^;)。

そして今日は、 「Commodore 64」の生みの親、J・トラミエル氏インタビュー という記事を見つけてしまいました。

Commodore !

Commodore PET 2001 !

Commodore VIC-1001 !

なにもかも懐かしい ! 昔の記憶がどんどんよみがえってきます。

パーソナルコンピュータの歴史に最も大きな影響を与えた人物について語るとき、 人はよく、Steve Jobs氏、Steve Wozniak氏、Bill Gates氏、Paul Allen氏、 Gordon Moore氏、Andy Grove氏などの名前を挙げる。
だが、確実に彼らと同じグループに属する人がもう1人いる。 Commodoreの創業者で、後にAtariの最高経営責任者(CEO)を務めた Jack Tramiel氏だ。 「Commodore PET」や「Commodore VIC-20」、 さらに、パーソナルコンピュータ史上最も販売台数が多いとされる 「Commodore 64」(C64)を世に送り出した人物として、 Tramiel氏は、他の誰よりも強い影響力を持っていたのかもしれない。

私に最も大きな影響を与えたのは、 Apple でもなく、MS Basic でもなく、8080 CPU でもなく、 PC-8001 でもなく、Commodore でした。 CTO インタビューでは、 「なぜかはじめからコンピュータが好きだった」と答えたのですが、 中学校での PET 2001 との出会いがなければ今の私は無かったかも知れません。

中学3年生になって、だんだんBasicでゲームを作るほかに、 もっと下のレベルでプログラミングができるということがわかってきて、 機械語と呼ばれていた言語に興味を持つようになりました。

インタビューの時は忘れていたのですが、 私が機械語 (マシン語。メモリ上で即実行可能なバイナリのことです) を学ぶきっかけになったのは、 当時コモドールジャパンが発行していた小冊子「VIC!」でした。 この小冊子のコラムに、 機械語の簡単な紹介があって、 EA (16進コード) も機械語の命令の一つ、といったことが書かれていたのでした。 0xEA は 6502 CPU では NOP 命令なのですが、 そのコラムは、 「NOP は何もしない、という命令ですが、 読者の皆さんは何もしないのではなく、 VIC をきっかけにコンピュータを学んでいって欲しい」といった主旨の言葉で しめくくられていました。

このコラムがきっかけとなって、 なんとかして EA 以外の命令も知りたいと思うようになりました。 今と違ってインターネットも検索エンジンもありませんから、 当時中学生だった私が 6502 の命令セットを見つけ出すことは難しく、 それだけに一層「切望感」がつのったのでした。

私が初めてコンピュータに触れたのは、中学一年生の終わり頃である。 「マイコン部」なるものがあって、 3台のCommodore PET 2001を 20人以上の部員で使っていた。 しかも「部活動」は週一回 50分ほどだったと記憶しているので、 PET 2001 に触れるのは、二週間に一度、25分だけ、 しかも二人で一台を使う形だった。 最初のうちは BASIC を使って簡単なゲームなどを書いていたが、 6502 のインストラクションセットをどこからか見つけてきて (どこで見つけたのだろう? 当時はその手の資料を中学生が見つけることは、かなり難しかったはず)、 ハンドアセンブルしたコードを BASIC の poke 文でメモリに書いて 実行させて遊んだりした。

いまさらですが、 現代は便利な世の中ですねぇ... the 6502 microprocessor resource なんてページが簡単に見つかるのですから... こんなページを中学生時代の私が見たら、 「宝の山」を発見した感激で卒倒したことでしょう。 当時の私が苦労の末ついに見つけたのは、 65CE02 Microprocessor の 10, 11 ページの表だったのではないかと思います。

Filed under: 技術者の成長 — hiroaki_sengoku @ 21:00
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
2007年12月17日

La Fonera+ へ ssh でログインする (1) flash への書込み hatena_b

FON ソーシャル・ルータ La Fonera+ へログインするのは、 La Fonera のときほど容易ではない。 La Fonera はシリアル・コンソールでシェル (/bin/ash) を使えたので、 dropbear (ssh サーバ) を立ち上げるだけで、 ssh でログインできるようになる。 しかし La Fonera+ はシリアル・コンソールをつなげても シェルが動いていないので、 Linux 起動後はコンソール出力を眺めることくらいしかできない。

ログインできないようにしてあると、 余計にログインしたくなるのは人の常であるようで、 すでに多くの方が挑戦し 成功しているようだ。 基本的には、 ファームウェアを書き換えてシリアル・コンソールを 有効にしてしまえばいいだけのことであるが、 いかに La Fonera+ の機能そのままに、 シリアル・コンソールだけ有効にするかが肝であろう。

というわけで、 先人が作ったファームウェアをそのまま使うのでは面白くないので、 FON が公開しているソース を元に、 改変ファームウェアを作ってみた。 作り方を書いていると長くなるので、 次回以降で説明するとして、 まずは作った改変ファームウェアを La Fonera+ に書込むところから。

RedBoot> load -r -b 0x80040400 image
Using default protocol (TFTP)
Raw file loaded 0x80040400-0x8028062f, assumed entry at 0x80040400
RedBoot> fis create image
... Erase from 0xa8040000-0xa8280230: .....................................
... Program from 0x80040400-0x80280630 at 0xa8040000: .....................................
... Erase from 0xa87e0000-0xa87f0000: .
... Program from 0x80ff0000-0x81000000 at 0xa87e0000: .

ここで TFTP サーバから読み込んでフラッシュへ書込んだ image というファイルが、 今回作成した改変ファームウェア。 これは、 kernel と root イメージをつなげて、 先頭にヘッダをつけた、 次のようなフォーマットのファイル。

┌───────┬───────┬───────┬───<<───┬───<<───┐
│rootイメージの│チェック・サム│rootイメージの│lzma 圧縮した │root イメージ │
│サイズ   4byte│(CRC32)  4byte│位置     4byte│カーネル      │squashfs      │
└───────┴───────┴───────┴───>>───┴───>>───┘

FON のソース に含まれる (fon/target/linux/fonera-2.6/image/fonimage.pl)、 fonimage.pl コマンドを 以下のように実行すると、 この image ファイルを作成できる。

fonimage.pl  image 《lzma圧縮したカーネルイメージ》 《squashfsなrootイメージ》

前回書いたように、 La Fonera+ は起動すると「loader」を起動する。 この loader プログラムが、 上記 image ファイルを読み込んで、 カーネルと root イメージに分解し、 カーネルを lzma 展開した上で起動する。

試しに起動してみる。 printk サポートを有効にしてある (CONFIG_PRINTK=y) ので、 Linux 起動ログを見ることができる。

RedBoot> fis load loader
RedBoot> go
Failsafe loader v0.2

Looking for board config data... found at offset 0xa87f0000
Reset button GPIO: 6
Reading flash from 0xa8040000 to 0xa8280224... done.
Verifying CRC... OK - 0x9ffc079a
Uncompressing Linux... Ok, booting the kernel.
Linux version 2.6.19.2 (sengoku@senri.gcd.org) (gcc version 4.1.2) #8 Sun Dec 16 16:52:31 JST 2007
CPU revision is: 00019064
Determined physical RAM map:
 memory: 01000000 @ 00000000 (usable)
Initrd not found or empty - disabling initrd
Built 1 zonelists.  Total pages: 4064
Kernel command line: console=ttyS0,115200 rootfstype=squashfs,jffs2 init=/etc/preinit
        ... 中略 ...
switching to jffs2
mini_fo: using base directory: /
mini_fo: using storage directory: /jffs
init started:  BusyBox v1.4.1 (2007-12-13 15:41:27 JST) multi-call binary

Please press Enter to activate this console. 
eth0.0: dev_set_promiscuity(master, 1)
device eth0 entered promiscuous mode
device eth0.0 entered promiscuous mode
: udhcpc (v1.4.1) started

        ... 中略 ...

: 21 2 * * * /bin/thinclient cron

: 13 5 * * * ntpclient -s -h ntp-1.cso.uiuc.edu

: fonsmcd successfully started

La Fonera と同様に mini_fo を使って、 squashfs の上に jffs2 を 重ねることによって、 / (root ファイル・システム) を書込み可能にしている。

La Fonera と同様、 cron から /bin/thinclient を実行しているが、 実はこれは機能していない。 つまり、 /bin/thinclient cron を実行してみると、 以下のように Usage が表示されてしまう。

root@OpenWrt:/# /bin/thinclient cron
Usage /bin/thinclient (dummy|start|config|upgrade) [voucher_file]

La Fonera の thinclient が果たしていた役割は、 La Fonera+ では /usr/sbin/fonsmcd が担っているようだ。 しかしながら fonsmcd のソースは公開されていない (少なくとも前述したソースには含まれていない) ので、 詳細は不明。

シリアル・コンソールで「Enter」を入力すれば、 シェルを使うことができるようにしてある。 さらに、ネットワーク経由で ssh ログインすることもできる:

% rsh -l root 172.16.191.252


BusyBox v1.4.1 (2007-12-13 15:41:27 JST) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

  ______                                           __      
 /\  ___\                                         /\ \     
 \ \ \__/  __     ___      __   _ __    __        \_\ \___ 
  \ \  _\/ __`\ /' _ `\  /'__`\/\`'__\/'__`\     /\___  __\
   \ \ \/\ \L\ \/\ \/\ \/\  __/\ \ \//\ \L\.\_   \/__/\ \_/
    \ \_\ \____/\ \_\ \_\ \____\\ \_\\ \__/.\_\      \ \_\ 
     \/_/\/___/  \/_/\/_/\/____/ \/_/ \/__/\/_/       \/_/ 

--------------  Fonera 1.5 Firmware (v1.1.0.2) -----------------

               * Based on OpenWrt - http://openwrt.org
             * Powered by FON - http://www.fon.com
      -----------------------------------------------------
root@OpenWrt:/# df
Filesystem           1k-blocks      Used Available Use% Mounted on
tmpfs                      512         0       512   0% /dev
/dev/mtdblock4            3840       284      3556   7% /jffs
/jffs                     1664      1664         0 100% /
root@OpenWrt:/# free
              total         used         free       shared      buffers
  Mem:        13612        12680          932            0         1064
 Swap:            0            0            0
Total:        13612        12680          932
root@OpenWrt:/# ifconfig eth0.1
eth0.1    Link encap:Ethernet  HWaddr 00:18:84:XX:XX:XX
          inet addr:172.16.191.252  Bcast:172.16.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1480  Metric:1
          RX packets:1367 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1212 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:129328 (126.2 KiB)  TX bytes:184394 (180.0 KiB)

root@OpenWrt:/# 

La Fonera+ には ether ケーブルのソケットが二つついているが、 カーネルから見ると WAN 側ソケットは eth0.1 つまり VLAN デバイスとして見える。 LAN 側ソケットは eth0.0 である。

(つづく)

Filed under: La Fonera — hiroaki_sengoku @ 07:59
2007年12月10日

La Fonera+ を買ってシリアル・ケーブルをつないでみた hatena_b

FON から無料キャンペーンのお知らせが来たので、 土曜日に秋葉原の九十九電機へ行ってラ・フォネラ+を ?台買ってきた。

La Fonera+

一台 1000円。 以前から La Fonera+ に興味はあったのだが、 3800円はチト高いなぁと思って手を出さずにいたので、 この機会に是非入手すべく、朝早く (といっても 10:00 ごろだが) から店頭へ。

ツクモ パソコン本店には開店前から行列ができている。 本店の整然とした並びとは対照的に、 DOS/V パソコン館では La Fonera+ の棚の前に無秩序に人が群がっている。 私は大阪人なので、並ぶのはニガテである。 なので DOS/V パソコン館の前で開店を待つことにする。 ちなみに、 ツクモケース王国や 12号店は開店時間が 11:00 なので誰も並んでいない。

10:30 開店の合図と同時に La Fonera+ 目指して飛びかかる客数人 (^^;)。 みるみる間に棚の上の La Fonera+ が減っていく。 無事入手して足早に秋葉原を後にする。

帰宅してすぐ、La Fonera+ 裏面のゴム足をはがす。 う、トルクス (TORX は登録商標なので、ヘックスローブ Hexlobe とも呼ばれる) ねじだ。 La Fonera は普通の「+」ネジだったのに... 慌てて近所のホームセンターに走る。 ねじのサイズは T-9H のようだ。 1サイズ小さい T-8H でも使えた。

La Fonera+ 内部

La Fonera にはヒートシンクがあったのに、La Fonera+ には無い。 ↑ 基板下辺に、JP1 と書かれたジャンパ・ピンが 4本立っている。 基板裏を見ると、一番右は明らかに GND である。 真ん中二本は信号線のようなので、 UP-12C (USB携帯電話メモリー転送ケーブル) の線を、 JP1 左から NC(つながない)、白(Rx)、緑(Tx)、黒(GND) の順につないでみると、 無事 RedBoot の出力を PC 側で見ることができた。

google で検索してみると、 UP-12C の緑が Rx で、白が Tx と書いてある説明が多いが、 これは緑を (デバイスの) Rx につなぐという意味で書いた (オリジナルの) 記述が、 「緑=Rx」と誤解されて広まったためではないだろうか? デバイス (La Fonera+) の Rx (受信入力) につなぐのは、 UP-12C の Tx 信号 (送信) 線だから、 「緑=Tx」「白=Rx」と書くべきだと思う。 逆に、ジャンパ・ピンの説明をするなら、 緑をつなぐピンが Rx ということになる。

つまり、JP1 左から (La Fonera+ 側から見て) Vcc, Tx, Rx, GND だと思われる。 ちなみに UP-12C の赤は電源なので接続してはいけない。 赤をショートさせると、 USB の電源供給能力一杯の電流が流れ、 UP-12C 本体が過熱する (でも壊れなかった。経験者談 ^^;)。

La Fonera+ にシリアル・ケーブルをつなぐ

RedBoot は boot script を自動的に実行しようとするので、 2秒以内に ^C を入力すると、 RedBoot のコマンドプロンプトが表示される:

senri %        cu -l ttyUSB1
Connected.
+Ethernet eth0: MAC address 00:18:84:xx:xx:xx
IP: 192.168.1.1/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.254

RedBoot(tm) bootstrap and debug environment [ROMRAM]
OpenWrt certified release, version 1.1 - built 22:32:28, May  7 2007

Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.

Board: FON 2201 
RAM: 0x80000000-0x81000000, [0x80040290-0x80fe1000] available
FLASH: 0xa8000000 - 0xa87f0000, 128 blocks of 0x00010000 bytes each.
== Executing boot script in 2.000 seconds - enter ^C to abort
^C
RedBoot> 

コマンド一覧を表示させてみる:

RedBoot> help
Manage aliases kept in FLASH memory
   alias name [value]
Set/Query the system console baud rate
   baudrate [-b <rate>]
Move Atheros Board Data information
   bdmove 
Restore Atheros Board Data information
   bdrestore 
Manage machine caches
   cache [ON | OFF]
Display/switch console channel
   channel [-1|<channel number>]
Compute a 32bit checksum [POSIX algorithm] for a range of memory
   cksum -b <location> -l <length>
Display (hex dump) a range of memory
   dump -b <location> [-l <length>] [-s] [-1|2|4]
Execute an image
   exec [-b <argv addr>] [-c "kernel command line"] [-w <timeout>]
        [<entry point>]
Manage FLASH images
   fis {cmds}
Manage configuration kept in FLASH memory
   fconfig [-i] [-l] [-n] [-f] [-d] | [-d] nickname [value]
Get Key number
   get_key 
Get Mac addresses
   get_mac 
Get Serial number
   get_serial 
Execute code at a location
   go [-w <timeout>] [-c] [-n] [entry]
Help about help?
   help [<topic>]
Display command history
   history 
Set/change IP addresses
   ip_address [-l <local_ip_address>[/<mask_len>]] [-h <server_address>]
Load a file
   load [-r] [-v] [-d] [-h <host>] [-p <TCP port>][-m <varies>] [-c <channel_number>] 
        [-b <base_address>] <file_name>
Compare two blocks of memory
   mcmp -s <location> -d <location> -l <length> [-1|-2|-4]
Copy memory from one address to another
   mcopy -s <location> -d <location> -l <length> [-1|-2|-4]
Fill a block of memory with a pattern
   mfill -b <location> -l <length> -p <pattern> [-1|-2|-4]
Network connectivity test
   ping [-v] [-n <count>] [-l <length>] [-t <timeout>] [-r <rate>]
        [-i <IP_addr>] -h <IP_addr>
Reset the system
   reset 
Set values
   set 
Display RedBoot version information
   version 
Display (hex dump) a range of memory
   x -b <location> [-l <length>] [-s] [-1|2|4]

La Fonera の RedBoot と比べると、 bdshow コマンド (Display Atheros Board Data information) が削除され、 get_key, get_mac, get_serial, set コマンドが追加されているが、 機能的には大差ないようだ。

フラッシュ・メモリの内容は、こんな感じ:

RedBoot> fis list
Name              FLASH addr  Mem addr    Length      Entry point
RedBoot           0xA8000000  0x80040400  0x00030000  0xA8000000
loader            0xA8030000  0x80100000  0x00010000  0x80100000
image             0xA8040000  0x80040400  0x00230004  0x80040400
image2            0xA8660000  0xA8660000  0x00140000  0x80040400
FIS directory     0xA87E0000  0xA87E0000  0x0000F000  0x00000000
RedBoot config    0xA87EF000  0xA87EF000  0x00001000  0x00000000

「vmlinux.bin.l7」や「rootfs」の区画があった La Fonera とは様変わりしている。 サイズからいって、「loader」は単なるイニシャル・ローダであろう。 「image」「image2」はカーネル・イメージ? 0xA8270004 ~ 0xA8660000 の 4M Byte 弱 (0x3EFFFC = 4128764) が空いているが、 おそらくここにルート・イメージがあるのではないかと思われる。 ルート・イメージにしては少し小さすぎる気がするが、 おいおい解析していく予定。

設定 (fconfig) は次のようになっていた:

Run script at boot: true
Boot script:
.. fis load -b 0x80100000 loader
..  go 0x80100000
Boot script timeout (1000ms resolution): 2
Use BOOTP for network configuration: false
Gateway IP address:
Local IP address: 192.168.1.1
Local IP address mask: 255.255.255.0
Default server IP address: 192.168.1.254
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false

なぜ RedBoot から直接 Linux を起動せず、 「loader」を起動しているのか謎であるが、 変則的な fis list と関係があるのかも知れない。 また、La Fonera と異なり、 La Fonera+ ではシリアル・コンソールが有効になっていない。 すなわちカーネルの起動メッセージが出力されず、 ブート後にログインすることもできない。

- o -

さて、一段落ついたところで、 「La Fonera+ の登録」をしておこうかと思い、 同梱されていたマニュアルにしたがって http://registerlafonera.fon.com にアクセスしたところ、

EN
You are not connected through your “MyPlace” signal. Please choose the “MyPlace” signal in your “Wireless Network Connection” window and click connect. See image.

日本語
あなたはMy Placeでの接続をなさっておりません。 'ワイアレスネットワークコ ネクションより 'My Place'を選択して接続し直してください。画像をご覧になってください。

と表示されてしまった。 今まで何台かの La Fonera を登録してきたが、 スムーズに登録できたためしがない。 FON の主旨は面白いのに、 こういう細かいところのツメが甘いのは、とてもモッタイナイ。 ついでに言うと、 あいかわらず日本語が微妙なのはなんとかならないものか。

「あなたはMy Placeでの接続をなさっておりません」などと 決めつけられてしまったが、 もちろん決してそんなことはない。 WPA パスフレーズとして S/N を入力して接続に成功したのだから、 確かに目の前の La Fonera+ の My Place 経由で インターネットに接続しているはずである。

さて、どうしたものか、と思いつつ、試しに FON_AP のほうを試してみたら、 あっさり登録できてしまった。 なんだかなぁ... これでは以前の La Fonera と同じ登録方法ではないか。 FON_AP 経由でルータ登録を行なうこの方法では、 第三者が勝手に他人の La Fonera+ を登録できてしまう。

Filed under: La Fonera — hiroaki_sengoku @ 07:28
2007年12月8日

チロルチョコ きなこもち 100コ入 & 特大だきまくら

妻が、 10円チロルチョコ きなこもち を買ってきた。 なぜか今年はあまり出回っていないらしい。

チロルチョコ きなこもち 100個入

10コ入袋 x 10コ入 <T10キナコモチフクロ> と 100コ入 <T1チロルキナコモチ>。
しめて 200個。馬鹿だねぇ...

10コ入 袋:

チロルチョコ きなこもち 10コ入 袋

100コ入 箱:

チロルチョコ きなこもち 100コ入 箱

小さすぎてバーコードが入れられないため、 コンビニでは 10円チロルチョコは売られていない (代りに 20円バージョンが売られている)、 と妻が自説を力説している。

チロルチョコ きなこもち

2005年のキャンペーンでもらった、チロルチョコ「きなこもち特大だきまくら」:

チロルチョコ「きなこもち特大だきまくら」 チロルチョコ「きなこもち特大だきまくら」当選
Filed under: その他 — hiroaki_sengoku @ 18:45