天天看點

FreeBSD軟體安裝(轉)

1、FreeBSD應用軟體管理的基本原理:

1、FreeBSD應用系統的組成

FreeBSD應用系統由FreeBSD作業系統和移植(ports)到FreeBSD的各種應用軟體組成

FreeBSD作業系統本身,是由核心和基本系統組成,基本系統由系統工具、系統庫和文檔組成,最小化安裝選項安裝的是核心、系統工具和系統庫,系統工具 提供了完整的系統管理和編譯程式程式。而文檔和代碼以及ports系統是可選安裝的。如果完整安裝了FreeBSD,簡單的說就是安裝了核心、系統管理工 具、系統庫、編譯程式、系統源代碼、ports以及man、info、FreeBSD handbook等文檔。

為了擴大FreeBSD的應用,FreeBSD移植(port)了大量的自由軟體、開源軟體。并建構了ports系統,把這些移植的軟體彙集到一起,從移 植應用程式本身來說,大都是基于源代碼進行修改和調整,以便建立的程式可以運作在FreeBSD系統環境下,是以ports中存放的都是代碼修改以及編譯 控制,以及FreeBSD的程式管理政策。

2、ports的組成

一個軟體的ports,大緻由以下幾個部分組成:

pkg-descr 應用軟體的簡單描述

pkg-plist 軟體安裝的檔案清單

distinfo 軟體源代碼的名稱,版本以及校驗資訊

Makefile 控制軟體編譯的makefile

files目錄 裡面包含對源代碼進行修改的各種更新檔

利用port進行軟體安裝非常簡單,這得益與ports系統的精心設計,大量繁瑣的操作都定義在 /usr/ports/mk 目錄下的檔案當中,諸如一些變量定義,編譯選項定義,檔案下載下傳位址定義,編譯工具定義,以及一些操作的定義等等。具體軟體的port中的Makefile 檔案,都會繼承系統提供的這些定義,而且可以根據需要進行調整。

具體軟體port的Makefile還提供了軟體運作依賴,建立依賴,以及對源代碼編譯過程中一些具體的定義。

3、利用ports進行軟體安裝的過程。

簡單來說,可以用下面的指令來完成安裝

具體的過程是:

根據distinfo檔案中的軟體源代碼檔案名,檢測 /usr/ports/distfiles 目錄下,是否有軟體的源代碼

如果沒有,調用 make fetch 從Makefile檔案中定義的下載下傳位址進行下載下傳

下載下傳完成以後,調用 make checksum ,利用 distinfo 檔案中的源代碼檔案的校驗資訊,校驗源代碼包的完整性。

如果校驗正确,調用 make extract,對源代碼進行解壓,具體的路徑是:

解壓源代碼後,調用 make patch ,搜尋 files 目錄下的更新檔檔案為源代碼打更新檔,

打完更新檔,根據 Makefile檔案中定義的軟體運作依賴關系,查找系統中是否安裝對應的軟體,如果沒有安裝,會轉入相應的軟體的ports中進行make install clean 。假設目前應用程式的所有運作依賴都已經安裝,ports系統會進入源代碼目錄,運作裡面的configure檔案,生成源代碼目錄下的makefile 檔案,然後進行源代碼的make過程,對源代碼進行編譯、連接配接。

當所有的make過程結束以後。運作ports系統的 make install進行安裝。

安裝完成以後,利用pkg-descr,pkg-plist的内容在 /var/db/pkg 目錄下對這個軟體進行注冊。标記這個軟體已經安裝,并詳細注冊了安裝檔案清單。

如果軟體注冊成功,ports系統利用make clean指令,清除軟體port目前目錄下work子目錄資訊。如果在編譯安裝過程中對有依賴關系的軟體進行過編譯安裝,會回溯清理過程。

4、FreeBSD提供的packages軟體包

packages,也可以稱作編譯封裝好的應用軟體的二進制包,是FreeBSD提供的基于ports系統建立的二進制軟體包,這個軟體包實際上是 FreeBSD利用硬體資源,利用 ports 系統的 make package 指令建立的。這些package存放在 ftp.freebsd.org 伺服器上,可以遠端直接下載下傳安裝,也可以下載下傳後進行安裝。

