FreeBSD:善加利用與管理你的ports / packages- -

发表于:2007-06-09来源:作者:点击数: 标签:
FreeBSD:善加利用與管理你的ports/packages-- Unix系統的傳統安裝thirdparty(第三方代理)軟體方法是下載sourcecode(原始碼) 或是binary(二進制執行檔)型式,經過解壓、編譯、除錯,最後安裝。然而在FreeBSD 上,不僅可使用傳統的安裝方式,更提供了兩種不同

FreeBSD:善加利用與管理你的ports / packages- -
                                       



Unix系統的傳統安裝third party(第三方代理)軟體方法是下載source code(原始碼)
或是binary(二進制執行檔)型式,經過解壓、編譯、除錯,最後安裝。然而在FreeBSD
上,不僅可使用傳統的安裝方式,更提供了兩種不同的技術,Ports與Packages。


Ports
在Unix下的程式,可以使用很多不同的程式語言撰寫,而有些程式語言本身雖有很好的
可攜性,但在不同的Unix系統下編譯,還是可能會有問題存在。通常視不同的執行環境
來對程式做適當的修改,使程式可以於其他平台上正常執行,其中的過程稱為移植,通
稱為port。

○ port目錄結構
ports目錄結構一般包含Makefile、distinfo、pkg-comment、pkg-descr、pkg-plist檔
案和files目錄。

Makefile:敘述port如何下載、安裝以及與其他程式的相依性。
Distinfo:敘述那些port將要下載以及正確性的MD5檢查參考。
pkg-comment:port的簡單描述。
pkg-descr:port的詳細描述。
pkg-plist:port安裝後相關檔案的路徑。
files:此目錄包含一些patches,使程式能夠編譯安裝在FreeBSD系統上。

Packages
Packages是把ports的binary、相關檔案及說明,整理壓縮成一個名為.tgz的檔案。由於
不需要額外的編譯,所以對特別大的程式(如:Xfree86)而言,不僅可以減少安裝時間,
甚至減少安裝過程中的錯誤。

● 如何使用Ports
在使用Ports之前,FreeBSD系統必須安裝ports套件。如果你的系統尚未安裝,可以使用
root執行/stand/sysinstall來安裝。安裝好ports套件後,會發現在/usr下多了ports的子
目錄。

○ 安裝ports - step by step
在開始安裝ports之前,必須瞭解安裝的全部過程:
通常使用ports安裝應用程式,只須執行到install,最後是否要執行package則是依各人需
求來決定,最後我會對此再加以敘述。

接下來以安裝lynx的範例來說明step by step的ports安裝方式:
注意:
1) 必須使用有權限的使用者(如:root)來安裝程式。
2) 確定所在目錄位置於ports的Makefile檔案處。在本範例中,現在的目錄位置在於
/usr/ports/www/lynx。

Step 1:fetch
功能:取回程式的source檔案。
說明:這個步驟會檢查/usr/ports/distfiles(由DISTDIR變數設定)目錄下是否已存在符合
Makefile中描述的source及其他相關檔案;若沒有,則會依照指定的順序(註一)將source及
相關檔案取回。

範例:
root@ant [/usr/ports/www/lynx]# make fetch
>> lynx2.8.4rel.1.tar.bz2 doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/.
Receiving lynx2.8.4rel.1.tar.bz2 (1940531 bytes): 100%
1940531 bytes transferred in 168.0 seconds (11.28 kBps)
>> lynx2.8.4rel.1a.patch.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/.
Receiving lynx2.8.4rel.1a.patch.gz (3065 bytes): 100%
3065 bytes transferred in 0.0 seconds (175.36 kBps)
>> lynx2.8.4rel.1b.patch.gz doesn't seem to exist in /usr/ports/distfiles/.
>> Attempting to fetch from ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/.
Receiving lynx2.8.4rel.1b.patch.gz (3475 bytes): 100%
3475 bytes transferred in 0.0 seconds (240.71 kBps)

過程中顯示在/usr/ports/distfiles目錄中找不到符合版本的source及相關檔案,於是開始依
序比對指定的站點取回。成功執行後,可於/usr/ports/distfiles目錄下發現source及相關檔
案已經取回。

fetch
extract
patch
configure
build
install
package
checksum

