FreeBSD連載(28):Packages Collection

1999年11月30日 17:05 王波

Packages Collection

  FreeBSD中提供了上G字節大小的預編譯並打好包的二進制應用軟體包,這些軟體包能夠立即安裝使用。在軟 件包中不但記錄了二進制軟體的內容,還包括這些軟體的安裝位置、軟體包的描述信息,以及軟體包之間的依賴關系,這種管 理軟體的機制稱為Packages Collection。通常安裝介質提供的這些Packages位於安裝介質中的 packages目錄下,使用安裝程序sysinstall就能夠很容易的安裝和卸載這些安裝好的軟體包。(由於空間 的限制,安裝光碟上並不能包括所有的軟體包,可以從Internet上下載,在Walnet Creek發布的FreeBSD 光碟中的第三張也包括了大量預編譯好的軟體包)。

  在FreeBSD下,每個預編譯的軟體包是使用tar和gzip進行打包壓縮後的檔案,其檔案名中的前面為這 個Package的名字(包括版本號),並使用tgz後綴,例如navigator瀏覽器的Package檔案為netscape-navigator-4.07.tgz。。

  使用root權限執行sysinstall,然後選擇Configure選單項中的Packages選項,系 統將按不同的應用軟體的類別,顯示出相應的選單選項,每個選項對應一類應用軟體,其中All項中包括所有可用的應用軟 件。

  這些軟體也被放置到安裝介質中的packages目錄下對應的不同存儲子目錄中,子目錄和選單選項是一一對應的。

# ls -l /cdrom/packages

All converters kde print x11
INDEX databases lang security x11-fonts
Latest deskutils mail shells x11-toolkits
archivers devel math sysutils x11-wm
audio editors misc tcl81
benchmarks emulators net textproc
chinese gnome news tk81
comms graphics perl5 www

  如果進入了一個種類的子選單,那麼就可以看到,已經安裝的軟體有一個 “X” 標記,可使用空格鍵反選擇這個 已安裝的軟體,系統將立即卸載這個軟體。或者選擇一個未安裝軟體,然而此時並沒有立即進行這個軟體的安裝,而是要等到 全部選擇了所有想要安裝的軟體包之後,再回到上級選單,選擇 “Install” 按鈕才開始進行安裝。

  • Packages的相互依賴關系

  各個軟體包之間並不是孤立的,而是在相互之間存在一定的依賴關系。例如,所有的X Window應用軟體都在 X Window下運行,那麼如果沒有安裝X Window伺服器軟體,也不能正確安裝這些應用軟體。此外,Pack ages中也並不全是應用軟體,它也包括各種函數庫及其他種類的支持檔案,那麼有的應用軟體包就依賴於這些庫檔案和支 持檔案。

  由於存在各種相互依賴關系,必然對軟體包的安裝和卸載發生影響。當安裝一個軟體包時,FreeBSD將會首先 安裝這個軟體包依賴的其他軟體包,然後才能安裝這個軟體包本身。如果沒有安裝它所依賴的軟體包,則就不能正常安裝這個 軟體包本身。同時,當刪除一個軟體包時,必須預先刪除依賴這個軟體包的所有其他軟體包,否則就不能正常完成刪除任務。 FreeBSD對這個依賴關系限制比較嚴格,即使是同一個軟體,但版本不同,依賴於這個軟體另一個版本的其他軟體包也 不能正確安裝,必須保証版本的一致性。

  使用Packages Collection來安裝和管理應用軟體,可以維持軟體安裝檔案結構的一致性,因為 Packages Collection安裝的軟體其檔案目錄結構符合FreeBSD的習慣,清晰明了。此外軟體包之 間的依賴關系對於同時維護多種軟體也很有效,因此最好不要繞過Packages Collection手工安裝軟體。 當需要重新定制軟體的時候,可以通過Ports Collection來完成,它在編譯好軟體之後,可以使用軟體包的 方式安裝和維護軟體。

  每個軟體包的安裝信息被放置在/var/db/pkg目錄下維護,這個目錄下的每個子目錄都對應於一個安裝過 的軟體包,如果某個子目錄被破壞,那麼相應的軟體包的信息就不復存在了。

  • 管理Packages

  雖然使用sysinstall來管理軟體比較直觀,但是這需要一個標準的安裝介質,適合大量安裝軟體包時使用 。而在不使用安裝介質的時候,僅僅需要添加某個獨立的軟體包或進行維護時,sysinstall就不適合了。FreeBSD 提供了十分簡單的幾個管理命令來完成這個任務。

  pkg_add 安裝一個Package,其參數為要安裝Package的檔案名或獲得這個檔案的URL 。當使用URL來指定Package的位置時,pkg_add首先使用fetch程序下載該軟體包,然後進行安裝。 通常可以使用 “-v” 參數,使pkg_add顯示出進行的操作過程。

  pkg_delete 刪除一個軟體包,其參數為軟體包的名字,由於此時軟體包已經被安裝到系統中了 ,因此名字中不必使用tgz後綴。同樣也可以使用 “-v” 參數。

  pkg_info 獲取一個軟體包的安裝信息和簡短描述,參數為軟體包名字時,將參看目前已安裝的軟體 包中是否存在它,當使用的參數為帶tgz後綴的檔案名時,將查看目前目錄中是否存在這個軟體包檔案。或者可以使用 -a參數列出目前安裝的所有軟體包的信息:

# pkg_add netscape-communicator-4.5.tgz

# pkg_delete netscape-communicator-4.5

  但在實際應用的過程中,值得注意的問題常常發生在升級軟體包時。由於同一軟體的不同版本通常使用同樣的檔案名 ,因此在安裝一個版本時將覆蓋掉另一個版本的檔案,但是同時新版本的Packages並不會自動刪除老版本Packages 的安裝信息。因此如果再一次卸載舊版本時就會將新版本中具有同樣檔案名的檔案刪除掉。解決問題的方法是先卸載老 版本,再安裝版本的Packages。一旦出現問題,可以再次將新版本Packages重新安裝一次即可。