deb

deb

DEB是Debian軟體包格式的文件擴展名,跟Debian的命名一樣,DEB也是因Debra Murdock而得名,她是Debian創始人Ian Murdock的太太。

軟體包


Debian包是Unixar的標準歸檔,將包文件信息以及包內容,經過gzip和tar打包而成。
處理這些包的經典程序是dpkg,經常是通過Debian的apt-get來運作。
通過Alien工具,可以將deb包轉換成rpm、tar.gz格式。
deb包在Linux操作系統中類似於windows中的軟體包(exe),幾乎不需要什麼複雜的編譯即可通過滑鼠點擊安裝使用。此外,deb廣泛應用于越獄后iOS軟體及MeeGo(含Maemo軟體)中。

應用格式


deb 格式是 Debian 系統(包含 Debian 和 Ubuntu )專屬安裝包格式,配合 APT 軟體管理系統,成為了當前在 Linux 下非常流行的一種安裝包。進入 2.x 時代之後有 Cydia 作者 Jay Freeman(saurik)移植到 iPhone 平台上,一起的還有 APT 軟體管理系統。

安裝包格式


deb 是 Unix 系統(其實主要是 Linux )下的安裝包,基於 tar 包,因此本身會記錄文件的許可權(讀/寫/可執行)以及所有者/用戶組。
由於 Unix 類系統對許可權、所有者、組的嚴格要求,而 deb 格式安裝包又經常會涉及到系統比較底層的操作,所以許可權等的設置尤其重要。
deb 包本身有三部分組成:數據包,包含實際安裝的程序數據,文件名為 data.tar.XXX;安裝信息及控制腳本包,包含 deb 的安裝說明,標識,腳本等,文件名為 control.tar.gz;最後一個是 deb 文件的一些二進位數據,包括文件頭等信息,一般看不到,在某些軟體中打開可以看到。
deb 本身可以使用不同的壓縮方式。tar 格式並不是一種壓縮格式,而是直接把分散的文件和目錄集合在一起,並記錄其許可權等數據信息。之前提到過的 data.tar.XXX,這裡 XXX 就是經過壓縮后的後綴名。deb 默認使用的壓縮格式為 gzip 格式,所以最常見的就是 data.tar.gz。常有的壓縮格式還有 bzip2 和 lzma,其中 lzma 壓縮率最高,但壓縮需要的 CPU 資源和時間都比較長。
data.tar.gz包含的是實際安裝的程序數據,而在安裝過程中,該包里的數據會被直接解壓到根目錄(即 / ),因此在打包之前需要根據文件所在位置設置好相應的文件/目錄樹。
而 control.tar.gz 則包含了一個 deb 安裝的時候所需要的控制信息。一般有 5 個文件:control,用了記錄軟體標識,版本號,平台,依賴信息等數據;preinst,在解包data.tar.gz 前運行的腳本;postinst,在解包數據后運行的腳本;prerm,卸載時,在刪除文件之前運行的腳本;postrm,在刪除文件之後運行的腳本;在 Cydia 系統中,Cydia 的作者 Saurik 另外添加了一個腳本,extrainst_,作用與 postinst 類似。

安裝包特點


豐富的資源:Cydia 上本身就不少,更何況任何格式的安裝包都可以轉換為 deb。
相對方便的在線購買模式:Cydia Store,不過儘管沒有 App Store 的5台設備的限制,但對國內用戶來說,付款方式比較困難。
破解難度較大,沒有使用 App Store 的驗證方式,所以必須將驗證和防破解措施加入程序裡面,這樣就比較難破解,對軟體開發者來說是個好事。
完善的 Unix 文件系統支持:無需以命令設置文件的許可權、所有者和用戶組(當然也可以以腳本來設置)
完善的腳本支持:5個腳本依照安裝和卸載的先後順序執行,可以提供更多選擇。比如備份還原操作,可以在 preinst 中備份文件,而在 postrm 中還原文件
嚴格的依賴關係:deb 遵循嚴格的依賴關係(於 Depends 和 Pre-Depends 指定),可以確保軟體運行所必需的組件。在線安裝的時候會自動安裝所依賴的軟體包。卸載時也很重要,比如軟體包 A 依賴於 B,當卸載 B 的時候會提示 A 依賴於 B,卸載掉 B 的話會導致 A 不能用,這樣可以確保系統的完整性和穩定性。
Conflicts、Replaces、Provides 等鍵值的存在可以實現衝突提示或替換其它軟體包。
完全許可權:由於 deb 必須以最高許可權 root 的身份運行,deb可以對系統任何位置進行操作,換句話說,deb 擁有對整個系統的完全控制,因此 deb 安裝包軟體可以實現很多 ipa 不能實現的功能。
相對簡單的獲取方式(在線或離線)和安裝方式,也不用擔心在不同機器上同步會刪掉程序的問題。
安裝相對簡單:其實無論是哪種安裝包,安裝方法都不算很複雜,只不過 deb 稍微複雜一些。