root@ant [/usr/ports/distfiles]# ls
lynx2.8.4rel.1.tar.bz2 lynx2.8.4rel.1a.patch.gz lynx2.8.4rel.1b.patch.gz

Step 2:checksum
功能:檢查檔案正確性。
說明:使用MD5檢查取回的相關檔案是否正確。

範例:
root@ant [/usr/ports/www/lynx]# make checksum
>> Checksum OK for lynx2.8.4rel.1.tar.bz2.
>> Checksum OK for lynx2.8.4rel.1a.patch.gz.
>> Checksum OK for lynx2.8.4rel.1b.patch.gz.

Step 3:extract
功能:解壓縮檔案。
說明:在/usr/ports/distfiles中將尋找被取回的source檔案解壓縮。

範例:
root@ant [/usr/ports/www/lynx]# make extract
===> Extracting for lynx-2.8.4.1b_1
>> Checksum OK for lynx2.8.4rel.1.tar.bz2.
>> Checksum OK for lynx2.8.4rel.1a.patch.gz.
>> Checksum OK for lynx2.8.4rel.1b.patch.gz.
成功執行完後,會發現多了一個work子目錄,並且在該目錄下產生lynx2-8-4子目錄以及
.extract_done.lynx-2.8.4.1b_1檔案。lynx2-8-4子目錄則是source檔案解壓縮後的內容。

root@ant [/usr/ports/www/lynx]# ls
Makefile files/ pkg-descr work/
distinfo pkg-comment pkg-plist
root@ant [/usr/ports/www/lynx/work]# ls
.extract_done.lynx-2.8.4.1b_1 lynx2-8-4/

Step 4:patch
功能:修正檔案。
說明:為使編譯工作更順利,會對解壓縮後的檔案做修正。將Makefile中定義的PATCHFILES會
被patch,如果在files(由PATCHDIR變數定義)目錄中存在

patch-*,也會被按照名稱順序先後執行。

範例:
root@ant [/usr/ports/www/lynx]# make patch
===> Patching for lynx-2.8.4.1b_1
===> Applying distribution patches for lynx-2.8.4.1b_1
===> Applying FreeBSD patches for lynx-2.8.4.1b_1
成功執行完後,會產生.patch_done.lynx-2.8.4.1b_1檔於work子目錄下。
root@ant [/usr/ports/www/lynx/work]# ls
.extract_done.lynx-2.8.4.1b_1 lynx2-8-4/
.patch_done.lynx-2.8.4.1b_1

Step 5:configure
功能:建立適當的Makefile。
說明:首先要釐清的觀點是ports的Makefile及應用程式編譯的Makefile是不同的。configure產生
的Makefile是屬於應用程式編譯的Makefile,敘述如何編譯應用程式。如果存在scripts/configure
,則這個configure會首先被執行;如果Makefile中定義了HAS_CONFIGURE或GNU_CONFIGURE,則
WRKSRC/configure會被執行。

範例:
root@ant [/usr/ports/www/lynx]# make configure
===> Configuring for lynx-2.8.4.1b_1
[以下略]
成功執行完後,會於work子目錄下產生.configure_done.lynx-2.8.4.1b_1檔案,並且在
work/lynx2-8-4子目錄下產生適當的應用程式編譯的Makefile。

root@ant [/usr/ports/www/lynx/work]# ls
.configure_done.lynx-2.8.4.1b_1 .patch_done.lynx-2.8.4.1b_1
.extract_done.lynx-2.8.4.1b_1 lynx2-8-4/

Step 6:build
功能:編譯程式碼。
說明:依照應用程式的Makefile開始編譯程式碼。會進入work(由WRKSRC變數定義)目錄中編譯,如果
Makefile中定義了USE_GMAKE,GNU make會被使用,否則使用make命令。

範例:
root@ant [/usr/ports/www/lynx]# make build
===> Building for lynx-2.8.4.1b_1
[略]
cc -DHAVE_CONFIG_H -DLOCALEDIR=\"/usr/local/share/locale\" -I. -I.. -Ichrtrans -I./chrtrans 
-I.. -I../src -I../WWW/Library/Implementation -O –pipe -s -c ./LYLocal.c
[略]
Copying Lynx executable into top-level directory
rm -f ../lynx
cp lynx ../
Welcome to Lynx!

