本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。プロフィールで選択した情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Linux on board:TiVoの素顔

徹底解剖

Peter Seebach, Writer, Freelance
Author photo
Peter Seebachは、たしかこの辺にFileメニューがあったはずだと思っています。Peterはコンピューターを使い始めてすぐに、プログラミングを始めましたが、いまだにGUIを目新しく感じています。

概要: TiVoが「Linux™で動く」ということは、皆さん、聞いたことがあると思います。このLinux on boardシリーズでは、ピーターがTiVoにインストールされているLinuxシステムについて解説します。TiVoシステムを調べてみると、一つの会社がデスクトップ・オペレーティング・システムから組み込みシステムへ遷移した様子がわかります。

日付:  2005年 7月 06日
レベル:  中級 この記事の原文:  英語
アクティビティー: 1700 ビュー
お気軽にご意見・ご感想をお寄せください: 


TiVoの「ハッキング」に関する多数のサイトがあり、そのためのノウハウがあれこれ書かれています(そして、してはならないことも必ず書いてあります)。結局、Linuxで動くものを持つ楽しみの大半は、本来の目的以上(または本来の目的以外)のことをさせることにあります。しかし、大半の人が必要としているのは多数のWebサーバーだけです(今思いつくだけでも、私の家には、組み込みシステムも含めて、すでに10台から15台のWebサーバーがあります)。

TiVoハック攻撃計画についてのちょっとしたアドバイス。おそらく皆さんは、保証の対象外になることと、ビデオ・レコーダーとして使えなくなることを覚悟すべきでしょう。それほどひどいことにはならないかもしれませんが、機械にちょっと手を加えようとしたために修理しなければならない羽目に陥って感じる苛立ちも、壊したのは自分自身だという認識によって相殺されることでしょう。

ハード・ディスクをアップグレードしてみる場合、オンライン・マニュアルには、まず、金物屋でT10とT15のTorxドライバーを買ってくるように書いてあります。これは部分的に良いアドバイスです。TiVoには本当にT10とT15のTorxねじが使われています。しかし、ずらりと並んだTorxビットのコレクションをすでに持っているという種類の人でない場合、これに手を出す必要はありません。KuroボックスとMac Miniのおかげで、かなり手ごろなPowerPC®ハードウェアという選択肢があります。

この実験のために私が選んだのは、40時間のTiVoです。これはSeries2のマシンなので、Series1よりも柔軟性やオープン性がありません。あいにく、今では、それしか手に入りませんが、値段はそれほど高くありません。

バックアップの作成

いつものように、電子環境を変える可能性のあることをするときには、まず、バックアップを取りましょう。TiVoの電源を入れる前に、TiVoのディスクのバックアップを作成しました。このためには、マシンを開いて(T10 Torxビットを使用)、ドライブ・スレッドを外し(やはりT10)、スレッドからドライブを外す必要があります(T15)。これで、40GBディスクが手に入りました。このドライブを旧式のx86 Linuxボックスに入れると、未知のパーティション・テーブルがあることに気づきます。そうです。TiVoにはパーティション(/dev/hde1のような)はなく、ディスク全体が1つのパーティションなのです。問題ありません。

図1. TiVoの内部


TiVo's innards

私のシステムでは、ドライブをドライブ・ベイに入れて、/dev/hdeにしました。外付けドライブ・ベイを使用する場合は、/dev/sdXと表示されるかもしれません。Xは、任意の英字です。他にSCSIまたは擬似SCSIデバイスがない場合はaかもしれませんし、もっと後のアルファベットかもしれません。作業中のディスクはどれかを確認しておいてください!


リスト1. コピーの作成
                
   # bzip2 -1c < /dev/hde > tivo.img.bz2
   

最初は何かがとんでもなくまずいことになっているように見えるかもしれません。しばらくは何も出力が表示されません。このディスクには、最初はゼロで満たされている空のセクターが多数あり、bzip2がそれらを見事に、律儀に圧縮しています。ファイルが4,096バイトに達するまで1分以上かかり、8,192に達するまで数分かかりました。最終的なファイル・サイズは約560MBであり、40GBのディスクのイメージとしては悪くありません。このバックアップからリストアしたい場合は、もう1つの方法を実行するだけです。


リスト2. 運命の逆転
                
   # bzip2 -dc < tivo.img.bz2 > /dev/hde
   

ドライブにデータが入っていると、イメージは560MBよりかなり大きくなります。TiVoドライブのサイズと同じぐらいの空き容量が必要だと考えてください。



では、ディスク上には何があるか?

ディスクはパーティション化されているようには見えないので、何らかの独自フォーマットになっていると考えるのが妥当でしょう。そのフォーマットが何かを見つけ出す時間です。