以freebsd 7.0 release為例,它的二進制軟體包網絡位址是:

ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-7.0-release/

在這個網絡目錄下,有兩個檔案夾要用到,一個是 All ,一個是 Latest,注意第一個字母都是大寫。

All目錄下的檔案,是利用ports建立的二進制軟體包,例如 mysql51-server-5.1.22.tbz,軟體包名稱來自它的ports名,版本号是ports根據軟體包源代碼版本進行的定義。

Latest目錄下的檔案,其實是All目錄下軟體二進制包的軟連接配接,并且省去了版本号,這個目錄是 FreeBSD系統網絡線上遠端安裝所要通路的目錄,對于 mysql51-server-5.1.22.tbz 的軟連接配接名是 mysql51-server.tbz。這樣在遠端安裝時就省去了輸入版本号的麻煩。

這兩個目錄的建立和維護也是由ports系統自動完成的,無需幹預。

代碼:

make install clean      

代碼:

軟體port目前路徑/work/源代碼檔案名去掉後面的.gz.bz2/      

二、軟體管理的一些細節:

FreeBSD作業系統可以使用ports管理應用軟體,也可以利用FreeBSD系統提供的系統管理工具,提供對packages(二進制軟體包)的管理維護。

1、軟體安裝

遠端軟體安裝: pkg_add -r 軟體包名稱 例如:pkg_add -r mysql51-server,pkg_add -r xorg,pkg_add -r kde

系統會自動在上面所說的ftp伺服器Latest目錄下查找 mysql51-server.tbz,xorg.tbz,kde.tbz,但有一點需要注意,FreeBSD的ftp伺服器并不保證ports上容納的 所有的移植過來的軟體都有二進制包,尤其是stable分支,有些是因為軟體ports本身有問題無法建立,也有一些軟體ports正在修訂,還有一些隻 允許源代碼包釋出,協定不允許進行打包。

本地軟體安裝: pkg_add 軟體封包件名 ,用這種方式安裝軟體包,需要從All目錄下載下傳,防止軟體安裝時搜尋特定版本的有依賴關系的軟體包。

一個建議: 利用pkg_add -r -K 這個指令,它的作用是,遠端下載下傳,安裝,并且把下載下傳的二進制包儲存在 PKGDIR 定義的目錄上。PKGDIR 預設的定義是 /usr/ports/packages/

使用ports安裝軟體的優勢

利用ports進行軟體安裝,如第一部分所說,是利用make install 完成應用軟體的安裝。

利用ports進行軟體安裝與package安裝相比,最大的優勢是軟體可定制,表現在在編譯源代碼時,通過選項定義來完成應用軟體特定支援和子產品建立的 特定需求。最常用的選項定義方法是在具體的ports目錄下運作 make config。make config會顯示出一個類似sysinstall風格的對話框,在裡面可以顯示和操作可選擇的編譯控制選項。(注意:有的port沒有選項定義,運作 make config會顯示“無選項”)。

這些ports的配置選項定義儲存在/var目錄下,可以使用 make showconfig 檢視先前設定的配置選項定義。

如果需要對編譯器的參數進行調整,可以采取兩種方式,一個是在make 時定義特定的參數,如果需要全局改變,可以在make.conf中進行定義。無需改變ports系統本身!

2、已安裝軟體資訊查詢

很多時候,使用者可能需要知道某個軟體都安裝了哪些檔案,有時也需要查詢具體的某個程式,某個庫屬于哪個軟體。這些都可以使用pkg_info這個系統工具來完成。

資料基礎是ports或package安裝時在 /var/db/pkg 目錄下建立的“資料庫”(确切的說,我不知道如何稱呼它),裡面記錄着軟體名稱,版本号,依賴關系,檔案清單等等資訊。是FreeBSD的軟體管理資料中心。

兩個應用:

pkg_info -L 軟體全稱(軟體名和版本号,都可以在/var/db/pkg中找到),這個指令會列出這個軟體在系統上的完整的檔案清單。

