Linux 的魅力: TiVo 揭密

發表于:2007-05-25來源:作者:點擊數: 標簽:
不僅僅是拆卸 級別: 中級 Peter Seebach 作家, Freelance 2005 年 7 月 25 日 每個人都已經知道 TiVo 可以運行 Linux。在這一期的Linux 的魅力中,Peter 將介紹一下在 TiVo 上安裝的 Linux 系統。研究 TiVo 系統可以展示出一個公司是如何從桌面操作系統轉換
不僅僅是拆卸

級別: 中級

Peter Seebach
作家, Freelance
2005 年 7 月 25 日

每個人都已經知道 TiVo 可以“運行 Linux”。在這一期的“Linux 的魅力”中,Peter 將介紹一下在 TiVo 上安裝的 Linux 系統。研究 TiVo 系統可以展示出一個公司是如何從桌面操作系統轉換到嵌入式系統的。

有很多有關 TiVo“黑客”的站點會介紹這樣那樣的事情(通??傔€有其他一些事情)。畢竟,對于擁有運行 Linux 的設備,有一半的樂趣是讓它做比我們想做的更多(或者略有不同)。但是我們大部分人都只需要使用 Web 服務器(在我的印象中,在我家里已經有 10 臺到 15 臺 Web 服務器了,包括嵌入式系統)。

下面我們為計劃的 TiVo 黑客攻擊給出一些建議。您可能應該假設:您要排除所有的保證,以及它不能像一臺錄像機那樣工作。這并不是您喜歡去修補問題,而是因為,試圖在發生任何微小的變化時就對機器進行修改會導致問題惡化,但是這種惡化將被對問題的意識而抵消。

如果您正在試圖升級硬盤,有些在線的指南會告訴您,首先從硬件倉庫找到 T10 和 T15 Torx 螺絲起子。這從某個方面來說是個好建議:TiVo 的確使用了 T10 和 T15 Torx 螺絲。然而,如果您不是那種早已搜集了很多 Torx 工具的人,那就可能并不希望搞混這個問題。幸虧有了 Kuro 和 Mac Mini,您可以選擇其他價格合理的 PowerPC® 的硬件。

對于這個實驗,我的選擇是 40 小時的 TiVo。這是一臺 Series2 機器,這意味著它不如 Series1 靈活和開放。不幸的是,這是目前它們所銷售的惟一產品,好在價格不貴。

備份
通常,在計劃要做一些可能會修改電子器件的修改時,首先要進行備份。在對 TiVo 進行加電之前,我對整個磁盤進行了備份。這要打開機器(使用 T10 Torx 工具),松開驅動器(還是使用 T10),并拔出驅動器(使用 T15)?,F在您得到了一個 40 GB 的硬盤。將這個硬盤放到一個老的 x86 Linux 機器中,您會看到一個不能識別的分區表。因此,在 Tivo 上并不存在分區(例如 /dev/hde1),而是一整塊磁盤。這并沒有什么問題。

圖 1. TiVo 內視圖
TiVo 內視圖

在我的系統中,我將這塊磁盤放到了一個驅動器插槽中,系統將其識別為 /dev/hde。如果您使用一個外部的驅動器插槽,那么系統可能將其識別為 /dev/sdX,其中“X”是一個字母;如果您沒有其他 SCSI 或者偽 SCSI 設備,那么這個字母可能就是“a”,也可能是后面的某個字母。確保您清楚自己要使用哪塊硬盤!

清單 1. 進行備份
clearcase/" target="_blank" >cccccc" border="1">

            # bzip2 -1c < /dev/hde > tivo.img.bz2
            

注意開始可能會出現一些嚴重的錯誤;而且一段時間內可能不會有任何輸出結果。這個磁盤中包含了很多 空扇區,一開始整個扇區的內容都為 0,bzip2 負責對磁盤上的內容進行壓縮 —— 在到達 4,096 字節之前可能需要 1 分鐘,在到達 8,192 字節時還需要幾分鐘。最后的文件大小大約是 560 MB,對于一個 40 GB 的磁盤映像文件來說這還不錯。如果您希望從這個備份進行還原,只需要執行下面的命令:

清單 2. 反向還原

            # bzip2 -dc < tivo.img.bz2 > /dev/hde
            

如果您的磁盤上已經有一些數據,這個映像文件可能會遠遠大于 560 MB。此處假設您具有與 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....'
            

您還懷疑嗎?

