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的目錄下!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章