前のブログで 4GB の SD カードについて書きましたが、この4GSDを使っていて一番不便なのは zaurus 標準の「アプリケーションの追加と削除」から ipk パッケージをインストールでできないことです。
ipkg コマンドをシェルから実行することで一応インストールは可能らしいのですが、シンボリックリンクを自分で張らないといけない(?)など、ちょっと面倒そう。。
ということで、標準アプリでどうにか ipk をインストールできないか試行錯誤してみました。
以下、個人的なメモなので、口調を変えてます。
症状から推測
まず、症状はSDカードへインストールすると「 アプリケーション追加先のメモリーが足りません」と表示される。(その時の画面が張られたブログ)
その症状から空き容量の計算がうまくいっていないことが分かる。また、2GB SD カードではエラーは出ないことから、2GB超えに問題がありそう。
2GB/4GBというと、16進数にすると、0x80000000 Byte/0x100000000 Byte なので、signed long int / unsigned long int 型で扱えない値ということで、この辺がクサい。
おそらく、(unsinged?) long 型で残容量を取得して、パッケージの必要容量を差し引いてマイナスだったらという判定をしてると思われる。何となく以下のような処理になっているのではないか。(ソースがないのでかなり適当)
unsigned long available_size = get_available_size(path);
int package_size = get_package_size(ipk_path);
if ( available_size - package_size < 0 ) {
容量が足りない!
}
この辺を何とかゴニョゴニョできれば良いのではないかと。
バイナリ探し
さて、指定したファイルシステムの空き容量を調べるには通常 statfs 関数を使う(MANページ)ので、強引に grep で statfs を使っているファイルを検索してみた。
# grep -c statfs /opt/QtPalmtop/*/* | grep -v :0
# grep -c statfs /opt/QtPalmtop/*/*/* | grep -v :0
(zaurus の grep には -r オプションがないので・・・)
すると、/opt/QtPalmtop/binlib/qinstall.so が見つかった。名前を見ても合ってそうな雰囲気。
「ソフトウェアの追加/削除」アプリは /opt/QtPalmtop/bin/qinsall を実行すれば起動するが、シンボリックリンクになっており、実際は quickexec というコマンドが実行されるらしく、実際のインストール処理は qinstall.so が行っているようだ。
ちなみに、qinstall.so は常駐している qeserver プロセスがリンクしているようで、おそらくquickexec がプロセス間通信を行って、qeserver のインストール処理を起動しているのではないかと。
初めは、qinstall が単体のアプリになっていると思っていたので、LD_PRELOAD を使って statfs を置き換えるようなライブラリをリンクしてしまおうかと思ったんだけど、qeserver は qinstall.so だけでなく、多くの設定アプリ系の *.so をリンクしているので、qeserver 全体で statfs を置き換えるのはちょっと影響が大きそうだ。
qinstall.so の調査
Linux-PC に qinstall.so を取り出して、arm-linux-objdump を使ってシンボルを調べてみる。
# arm-linux-objdump -TC qinstall.so | less
:
00000000 DF *UND* 00000010 GLIBC_2.0 statfs
:
確かに statfs がリンクされているようだ。
シンボルをざっと見ていたら、気になるシンボルを発見。
00026d20 g DF .text 000001bc Base InstallUtil::getAvailableSize(QString)
お、なんかそれっぽい関数発見。
名前から想像するに、パス名を与えるとその空き容量を返すような関数なのだろう。
この関数に手を入れて空き容量をごまかせばいけるかも。
(続く・・・かな?)
凄い! ゾクゾクしますね。
はじめまして、chida 様。
こういうネタに食いつくとはなかなか通ですねぇ (^^)
いつも拝見しております。無線LANドライバもありがたく利用させて戴いています。
SL-C3200ユーザーなのですが、トランセンドの4GBのSD TS4GSD150とスペシャルカーネルv18iの組み合わせで、Zaurus 標準の「アプリケーションの追加と削除」から ipk パッケージをインストールできています。なにかの参考になれば。
お久しぶりです。Haniwa 様。
ちょっと前になりますが、トラックバックありがとうございました。
想像ですが、インストールできた時の SD カードの残容量は 2GB 以下だったのではないでしょうか。
残容量が signed long に収まらなくなるとインストールできなくなるのではないかと思ってます。
私の SD カードでも残容量を変えて試してみますね。
こちらこそありがとうございます。
4GBのSD(非SDHC)カードの空き容量なのですが、「システム情報」で見ますと、3,086.176KBあります。合計は4,012.032KBで、使用は925.856KBです。
SL-C3200は、他の4桁機と仕様が異なるのでしょうか。
SHARPのサイトの CF の動作確認機器一覧に答えが書いてありました!
SL-C3200の動作確認CF
http://support.ezaurus.com/sl-c3200/peripheral/cfcard_sl.asp
SL-C3100の動作確認CF
http://support.ezaurus.com/sl-c3100/peripheral/cfcard_sl.asp
SL-C3100までは、4GB以上メディアでは制限があることが一番下に書かれていました。
ということで、SL-C3200 ではこの問題は発生しないと言うことですね。
情報ありがとうございました!