成功執行完後,會於work子目錄下產生.build_done.lynx-2.8.4.1b_1檔案,並且在lynx2-8-4子目錄
下會產生編譯過後的檔案。

root@ant [/usr/ports/www/lynx/work]# ls
.build_done.lynx-2.8.4.1b_1 .patch_done.lynx-2.8.4.1b_1
.configure_done.lynx-2.8.4.1b_1 lynx2-8-4/
.extract_done.lynx-2.8.4.1b_1

Step 7:install
功能:安裝程式。
說明:將編譯好的執行檔、設定檔及說明檔等安裝到系統目錄中。
範例:
root@ant [/usr/ports/www/lynx]# make install
===> Installing for lynx-2.8.4.1b_1
[略]
===> Compressing manual pages for lynx-2.8.4.1b_1
===> Registering installation for lynx-2.8.4.1b_1
於work子目錄下產生.PLIST.* 及.install_done.lynx-2.8.4.1b_1檔案。
root@ant [/usr/ports/www/lynx/work]# ls
.PLIST.mktmp .extract_done.lynx-2.8.4.1b_1
.PLIST.setuid .install_done.lynx-2.8.4.1b_1
.PLIST.startup .patch_done.lynx-2.8.4.1b_1
.build_done.lynx-2.8.4.1b_1 lynx2-8-4/
.configure_done.lynx-2.8.4.1b_1

一般安裝potrts只須執行至此步驟即可,表示應用程式已成功的安裝,若須要將此程式製做成
package,則再另行執行step 7。

Step 8:package
功能:製做成package。
說明:將最後安裝成功的相關設定檔製做成package 。這個步驟不一定要執行,若有需要製做成
package檔,供往後使用,則執行此步驟。

範例:
root@ant [/usr/ports/www/lynx]# make package
===> Building package for lynx-2.8.4.1b_1
Creating package /usr/ports/packages/All/lynx-2.8.4.1b_1.tgz
Registering depends:.
Creating gzip'd tar ball in '/usr/ports/packages/All/lynx-2.8.4.1b_1.tgz'

將package置於/usr/ports/packages下的相關目錄,這個目錄是package存放預設值。一般在安裝
ports套件後,不會在/usr/ports目錄下產生packages子目錄,當make package找不到此目錄時,
會將package置於此程式目錄下(本例子而言是/usr/ports/www/lynx之下)。建議若要方便管理
package的話,可先行於/usr/ports下建立packages的子目錄。

○ 安裝ports – 快速法則
以上的步驟是使用step by step的安裝方式,是否可以直接執行至某一步驟呢?答案是可以的。
雖然每個步驟之間有其先後關係,但指定執行某一步驟時,會先由第一步驟開始檢查是否已完成
,若未完成則會由該步驟開始執行,若沒有例外錯誤發生,會一直執行至指定步驟結束為止。

例如:
執行make install時,會先檢查是否已執行make fetch,若發現make fetch尚未執行,則由fetch
開始;反之則檢查下一步驟make extract,若發現make extract尚未執行,則由extract開始;反
之則繼續檢查下一步驟make patch,一直以此方式進行。在執行過程中,若沒有錯誤發生,則會
一直執行至make install完成為止。

root@ant [/usr/ports/www/lynx]# make install
===> Extracting for lynx-2.8.4.1b_1
>> Checksum OK for lynx2.8.4rel.1.tar.bz2.
>> Checksum OK for lynx2.8.4rel.1a.patch.gz.
>> Checksum OK for lynx2.8.4rel.1b.patch.gz.
===> Patching for lynx-2.8.4.1b_1
===> Applying distribution patches for lynx-2.8.4.1b_1
===> Applying FreeBSD patches for lynx-2.8.4.1b_1
===> Configuring for lynx-2.8.4.1b_1
creating cache ./config.cache
[略]
===> Building for lynx-2.8.4.1b_1
[略]
===> Installing for lynx-2.8.4.1b_1
[略]
===> Compressing manual pages for lynx-2.8.4.1b_1
===> Registering installation for lynx-2.8.4.1b_1

ports不僅只有如何安裝,還有許多可善加利用與管理的方式:
以下僅列出部份內容,詳細可參考/usr/ports/Mk/ bsd.port.mk。