もちろん、最初にすべきことは、ディスクを生のバイトとして見ることです。まず、ブート・ローダーの構成のような小さなものがあります。


リスト3. このブートは前に見たことがある?
                root=/dev/hda7
runfinaltest=2 contigmem8=16M brev=0x10
   

ただし、その後に、すべての謎を解く鍵があります。このディスクにはAppleパーティション・マップが含まれています。


リスト4. 輝けるApple
                
 0x0200  50 4d 00 00  00 00 00 0d  00 00 00 01  00 00 00 3f  'PM.............?'
0x0210  41 70 70 6c  65 00 00 00  00 00 00 00  00 00 00 00  'Apple...........'
0x0220  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  '................'
0x0230  41 70 70 6c  65 5f 70 61  72 74 69 74  69 6f 6e 5f  'Apple_partition_'
0x0240  6d 61 70 00  00 00 00 00  00 00 00 00  00 00 00 00  'map.............'
0x0250  00 00 00 00  00 00 00 3f  00 00 00 33  00 00 00 00  '.......?...3....'
   

そうではないかと思いましたか?

今にして思えば、Appleパーティション・マップは、PowerPC Linuxボックスがまさに持っているべきものです。Appleパーティション・マップのサポートは珍しいことではなく、かなり詳しく説明されています。MIPSシステムではそれほど一般的ではありませんが、PowerPCで動作していたSeries1システムとの互換性が考慮されたのでしょう。

厳密に言うと、これはまだ独自フォーマットです。有名なフォーマットであるにすぎません。あいにく、どのパーティションもOS Xになじみのあるフォーマットではありませんが、私のMac Miniはパーティション・テーブルを読み取ることができました。パーティション・マップを以下に示します。


リスト5. なじみのあるフォーマットでしょう?
                
   Partition map (with 512 byte blocks) on '/dev/rdisk1'
 #:                type name                       length   base     ( size )
 1: Apple_partition_map Apple                          63 @ 1
 2:               Image Bootstrap 1                     1 @ 44161324
 3:               Image Kernel 1                     8192 @ 44161325 (  4.0M)
 4:                Ext2 Root 1                     524288 @ 44169517 (256.0M)
 5:               Image Bootstrap 2                     1 @ 44693805
 6:               Image Kernel 2                     8192 @ 44693806 (  4.0M)
 7:                Ext2 Root 2                     524288 @ 44701998 (256.0M)
 8:                Swap Linux swap                 262144 @ 45226286 (128.0M)
 9:                Ext2 /var                       262144 @ 45488430 (128.0M)
10:                 MFS MFS application region     524288 @ 45750574 (256.0M)
11:                 MFS MFS media region         33494098 @ 46799150 ( 16.0G)
12:                 MFS MFS application region 2   524288 @ 46274862 (256.0M)
13:                 MFS MFS media region 2       44161260 @ 64       ( 21.1G)


Device block size=512, Number of Blocks=80293248 (38.3G)
DeviceType=0x0, DeviceId=0x0

これで、だいたい予想が付きます。ひとつ言えば、これはおそらく、アップデートを安全にするために、あるファイル・システムを別のファイル・システムから実行中にアップデートするために設計されたように見えます。また、驚いたことに、これによって、ファイル・システムから認識できる正確なブロック・オフセットとサイズがわかります。つまり、ドライブをLinuxボックスに接続し直して、これらのファイル・システムを見てみる時間です。


リスト6. ファイル・システムの詳しい調査
                
   # dd if=/dev/hde bs=512 count=524288 skip=44169517 of=root1.img
# dd if=/dev/hde bs=512 count=524288 skip=44701998 of=root2.img
# dd if=/dev/hde bs=512 count=262144 skip=45488430 of=var.img

ルート1ファイル・システムはフォーマットさえされていないことがわかります。256MBのヌル・バイトにすぎません。しかし、ルート2ファイル・システムは有望です。


リスト7. ユーレカ!
                
# file root2.img
root2.img: Linux rev 0.0 ext2 filesystem data
# mount -o loop root2.img /mnt
# ls /mnt
. bin  diag  etc       initrd   lib         mnt  proc  sbin  tvbin  var
..dev  dist  etccombo  install  lost+found  opt  res   tmp   tvlib
# mount -o loop var.img /mnt/var
# ls /mnt/var
. a    dev   etc  lost+found  mnt   packages  run    tmp
..bin  dist  log  mess        mtab  persist   state  utils
   