安裝方法


Cydia 或同類 APT 管理軟體在線安裝,這個是最佳的安裝方式,因為通常無需考慮依賴關係,但缺點是對網路的要求比較高;
命令行中以 dpkg -i XXX.deb 的形式安裝,好處是可以以通配符一次性安裝多個 deb,而且也可以直接看到腳本的運行狀況和安裝成功/失敗的提示信息,缺點是需要命令行軟體的支持,如 Putty/WinSCP的控制台/iSSH/MobileTerminal,很多人也不熟悉命令行下的操作。另外,安裝完後會不顯示圖標;
放置於 AutoInstall 目錄重啟安裝。該方法實際是 Cydia 提供的一個啟動腳本,在每次系統啟動時以 dpkg 命令安裝 AutoInstall 目錄下的 deb,好處是不需要命令行操作,缺點是必須要重啟,有些甚至要重啟兩次,也會出現不顯示圖標的情況;
利用 iFile 安裝,好處是圖形化操作,桌面會顯示圖標,缺點是不能一次安裝多個 deb;
用 Cyder II 等軟體來安裝,其原理是模擬一個 APT 軟體管理器來下載相應的 deb 文件並傳到設備,然後以前面幾種方式來安裝。
總體來說,deb 的安裝都是依賴於 dpkg -i 命令來安裝,只不過有些是在命令行下輸入命令,有些是提供了圖形界面。但除了 Cydia 安裝一種方式之外,其餘幾種安裝方式都存在一些 共有的問題:
不會自行搜索依賴關係,必須手動提供所依賴的 deb;
Cydia 會讀取安裝腳本里的一些特殊語句,比如僅在全新安裝時執行而不在升級時執行,安裝完成後重啟 SpringBoard 或設備等等。

卸載方法


Cydia 里卸載,優點是卸載過程和提示信息很詳細,全圖形界面操作,同時也提供了重新安裝的選項;
以 dpkg -r Package_ID 命令或 dpkg -P Package_ID 命令來卸載;
Cydelete 來卸載,優點是可以直接在桌面上卸載有圖標的軟體,但對那些沒有圖標的無能為力。
安裝過程 讀取資料庫並鎖定,避免同時有兩個安裝程序在運行
讀取 control 中的 Package(軟體包標識)和版本信息,並搜索資料庫,若已存在,則卸載之後再安裝;
檢查 Depends, Pre-Depends, Conflicts 和 Replaces,如果檢測到已存在 Conflicts 中存在的軟體,則報錯並終止安裝。如未找到 Pre-Depends 指定的軟體,則報錯並終止安裝。如找到 Replaces 中指定的軟體,則卸載之;
將數據寫入 /var/lib/dpkg/status 文件中;
執行 preinst 腳本(如果有);
解包 data.tar.gz,將文件放置於相應位置,並將文件列表寫入 /var/lib/dpkg/info/XXX.list;
運行 postinst 和 extrainst_ 腳本(如果有);
如果之前的安裝都沒有出錯,即安裝成功,那麼會在 status 文件中寫入 Status: install ok installed 信息,否則會寫入其它狀態數據,比如 Unpacked (未解包數據)、Failed-config(腳本未能成功執行)、Half-installed(安裝失敗等);
重新載入資料庫並解除鎖定。
卸載過程 讀取資料庫並鎖定;
根據軟體標識搜尋資料庫;
檢查是否有軟體依賴於待卸載的軟體,如果有則提示,並中斷卸載;
執行 prerm 腳本(如果有);
讀取 /var/lib/dpkg/info/XXX.list 文件,並刪除 list 文件中記錄的全部文件和非空文件夾;
運行 postrm 腳本;
如果卸載命令是 dpkg -r,則保留 status 中的記錄並改為 Status: Not installed;
如果卸載命令是 dpkg -P,則刪除全部數據;
如果卸載過程沒有錯誤的話,重新讀取資料庫並解除鎖定。
由於 deb 安裝的軟體可能會在運行時在 /var/mobile/Documents 下放置存檔文件,或在 /var/mobile/Library/Preferences 下放置設置文件,而這些文件並沒有記錄在 list 文件里,所以卸載的時候不會被刪除。

軟體包格式


MeeGo系統基於Linux架構,同樣採用deb格式軟體包。
N9識別以QT開發工具主導的deb文件;meego上網本識別以linux caneflip的rpm和qt的deb文件,但由於界面不同,N9的程序不能很好地適應在桌面系統上。