DEB 介紹
DEB是Debian軟體包格式的檔案擴展名,跟Debian的命名一樣,DEB也是因DebraMurdock而得名,她是Debian創始人IanMurdock的太太。
deb格式是Debian系統(包含Debian和Ubuntu)專屬安裝包格式,配合APT軟體管理系統,成為了當前在Linux下非常流行的一種安裝包。進入2.x時代之後有Cydia作者JayFreeman(saurik)移植到iPhone平台上,一起的還有APT軟體管理系統。
Debian包是Unixar的標準歸檔,將包檔案信息以及包內容,經過gzip和tar打包而成。處理這些包的經典程式是dpkg,經常是通過Debian的apt-get來運作。通過Alien工具,可以將deb包轉換成rpm、tar.gz格式。
deb包在Linux作業系統中類似於windows中的軟體包(exe),幾乎不需要什麼複雜的編譯即可通過滑鼠點擊安裝使用。
安裝包格式
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。
相對方便的線上購買模式:CydiaStore,不過儘管沒有App Store的5台設備的限制,但對國內用戶來說,付款方式比較困難。
破解難度較大,沒有使用AppStore的驗證方式,所以必須將驗證和防破解措施加入程式裡面,這樣就比較難破解,對軟體開發者來說是個好事。
完善的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-iXXX.deb的形式安裝,好處是可以以通配符一次性安裝多個deb,而且也可以直接看到腳本的運行狀況和安裝成功/失敗的提示信息,缺點是需要命令行軟體的支持,如Putty/WinSCP的控制台/iSSH/MobileTerminal,很多人也不熟悉命令行下的操作。另外,安裝完後會不顯示圖示;
放置於AutoInstall目錄重啟安裝。該方法實際是Cydia提供的一個啟動腳本,在每次系統啟動時以dpkg命令安裝AutoInstall目錄下的deb,好處是不需要命令行操作,缺點是必須要重啟,有些甚至要重啟兩次,也會出現不顯示圖示的情況;
利用iFile安裝,好處是圖形化操作,桌面會顯示圖示,缺點是不能一次安裝多個deb,用CyderII等軟體來安裝,其原理是模擬一個APT軟體管理器來下載相應的deb檔案並傳到設備,然後以前面幾種方式來安裝。
總體來說,deb的安裝都是依賴於dpkg-i命令來安裝,只不過有些是在命令行下輸入命令,有些是提供了圖形界面。但除了Cydia安裝一種方式之外,其餘幾種安裝方式都存在一些共有的問題:不會自行搜尋依賴關係,必須手動提供所依賴的deb;
Cydia會讀取安裝腳本里的一些特殊語句,比如僅在全新安裝時執行而不在升級時執行,安裝完成後重啟SpringBoard或設備等等。
安裝過程
讀取資料庫並鎖定,避免同時有兩個安裝程式在運行
讀取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:installokinstalled信息,否則會寫入其它狀態數據,比如Unpacked(未解包數據)、Failed-config(腳本未能成功執行)、Half-installed(安裝失敗等);
卸載方法
Cydia里卸載,優點是卸載過程和提示信息很詳細,全圖形界面操作,同時也提供了重新安裝的選項;
以dpkg-rPackage_ID命令或dpkg-PPackage_ID命令來卸載;
Cydelete來卸載,優點是可以直接在桌面上卸載有圖示的軟體,但對那些沒有圖示的無能為力。
卸載過程
讀取資料庫並鎖定;
根據軟體標識搜尋資料庫;
檢查是否有軟體依賴於待卸載的軟體,如果有則提示,並中斷卸載;
執行prerm腳本(如果有);
讀取/var/lib/dpkg/info/XXX.list檔案,並刪除list檔案中記錄的全部檔案和非空資料夾;
運行postrm腳本;
如果卸載命令是dpkg-r,則保留status中的記錄並改為Status:Notinstalled;
如果卸載命令是dpkg-P,則刪除全部數據;
如果卸載過程沒有錯誤的話,重新讀取資料庫並解除鎖定。
由於deb安裝的軟體可能會在運行時在/var/mobile/Documents下放置存檔檔案,或在/var/mobile/Library/Preferences下放置設定檔案,而這些檔案並沒有記錄在list檔案里,所以卸載的時候不會被刪除。