これが基本的に独自システムであることによるデメリットの1つは、出荷時のTiVoはユーザーによる改変防止を目的とした「セキュリティ」機能を備えていることです。これは単純な経済問題です。ハード・ドライブとTVチューナー付きの汎用MIPSシステムを100ドルで販売したのでは、たちまち破産してしまいます。そこで、今のところは、Linuxがこのシステムをどう変えるのかではなく、どのように動作するのかを見るだけにしておきます。

あるシステムから別のシステムへのext2ファイル・システムの便利な互換性は、通常のLinuxボックスで遊ぶという選択肢があることを意味します。クロスコンパイラーと関連ツールをセットアップして、もう少し突っ込んでつつきまわすこともできます。ただし、物事を簡単に変えられるとは期待しないでください。変えることができたとしても、簡単で便利になるとは限らないのですから。忘れてならないのは、これはビデオを記録する機能を備えた専用のハードウェアであるということです。言うまでもなく、多くの企業は、大きく変えるのが難しいものであってほしいと願っています。

TiVoのこの特定のモデルでは、カーネルがロードされる前にハードウェア・セキュリティ・チェックがあります。さらに、カーネル自体に、いくつかのセキュリティ機能を含んだRAMディスクが組み込まれていて、/var/utils/checkkernel.tclスクリプトなど、ハード・ドライブ上で見つかったコードと比較します。

注目に値するのは、インストール当初に、非常に大量の余分なスペースがあることです。ルート・ファイル・システムの使用領域は54MBであり、空き領域は182MBです。/varの使用領域は3MBであり、116MBが空き領域です。もちろん、これは、見たい番組など、大量のデータを格納するためです。



ソフトウェアの調査

TiVoでさらに面白いことの1つは、専用アプリケーションの豊富さです。理論上はディスプレイを利用できますが、実際には画面上のテキストをスクロールすることさえできません。/tvbin/text2osdという名前の実行ファイルがあり、これは出力されるビデオの上にオンスクリーン・ディスプレイとして単語を書き出すアプリケーションのようです。おもしろいPNGファイルの集合もあり、すべて一般的なビデオのサイズであり、表示する必要があるメッセージを含んでいます。私の好きなダグラス・アダムス流に言えば、「あわてるな」。

このソフトウェアは少々まとまりがありませんが、実際には、「直感的」な場所にある必要はないわけです。開発チームにわかればいいだけなのですから。他のことに比べて、筋がとおらないこともあります。TiVoソフトウェアはすべて/tvbinと/tvlibにありますが、プログラムの多くの構成ファイルは/opt/tivoにあります。より伝統的なLinuxファイル・システムのレイアウトであれば、ファイルは/opt/tivo/bin、/opt/tivo/lib、および/opt/tivo/etcに置かれていたでしょう。

Tclスクリプトを見ると、それが/tvbin/tivoshによって解釈されていることに気づきました。これはおそらくtclインタープリターです。しかし、ちょっと待ってください。これは実際にはtivoappというプログラムへのシンボリック・リンクです。さまざまなプログラムがtivoappにリンクされています。これは多数のさまざまなプログラムのビットを含んでいる統一バイナリーのようです。このアプリケーションがこのようになっている理由はすぐにはわかりませんが、メモリー・フットプリントを減らすためかもしれませんし、単にシステムをクラックしにくくするためかもしれません。

ミスマッチ

注目に値すべきこととして、TiVoはシェル・スクリプト、Tclプログラム、およびバイナリーのかなり緩い組み合わせだということです。特定のプログラムを見てみると、それが何をするプログラムなのか、かなりのことがわかります。たとえば、installNFSスクリプトは、bashで書かれていて、text2osdを呼び出してメッセージを表示します。インラインTclスクリプトさえあります。

開発面でのLinuxの大きな強みの1つは、このような開発ツールのミスマッチの自由度が高いことです。TiVoはこの点をうまく利用しています。

システム・ブート

どのLinuxシステムとも同様に、TiVoも/sbin/initを分岐生成し、これが/etc/inittabを検索して、何をすべきかを決定します。最初にするのは、/etc/rc.d/rc.sysinitの実行です。そして、これがStageA_PreKickstartやStageG_PostApplicationなどの名前が付いたディレクトリーにあるファイルを実行します。これらは順に実行されます。

これらのディレクトリーのそれぞれに、rc.Sequence_150.CheckForDebug.shというような名前の多数のスクリプトが含まれています。これらは、従来のLinuxシステムでの/etc/rc.d/rc3.d/S12sshdのようなファイルに相当します。シェルの照合拡張の習慣(rc.Sequence_*.sh)が、順序付けのために使用されています。スクリプトの名前に.Platformという文字列が含まれる場合、それは一致するハードウェアでだけ実行されます。

