« 地元のマクドでピアノの生演奏 | Main | 長官ゆうすけ »
iPod touch を弄っていたらうっかり善悪を知るの木をかじってしまいあわや楽園から追い出されてしまうというところまで行ってしまいました。でも救われました。
iPod touch は純正のまま web アプリをホーム画面に追加(「クリップ」と言うらしい)して使っていても素敵なガジェットです。ですから以下に述べることは明確な目的が無いときはしてはいけません。したら Apple のサポートを受けられません。
そう、Jailbreak です。これは iPod touch の Safari の脆弱性を突いて、プロテクトされている領域をこじ開けて、ユーザが作成したネイティブアプリケーションのインストーラをインストールしてしまう行為です。以後、このインストーラから様々なアプリケーションをインストールすることができるようになります。
以前は小難しいことをしなければならないようでしたが、今は ZiPhone というツールがあります。これを使うと簡単に実行することができます。まず最初にこれを用いてインストーラをインストールしました。
続いて、そのインストーラを使って次をインストールしました。
BSD Subsystem
BSD Unix の基本的な各種コマンド群です。iPod touch の OS は一種の Mac OS X なので UNIX ベースの使い方ができます。そのときに使えるものを充実させてくれます。
ssh, sftp などセキュアなリモート接続のためのクライアントプログラムと、それを受けるサーバ側のプログラムです。
OpenSSH のサーバ側のプログラムの自動起動を抑制したり、再び自動起動するようにしたりするためのアプリです。Wi-Fi の ON/OFF もできます。
iPod touch 上でターミナルを使うとき、バックスペースキーを打っても文字が削除されず、バックスペースのコントロール文字が表示されてしまう問題を解消するものです。
iPod touch 上でターミナルを起動すると、mobile というユーザ名義で起動されるのでログインができない問題を解消するものです。
日本語キーボードも使えるターミナルアプリで「ひとりぶろぐ: [iPod touch]iPod touch / iPhone用ターミナルTerminal.appを改造し日本語キーボードOK、Ctrl一発入力可能に」で開発者の moyashi さんが紹介しています。
ターミナルでテキストファイルを見る基本のコマンドは more や less ですが、僕はもう何年も lv というコマンドを使っています。lv がインストールされていないだけでその UNIX 系 OS は使うのが嫌になるくらいです。
ここまでインストールして何をするかは別なエントリにしますが、とにかくここまで入れました。こうなると手元の MacBookPro から ssh で iPod touch にログインして色々できますし、sftp でファイルを送受信することもできます。rsync コマンドで iPod touch の中身を差分バックアップもできるし、MacFuse の sshfs を使えば iPod touch をディスクとしてマウントできて、もう何でもありです。
さて、こうなってくるとセキュリティに気を配らないとなりません。iPod touch の root アカウントと mobile アカウント(そういうのがある)のパスワードは一律同じですから、そのままでは ssh でアクセスされると誰でもログインしてやりたい放題ができてしまいます。
これも詳しくは別なエントリにしますが、セキュリティ対策の一環として root と mobile アカウントのパスワードを変更することにしました。UNIX でパスワードの変更と言えば passwd コマンドです。実は BSD Subsystem をインストールしたときに passwd コマンドを使うと壊れるから使うなという警告が出ていたのですが、この頃にはすっかり忘れていました。
passwd コマンドで root と mobile のパスワードを変更して、login コマンドでログインセッションをもう一度やってその結果を確認してよしよしと思って iPod touch を再起動したのです。iPod touch の画面が暗くなって夕となり、そして起動されて朝となりました。
起動されてみると、一瞬 USB 接続をしろという画像が表示されたかと思うと何か実行中を示す「ギア」が表示されてホーム画面(SpringBoard という)が再起動されてしまいます。しかも各種アイコンのラベルが英語に戻っているだけでなく、デフォルトのアイコンしか表示されていません。あれあれと思っている数秒後には再びギアが表示されて操作不能になり、また SpringBoard が再起動されます。
その間、ssh でログインはできます。そしてそこから reboot コマンドで再起動することもできます。iPod touch には shutdown コマンドが無いので再起動しかできません。電源ボタン長押しで電源を切ろうにも、シャットダウンの途中で SpringBoard が再起動されてシャットダウンできません。
iTunes から「復元」を行って元に戻そうと、USB 接続をしました。でも iTunes は iPod touch が接続されたことを認識しません。ZiPhone も同様です。つまり、外部との繋がりは ssh のみになってしまいました。
更に、USB 接続しても給電されません。どんどんバッテリーが消耗されていきます。このままバッテリーが底をついたら唯一残された ssh による操作も断たれてしまいます。電源ボタンとホームボタン(正式な名前は違うと思いますが持っている人はわかりますよね)を同時に長押しして強制シャットダウンしたらバッテリーの消耗は防げますが、同時に何もできなくなります。その後、再び起動しても同じです。もう USB 接続を促す画面にすらなりません。なっても繋がらないから同じでしょう。
とにかく時間がありません。ゆっくり web で調べている暇もありません。バッテリーが枯渇する前になんとか解消しなければ!
実は root と mobile のパスワードを変更する前後に TerminalV をインストールしました。原因はそのどちらか、あるいはその両方だと考えるのが妥当でしょう。しかし、もうこのころには passwd コマンドをするなと言われていたのを思い出していたので、TerminalV は容疑者から外しました。
passwd コマンドはパスワードを変更するコマンドですが、それが変更をするのは /etc/passwd というファイルか、それと併せて使用されるファイルです。後者のファイルはシステムによって変わりますが iPod touch の場合は /etc/master.passwd です。これ以外に変更する必要がないはずです。ということはこの二つのファイル、あるいはどちらかのファイルが壊れたに違いありません。
ssh でログインしてこれらのファイルを覗いてみたら確かに壊れていました。たしかフィールドの数が合っていませんでした。もうどっちがどうなったかは忘れてしまいましたが、バージョンが異なる形式になっていたようです。何しろタイムリミットが刻一刻と迫る中やっていたので、見つけたその場で速攻対処となり、何がどうだったかは薄ぼんやりとしか覚えていません。
ssh でログインした状態で /etc に移動し、passwd ファイルと master.passwd ファイルを別名でコピーして待避させておいてから、vi コマンドで正しいフォーマットに直しました。パスワードフィールドは MacBookPro の perl の crypt 関数を使って値を生成してそれを書き込みました。
login コマンドでパスワードが正しく変更されたことをもう一度確認して、reboot コマンドで iPod touch を再起動。SpringBoard の再起動無限ループ地獄という死の宣告は解消されました。USB からの給電も復活し、iTunes から認識もされるようになったのです。
死の宣告は回避したものの、まだ変でした。
これは再び設定すれば直ります。
これももう一度登録すれば直ります。
これももう一度登録すれば直ります。
それでもディスクには残っています。iTunes で見てもリストされています。それを iTunes から全部削除してディスクは一旦空きますが、iTunes から再び転送しても iPod touch の表示では消滅したままです。
要するに、iPod touch から iPod 機能が全く使えなくなってしまい、ただの touch になってしまったのです。
USB 接続が復帰しているので iTunes から「復元」してもう一度最初からやり直すと直りました。その代わり、全部始めからやり直しです。