October 13, 2008

Chumbyだけで設定ファイルを編集

時計デバイスChumbyからFTDI経由でマイコン等を操作しようと作業をしていますが、その過程で本体の設定ファイルを書き換える必要があります。しかしながら、Chumbyのファイルシステムcramfsが読み込み専用、かつ、扱うためのツールもChumbyにはインストールされていないため、開発用PCとファイルをやりとりさねばならず、非常に難儀をしいられるのが現状です。そこで今回の記事では、何とかChumby単体でそれをできるような方針を示してみることにします。

通常、Chumbyの設定ファイルを編集するためには以下の手順をとります。

  1. ddコマンドでROMイメージ(ファイルシステムはcramfs、chumby.orig.imgと以下表記)をUSBメモリ等外部ストレージに吸出し
  2. Linuxが入った開発用PCで吸出したイメージを適当な位置(/tmp/chumby_root)にツールを使って展開(cramfsck -v -x /tmp/chumby_root chumby.orig.img)
  3. 設定ファイルを編集(例えば今回の目的であるFTDIを起動時に有効にするためには、/tmp/chumby_root/etc/init.d/rcSを書き換える)
  4. 編集した部分を含めた全てのファイルを、cramfsファイルシステムでまとめる(mkcramfs /tmp/chumby_root chumby.mod.img)
  5. zipして、update2/rfs1.bin.zipという名前でUSBメモリ等に保存
  6. それをChumbyにさし、タッチスクリーンを押しながら起動。ファイルを書き換える選択肢があるので、それを選択して完了

開発用のPCが必要であり、非常に面倒です。そこでUSBメモリ内に必要なツールを全ていれ、USBメモリ内にファイルを展開、編集、さらには元のcramfsに戻すことをChumby単体でできるようにすることを検討してみました。遭遇した問題と対策を以下に箇条書きをしてみます。

cramfsを展開、作成するコマンドがChumbyにない
Chumby用に作ります。cramfs-1.1をクロスコンパイラでビルドしました。
cramfsckでUSBメモリ内にファイルがつくれない(cramfsckするとsymlink failed: /bin/ash: Operation not permittedみたいなエラー)
USBメモリはvfatファイルシステムでマウントされており、このファイルシステムではシンボリックリンクが作成できないことに起因します。USBメモリ内にext2ファイルシステムのイメージを作成して、それをループバックマウント、そこに展開するようにしました。『VFAT フォーマットの SD カード上に、ext2 領域を作成してマウント』が参考になりました。
Chumbyじゃext2が扱えないよ(cat /proc/filesystemsにext2がない)
Chumbyのカーネルを拡張します。ext2.koモジュールを作成するよう、カーネルを再構築し、できたモジュールをinsmodで組み込むようにしました。
insmod ext2.koしようとするとinvalid module formatといわれた
Chumbyの中にあるKernelをビルドした環境と、導入しようとしているext2.koモジュールをビルドした環境が異なることに由来します。dmesgを実行すると詳細が見れますが、モジュール内の.modinfoセクションの内容が想定外というエラーだと思いますので、ビルドの環境をあわせる、あるいは少々危険ですがemacsなどでE-x hexl-modeして当該箇所をじかに書き換えてしまう、ということで対応できます。objdump --section=.modinfoの情報も役に立つはずです。
ext2のイメージが作れないよ
これもChumby用にツールを作ります。e2fsprogs-1.41.2パッケージをビルドした結果できあがる、misc/mke2fsがイメージ作成ツールです。
ループバックマウントできないよ!!(mount -o loop -t ext2 ext2.img /mnt/usb/hogeでmount: mounting ext2.img on ./mounted/ failedなエラー)
Chumbyのmountコマンドはコマンド寄せ集めツールBusyboxのものなので、非常に低機能でループバックデバイスを受け付けません。Chumby-1.6.0のカーネルはループバックデバイスを許容するように作られているので、まともなmountコマンドさえあればなんとかなるはずです。ということでutil-linux-ng-2.14.1をパッケージをビルドし、出来上がったmount/mountコマンドを使うようにします。『ぎんあん日誌』が参考になりました。
cramfsckで展開するときに途中でfile inode has zero size and non-zero offsetと表示され、失敗する
(現在調査中です、cramfsckが悪いのか、元のイメージが悪いのか、どちらなのでしょう? orz)→エラーを無視して強制的に展開する-fオプションを追加した改変版cramfsckをつくりました。下からダウンロードできるファイルに同梱してあるのは改変版です。
Chumby用のzipコマンドがないよ
例えばソースをここから落としてきて作ります。
Chumbyのファイルを修正する際にpatchとかdiffがあると便利なんですがねぇ(08/10/20追加)
つくるんです。gnuのFTPサイトにあったpatch-2.5.4diffutils-2.8.1から。

作成したツールはchumby_tools_20081020.zipにまとめておきます。USBメモリ等に展開してChumbyでお使いください。なおFTDIを有効化したいだけなのに、上の話を読んでみた結果がこれだよ!!、という方もご安心ください。後日、設定ファイルの書き換えを行い、それをChumbyに反映してくれるような全自動スクリプトを作るつもりです。

全自動スクリプトできました

11:08 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/668
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。