これは家電メーカーにとって良い設計です。マシンごとにディスクの組み立て方を変える必要がないからです。.Implementationおよび.Implementerフラグについても同じことが言えます。これらは、特定のシステムでだけ実行するスクリプトを識別します。rcN.dディレクトリーはなく、その代わりにStageディレクトリーがあります。

この編成は、ブートの各段階で何がおこなわれているのかを比較的わかりやすくします。面白いことに、シェル・スクリプトが親シェルにソースを提供しているので、始めの方のスクリプトで、後で使用するスクリプトの環境変数を設定することができます。



まとめ

TiVoは、Linuxのさまざまな理念を体現している魅力的な例であり、サービスを売り、ユーザーにとって単純で堅牢なアプリケーションを提供することによって収益を得ている企業の理念とは鋭い対称を見せています。自称ハッカーにとって最もいらいらさせられる機能の多くは、おそらく、完全にカスタマイズされたボックスによって、ユーザーがカスタマー・サポートに電話しなくて済むように、また、なぜ動かないのだろうと思ったりすることがないようにするためのものです。

一方、マシンをいじるのをますます難しくための努力が行われているのも明らかです。初期のTiVoシステムは、しばしばWebサーバーに転用されました。私が調べたのは、誰でもわかるように、ソフトウェアの無許可の改変をチェックするPROMを実際にハードウェア・ハックしないことには、新しいカーネルを走らせたり、カーネルを大幅に変えたりすることはできません。

特に興味深いのは、GPLがTiVoにカーネルのソース・コードを作成するように強制しながら、実際には、Linuxで動くけれども、ユーザーによるどんな変更も許さないようなボックスを作れないようにしているわけではないということです。このボックスの面白さの大半は、何をどんな風にしているのか、いかに多彩なオープン・ソース・ツールとテクノロジーを使用して組み込みアプリケーションが作られているかを学ぶことにあります。



参考文献

  • Peter執筆による、Linux on boardシリーズの他の記事も読んでください。

  • Series2 TiVoは、Broadcom BCM7317チップを基にしています。このチップはMIPSコアに、セットトップ・ボックスを手軽にサポートするための機能が付加されています。

  • Atmel AT90SC6464C chipは低消費電力でハイ・パフォーマンス、8/16ビットのセキュアなマイクロコントローラーです。64KB/64KBのROM EEPROMと、セキュリティー機能として、MMUやMED、OTP (One Time Programmable) EEPROM領域、RNG (Random Number Generator)、「領域外」検出機構、副チャネル攻撃対策などを備えています。

  • TiVoを、もう少し愛想の良いハードディスク・レコーダーに変身させるための資料として、hacking the TiVo Series 2があります。

  • TiVoをいじるための議論が沸騰している場所として、DealDatabase Forumがあります。ただし、DirectTVを無料視聴できるような方法は提供していません。

  • PeterのTiVoのニックネームはSeries 2.5です。セキュリティーを上げるために、再フラッシュ不可能なチップを使っています。これについては、このスレッドを読んでください。

  • The Hitchhiker's Guide to the Galaxy(ムービー版)というサイトを見てください。パニックに陥らないようにご注意!

  • Linuxが組み込み市場を席捲する3つの理由」(developerWorks, 2001年5月)では、権利使用料とデバイス機能、単一プラットフォームという約束、の3つを挙げています(この記事ではTiVoについても触れています)。

  • Software Development for Consumer Electronics: Bigger, Better, Faster, More -- Or Bust」(The Rational Edge, 2004年)では、利益率が紙のように薄いコンスーマー・エレクトロニクスにとって、最善の選択肢がLinuxであることを詳述しています。

  • Emulation and cross-development for PowerPC」(developerWorks, 2005年1月)は、PowerPCエミュレーションとクロス・コンパイルを紹介しています。

  • A developer's guide to the POWER architecture」(developerWorks, 2004年3月)は、アプリケーション・レベルでのPowerPCプログラミング・モデルを紹介し、命令セットや重要なレジスターなどの概要を提供しています。

  • developerWorksのLinuxゾーンには、Linux開発者のための資料が、他にも豊富に用意されています。

  • developerWorks blogsに参加して、developerWorksのコミュニティーに加わってください。

  • 皆さんの次期Linux開発プロジェクトを、IBM trial softwareを使って構築してください。developerWorksから直接ダウンロードすることができます。

著者について

Author photo

Peter Seebachは、たしかこの辺にFileメニューがあったはずだと思っています。Peterはコンピューターを使い始めてすぐに、プログラミングを始めましたが、いまだにGUIを目新しく感じています。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=229514
ArticleTitle=Linux on board:TiVoの素顔
publish-date=07062005
author1-email=dwlinux@plethora.net
author1-email-cc=