○ 清除安裝ports過程的暫存檔
類似於make install及make package,可依自己的需求來執行。

  make clean
功能:清除安裝過程所產生的檔案。
說明:在程式編譯完成後,並不會自動將過程中產生的檔案清除,執行後可清除這些編譯所產生
的檔案,不致造成浪費硬碟空間。

  make distclean
功能:清除安裝過程所產生的檔案,並且將取回的source檔案刪除。
說明:會先執行make clean,接著把/usr/ports/distfiles目錄下make fetch所取回source檔案
刪除。

○ 移除安裝的ports
  make deinstall
  
功能:移除程式。
clean
distclean

說明:把安裝好的應用程式由系統中移除。
  make deinstall-depends
功能:移除程式及其相關程式。
說明:不僅移除此程式,並且把其相關的程式一併移除。

○ 搜尋ports
注意:必須確定所在目錄於/usr/ports目錄下,或其子目錄下。
  make search key=what_you_want
功能:尋找符合此pattern敘述的所有ports相關列表。
說明:以所在目錄為主,向下搜尋並列出符合此pattern的ports的所有相關內容。

  make search name=what_you_want
功能:搜尋完全符合ports名稱的列表。
說明:以所在目錄為主,向下搜尋並列出符合的ports名稱。

● 如何使用packages
packages有很多方便的管理工具,全部位於/usr/sbin目錄下,在安裝前必須指定packages以及
其相關的packages。。筆者僅介紹一些常用的packages工具。以下範例將以lynx-2.8.5d7_1.tgz 
這個packages來說明,並且由本機執行,請先下載lynx-2.8.5d7_1.tgz 以及其他相關packages 
(lynx的相關packages為libiconv-1.7_3及gettext-0.11.1_1 )。

  pkg_add
功能:安裝packages。

範例:
root# pkg_add libiconv-1.7_3.tgz
root# pkg_add gettext-0.11.1_1.tgz
root# pkg_add lynx-2.8.5d7_1.tgz
必須依照packages相依的關係先後安裝。

  pkg_iofo
功能:顯示packages的資訊。

範例:
root# pkg_info lynx-2.8.5d7_1.tgz
Information for lynx-2.8.5d7_1.tgz:
Comment:
A non-graphical, text-based World-Wide Web client
Description:
lynx is a program which allows a user to access World-Wide Web servers
and other information servers. It uses only ascii representation so
that it can be used from ascii-terminals and dialin-lines.
WWW: http://lynx.isc.org/current/

  pkg_delete
功能:移除已安裝的packages。

範例:
root# pkg_delete lynx-2.8.5d7_1
注意,pkg_delete所指定的packages不需要加上.tgz。
在成千上萬個應用程式中,如何善加利用與管理將會是一門學問。在本篇文章中,希望可以增加
讀者對FreeBSD管理應用程式的瞭解,進而對FreeBSD系統有不一樣的體會。

<註一>:預設下,FreeBSD系統中有三個檔案可以指定ports從何處下載,優先順序第一的是
/etc/defaults/make.conf,接著是/etc/make.conf,最後是ports的Makefile中的敘述。

參考文件
FreeBSD Handbook
Ports Handbook
Ports簡介與安裝- 邱建雄

勘誤
2002-07-04 v1.0 release
2002-07-26 v1.1 errors-fixs
2002-07-29 v1.2 insert step2-checksum
編者
元智大學資訊管理學系曾義峰( s882617@mail.yzu.edu.tw )

 剑心通明 回复于:2005-08-30 10:23:47
讲的挺好的,收藏

 linuxbao3 回复于:2005-08-30 16:55:45
不错,都说全了。不过这是02年的了,不知道还能不能用了。先收了,谢谢了

 像把刀子 回复于:2005-08-30 20:49:24
一直想看看这个东西的  藏了先

 tsuowl 回复于:2005-08-30 23:11:00
挺好。就是罗唆了一点。

 剑心通明 回复于:2005-08-31 09:08:02
对于新手来说,还是很好的东西

 zero-B 回复于:2005-09-01 00:32:40
呵呵,可能新手更关心怎么都能安装软件呢!

好文。

原文转自:http://www.ltesting.net