回顧一下,對于運行 Linux 的 PowerPC 機器來說,使用一個 Apple 分區映射是非常合理的。對于 Apple 分區映射的支持并沒有什么特殊,也有很好的文檔進行介紹。這對于 MIPS 系統來說并不是非常典型,但是卻可以選擇與 Series1 系統兼容,后者是在 PowerPC 上運行的。

嚴格來說,這仍然是一種專有格式;不過它已經是大家都知道了的一種格式。不幸的是,這些分區使用的都不是 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
            

這顯示 Root 1 文件系統尚未格式化;它只是 256 MB 的空字節。而 Root 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
            

安全性
采用專用系統的缺點之一是,TiVo 具有一些旨在防止別人修改它的“安全性”特性。這是一個非常簡單的經濟學問題 —— 以 100 美元的價格銷售具有硬盤和 TV 諧調器的通用 MIPS 系統的任何公司很快就破產了。對于現在來說,我們只是要了解一下 Linux 是如何在這個系統上運行的,而不是了解如何修改它。

注意,ext2 文件系統在不同系統之間的兼容性意味著您可以選擇使用一個普通的 Linux 機器。您甚至可以設置一個交叉編譯器以及相關的工具,后面我們會更詳細地進行介紹。然而,不要期望能夠很容易地修改內容;盡管已經可以這樣做了,但是這并不意味著這非常簡單。記住,這是一個專有的可以實現錄像功能的硬件。更不必說,有很多公司都非常希望難以對它做較大修改。

在這個特定的 TiVo 模型中,在加載內核之前,要進行一個硬件安全性檢查。然后,內核本身具有一個內嵌的 RAMdisk,其中包含了一些安全性特性;我們可以對在硬盤上找到的代碼進行比較,例如 /var/utils/checkkernel.tcl 腳本。

值得指出的是,在原始安裝中有大量的額外空間。根文件系統使用了 54 MB 的空間,還有 182 MB 的剩余空間;/var 使用了 3 MB,還有 116 MB 的空閑空間。當然,這樣做的目的是為了存儲大量的數據,例如您需要監視的程序。

看一看軟件
關于 TiVo 最有趣的一件事情是它有很多特殊用途的應用程序。雖然從理論上來說它有一個顯示設備,但是實際上它只能通過在屏幕上卷屏來顯示文本。系統中有一個可執行文件 /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 具有一個非常松散的 shell 腳本、Tcl 程序和二進制程序的組合。查看一下程序,就可以了解到該程序到底做什么。例如 installNFS 腳本,是使用 bash 編寫的,它調用 text2osd 來顯示消息。這個腳本中甚至內嵌了一個 Tcl 腳本!

對于開發來說,Linux 的一大魅力就在于它可以自由地混合并適應開發工具的要求,例如 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 文件類似。注意 shell 的擴展順序(例如 rc.Sequence_*.sh)用來確定這些文件的執行順序。如果一個腳本的名字中包含字符串 .Platform,那么它就只能在所匹配的硬件上運行。

對于供應商來說這是一個很好的設計,因為他們并不需要為每臺機器都構建不同的磁盤。.Implementation 和 .Implementer 標記與此類似,它們用來標識只在某些系統上運行的腳本。Stage 目錄替換了 rcN.d 目錄,后者在 TiVo 系統上已經不存在了。

這種組織方式使查看在啟動的每個步驟中到底執行了哪些功能變得相當簡單。有趣的是,這些 shell 腳本被引入了父 shell 中,這樣,早期的腳本就可以為以后的腳本設置一些環境變量了。

結束語
TiVo 是眾多不同 Linux 哲學中一個非常迷人的例子,它還在不斷發展,與公司通過向用戶銷售服務和提供簡單健壯的應用程序來賺錢的哲學形成了顯著的對比。黑客發現的最有效的很多特性可能是讓其他人不能使用完全定制的系統的客戶技術支持,同時納悶它們為何不能工作。

從另外一方面來說,現在已經進行了大量的努力來使得對系統的攻擊更加困難。早期的 TiVo 系統通常被修改成 Web 服務器。我正在查看的一個特性正如任何人都了解的一樣,不能用來運行新內核;也不可能不經過對硬件(PROM,用來檢查對軟件的未經授權的修改)的攻擊就對系統進行大量的改變。

值得一提的是,盡管 GPL 要求 TiVo 必須公開自己的內核源代碼,但是并沒有不讓它們構建一個不許您做任何更改的運行 Linux 的系統。這種系統有趣的方面在于,了解系統如何來實現自己的功能,以及如何使用各種開源工具和技術來構建一個嵌入式應用程序。

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97