pkg_info -W 檔案名,檔案名是目前路徑,如果不是要指定絕對路徑,這個指令傳回的是目前指定的檔案屬于哪個應用軟體。

3、軟體的解除安裝

FreeBSD系統已安裝軟體的解除安裝,對windows使用者來說,是個令人費解的事情。FreeBSD ports中的軟體,大都來源與開源和自由軟體社群,出于unix開發哲學中非常重要的一點——“輪子不該被制造兩次”,是以每個程式都會大量的依賴其他 工具或者庫的支援,這種事實存在的網狀的依賴關系,造就了類unix系統軟體管理上一個大麻煩,特别是軟體解除安裝。具體表現有兩個:

a、完全解除安裝某個軟體和它有依賴關系的軟體、庫不現實,也不能這樣去做。這對熱衷windows系統中造就的系統清理概念,以及有軟體潔癖的人是無法忍受 的。但這也正是Unix哲學的一個具體展現,一個軟體,一個庫甚至一些頭檔案,都可以因為互相的依賴關系成為應用特定的一環。

b、很多時候,當你強制解除安裝了某個子產品時,也會因為交錯複雜的依賴關系造成其他軟體受到影響,系統不會提示你缺什麼軟體庫,而是告訴你缺少了哪個檔案。這 樣就會使對軟體子產品不太了解的使用者很迷惑,一個相反的疑惑是我就安裝了一個程式,可實際看到的是安裝了好多,而解除安裝時卻無法全部清除,這用windows 的慣性思維來想,也有些讓人無法接受。

依賴對所有類unix系統來說,都是個問題。如果悉數依賴關系的種類,諸如建立依賴,運作依賴,庫依賴等等,這更是一碗意大利面條。

FreeBSD的政策是從ports上就引入“依賴關系”的管理。具體也表現在packages上,都有特定的細節對依賴進行管理。

當你安裝軟體的時候,它會自動檢查依賴,當它解除安裝軟體的時候,會提供這個軟體的依賴關系,讓使用者進行取舍。FreeBSD甚至提供了這樣的一條指令。 pkg_delete -a ,解除安裝系統所有的應用軟體,隻保留FreeBSD基本系統和使用者的配置檔案。當然,如果某個程式完全不依賴其他子產品或者從不為其他子產品所依 賴,pkg_delete 會很利索的删除這個軟體。因為它有登記軟體安裝時檔案的詳細清單。

說了這麼多,其實隻是一句話,使用FreeBSD的軟體,對這些軟體進行管理,就要抛卻一些windows上的使用習慣,轉而尊重FreeBSD以及所有 類unix的哲學和曆史繼承。更甚一點的說,在windows上,也是有依賴關系的,想完全删除所有依賴,可能會死的更慘。例如某某某系統檔案。

FreeBSD的ports機制和package工具都提供了軟體解除安裝功能

ports可以使用 make deinstall 進行反安裝,packages使用pkg_delete進行解除安裝

需要注意一點的是,利用ports反安裝,要注意ports軟體和對應系統安裝軟體的版本号問題,ports的更新可能會帶來很多問題,是以不推薦ports的反安裝機制。建議使用 pkg_delete

pkg_delete 系統安裝的軟體登記名,這個删除會檢查依賴,如果有依賴上的盤根錯節,會進行提示!這些提示對進一步删除軟體是不錯的依據。

pkg_delete -f 系統安裝的軟體登記名, 這是強制删除,系統會删除指定子產品的檔案,但所有的依賴都不會進行操作,運作結束後會回報可能出現的問題

pkg_delete -a 應用軟體解除安裝的終極武器,猶如電影《西遊記》中至尊寶的一句台詞,”一刀斬下,哇,整個世界清淨了“。。。。

4、進一步說“依賴”及軟體打包

(depend)依賴,與windows下某個軟體需要”運作庫“支援比較類似。在FreeBSD和其他類unix系統中,“依賴”相比windows系 統要更複雜一些。使用過ports編譯安裝軟體的人都有這樣的經曆,在實施編譯一個軟體包之前,系統都會進行一些檢查,如果檢測到缺少的元件,會嵌套的先 編譯那些軟體包。這其中就是“依賴”在起作用。

在FreeBSD中,一個軟體包的依賴主要有兩個

a、建立依賴:建立依賴指的是,這個軟體包在編譯時要用到的軟體包清單,也就是軟體包編譯時需要的那些支援元件。例如編譯kde,需要Qt的建立依賴,諸如此類!

b、運作依賴:一個軟體包的運作依賴指的是軟體包正常工作必須的軟體環境,在FreeBSD上,就是一些軟體包的集合。

FreeBSD的ports系統,把一個軟體包的每個依賴都抽象成為一個具體的ports,例如編譯Xorg需要的imake,kde需要的Qt,這些依 賴大多數定義在這個軟體包的port上的Makefile檔案當中,一個成熟、穩定的軟體包port,它的所有依賴都已經由port的維護者定義好了。借 助于龐大的port組成的ports系統。一個FreeBSD使用者在用ports編譯某個軟體時,無需為它的那些依賴操心費神。隻要網絡是通 的,ports系統可以全部搞定。

但這種省心,是建立在ports系統一緻性基礎上的,如果單獨更新了某個port,而依賴沒有更新到一緻的版本,錯誤會千奇百怪。而且有一點需要注意,就 是ports系統是不斷變化更新的,變化過程中有可能會出現各種各樣的問題。解決這些問題最直接的方法是更新ports到最新版。間接一些的方法,可以給 ports維護者發郵件,抱怨一下自己遇到的錯誤,如果你遇到問題并且自己解決了,可以把解決辦法送出到FreeBSD的ports維護者那 裡,FreeBSD鼓勵這樣做!

ports系統中常用到的檢視依賴關系的方法:

進入到某個你需要檢視依賴關系的port,例如 /usr/ports/devel/qt4

代碼:

make build-depends-list               #列出目前port的建立依賴



    make run-depends-list                  #列出目前port的運作依賴



    make all-depends-list                    #列出目前ports的所有依賴      

package如何解決“依賴關系”:

上面提到過,package是利用ports生成的,為了解決packages方式安裝的“依賴”問題,FreeBSD在.tbz的封包機制上,加入了“ 依賴”的軟體包清單。觀察一個.tbz軟體包的組成可以很容易發現,在.tbz軟體包内有“+CONTENTS”檔案,這個檔案的内容就是 這個軟體的依賴的定義,還有諸如一些安裝時校驗軟體包的校驗資訊,以及一些其他資訊!當使用者使用pkg_add 安裝package時,系統會根據這個檔案的内容首先對依賴進行檢測和安裝,當所有依賴安裝就緒之後,才安裝目前軟體!這是一個基本保證,但這些都可以靈 活定制。

FreeBSD本身提供了打包工具,pkg_create,ports中的package也是利用了這個工具程式。相比較來說,使用ports打包不需記住相當多的參數,是以相對容易。

利用ports系統進行打包的方法:

進入到需要打包軟體的port

代碼:

make package                           #單個軟體打包



    make package-recursive           #打包目前目錄的軟體,并且打包與這個軟體有依賴關系的軟體包



    make package-depends-list      # 檢視與目前軟體包有依賴關系的package清單



    actual-package-depends           # 檢視與目前包有依賴關系的package清單,與上面的指令不同的是,它的包清單是基于已經安裝的      

注意: 用上面指令進行打包 時,推薦建立 /usr/ports/packages 目錄,ports系統在打包時會檢測這個目錄是否存在,如果存在,ports系統會在這個目錄下建立 All、Latest以及ports各個分類目錄,All目錄下是實體檔案,其他目錄的檔案都是連接配接到All目錄下的檔案。檔案樹結構和 ftp.freebsd.org伺服器上的packages目錄的組成是一樣的。 如果ports系統沒有檢測到 /usr/ports/packages 這個目錄,所建立的package包隻能儲存在相應port的目錄下!

上一篇: FreeBSD安裝

繼續閱讀