新浪網

  新浪首頁 > 科技時代 > FreeBSD使用大全連載 > FreeBSD連載(55):Ports Collection
 


FreeBSD連載(55):Ports Collection

http://www.sina.com.cn 1999年12月27日 16:23 王波

第6章 定制應用軟件與系統內核

  為了充分發揮系統的性能,便需要對系統進行各種維護和配置工作。前面進 行的管理和維護還是基于最初安裝的FreeBSD系統,以及FreeBSD安裝介質中提供的二 進制軟件包。這樣的系統適用于大多數情況,但不是最適合特定要求的系統設置。根 據系統的具體情況來定制FreeBSD的各種設置,就需要進一步的工作。主要是由于 FreeBSD是一個自由軟件系統,它提供了軟件的源代碼可以供用戶定制,可以來適應 系統的具體環境。如果不能充分利用這些FreeBSD提供的源代碼,就不能真正發揮 FreeBSD的最大能力。

  FreeBSD系統提供的源代碼包括三個部分,內核源代碼、應用程序源代碼和軟 件Ports的源代碼。其中內核源代碼用于定制內核、提高系統性能、維護硬件配置以及 更新系統軟件,根據需要升級硬件和保持系統不斷升級以避免系統安全等方面的漏洞 等任務,因此最為重要,一個系統在初始安裝之后都需要重新編譯內核﹔應用程序源 代碼包括安裝到/bin、/sbin、/usr/bin、/usr/sbin目錄中的各個應用程序的源代碼 ﹔軟件Ports的源代碼并不是各個軟件的源代碼,而是各個軟件的編譯、安裝方法的代 碼,這可以用來安裝和管理各種應用程序。

  這些源代碼均包括在FreeBSD的安裝介質中,并能通過安裝程序進行安裝。除 了在初始安裝時安裝這些組件之外,系統正常運行時也能通過sysinstall或手工運行 相關目錄下的安裝腳本install.sh來添加他們。

  • 編譯應用軟件

  在Internet上有很多軟件包,它們遵循GPL、BSD或相似的版權許可,允許用戶 編譯運行這些軟件。正常情況下,安裝一個應用軟件的過程是:

  • 獲得源代碼文件,這通常是一個使用tar打包,并使用compress或gzip壓縮后 的文件。一般通過ftp等網絡下載工具從Internet上得到。
  • 將文件解開,得到源代碼文件,一般需要使用tar和gzip進行解包處理。
  • 根據系統情況進行配置,通常這些軟件提供了自動配置程序,能根據系統環境 自動進行配置,或者可以手工更改設置文件。
  • 然后就進行編譯,創建可執行的程序。
  • 接下來就需要將應用程序安裝到系統的指定位置。
  • 最后一步是配置應用程序的參數,使其能很好的執行。

  雖然軟件的作者通常已經將源代碼編寫相當完善,適合在多個平台上編譯, 但是將源代碼編譯成最終可執行的文件,仍然是一個花費時間且需要繁瑣操作的過程 。尤其是當用戶對系統不是很了解的情況下,往往就可能在某一步遇到了問題,結果 就會導致整個安裝過程不能正常完成。

  因此FreeBSD提供了Ports Collection機制來管理、安裝軟件。每種要被移植 到FreeBSD上軟件被稱為一個Port,由某個FreeBSD的開發者維護。這個Port的維護者 首先將軟件移植到FreeBSD上,并將他所完成的這些移植工作按照Ports Collection 的要求進行設置,編寫相關的腳本,使下載軟件、配置、編譯、安裝的全過程能夠自 動完成,不需人工干預。每個Port中并沒有保存軟件包的源代碼或者二進制代碼,而 只是提供了搜索它的源代碼或者二進制軟件包的方法。有了Ports Collection,編譯 、安裝應用程序的過程就相當容易了。

  Ports Collection和Packages Collection是緊密相關的,大部分Port都會有 對應的二進制軟件包,除非這個軟件的許可權對以二進制格式分發有所限制。通常每 個源代碼形式的Port使用tar.gz結尾,而相應的軟件包使用.tgz結尾。因此可以使用 后綴來區分Port和軟件包。可以從Port中直接生成對應的二進制軟件包。

  • Ports Collection

  對于一般的使用者,有了FreeBSD提供的眾多預編譯好的軟件包,就可以直接 安裝這些應用軟件的二進制版本,而不需要使用Ports Collection重新編譯軟件。然 而安裝介質上附帶的軟件包是按照缺省配置生成的,適合大多數用戶的需要,但并不 一定最適合特定用戶的特定需求。如果需要對某個軟件進行定制安裝,就需要使用 Ports Collection,進行修改后重新編譯安裝。

  在啟動這個軟件的安裝與管理機制之前,必須安裝 ── Ports Collection的 源代碼ports.tgz,它在安裝介質中提供,系統的初始安裝過程中,安裝程序將提示使 用者安裝Ports Collection,系統安裝之后也能直接從安裝介質上重新安裝或更新。

  Ports Collection的源代碼被安裝到/usr/ports目錄中,這個目錄稱為Ports 樹,以樹狀結構保存了各個應用程序的Ports。與Packages Collection的目錄結構相 同,Ports中也按類別進行相關分類,/usr/ports下的每個子目錄都包含某一類軟件, 在下一級的每個子目錄下就放置各個Port。

$ cd /usr/ports
$ ls
CVS             archivers       devel           math            textproc
INDEX           astro           distfiles       mbone           vietnamese
LEGAL           audio           editors         misc            www
Makefile        benchmarks      emulators       net             x11
Mk              biology         games           news            x11-clocks
README          cad             german          palm            x11-fm
README.html     chinese         graphics        print           x11-fonts
Templates       comms           japanese        russian         x11-toolkits
Tools           converters      korean          security        x11-wm
WWW_SITE        databases       lang            shells
YEAR2000        deskutils       mail            sysutils

  因為每個Port的代碼位于自己的目錄中,如果僅僅只想安裝某個軟件包的port, 在解壓縮中只解某個具體的軟件就可以了。

# tar zxvf /cdrom/prts/ports.tgz ports/www/netscape4.07

  由于Ports Collection是隨著應用程序的發展而常常更新的,當某個軟件升級造 成軟件的源代碼文件的名字或位置改變,因此部分Port中有關下載軟件源代碼的位置的設 置,就很可能不再適用,從而造成某些Ports不能正常編譯安裝。因此當應用軟件更新之 后,就需要從ftp.freebsd.org更新對應這個Port的源代碼。可以下載某個Port的代碼并 放置到正確的位置上,就能完成該port的更新,而不必更新整個Ports Collection。或 者使用cvsup來同步源代碼,更新Ports Collection。

  由于Ports Collection中收集的軟件相當多,因此要想了解每個軟件的用途并找 出有用的軟件就有些困難。如果一個一個去看軟件的文檔,需要花費大量的時間。因此 FreeBSD提供了一些簡單的索引和搜索能力。下面操作將產生所有port信息的索引文件。

# cd /usr/ports
# make print-index > index.txt

  例如要搜尋pine相關的port信息,可使用:

# cd /usr/ports
# make search key=pine

  也可以產生所有Ports的描述文件,在/usr/ports目錄下產生一系列HTML超文本文件, 然后通過netscape或lynx等瀏覽器查看各個軟件的描述內容。

# cd /usr/ports
# make readmes

  Ports Collection與系統版本息息相關,因此如果要使用新版本系統的Ports Collection ,不但要升級Ports,而且要升級系統中的有關程序。FreeBSD提供了一些Packages來提供在 不升級系統的情況下支持高版本的Ports Collection。例如從3.1Release升級到3.1stable就 存在一個升級Package為:31Upgrade.tgz,可以查看http://www.freebsd.org/ports中的信 息,來查看在現有系統版本下如何支持最新的Ports。

  • 使用Ports Collection來編譯安裝軟件

  每個Port單獨占據一個子目錄,在這個目錄中就是Port的代碼,包括使用make編譯、 安裝這個軟件所必須的Makefile文件,軟件的描述文件README.html、用于版本維護的CVS目 錄、保存軟件包安裝信息的files目錄,以及保存軟件源代碼的補丁文件的pkg目錄等。

$ ls -al /usr/ports/security/ssh
total 13
drwxr-xr-x   7 root  wheel   512 Apr 19 01:18 .
drwxr-xr-x  53 root  wheel  1024 Apr 19 01:18 ..
drwxr-xr-x   2 root  wheel   512 Apr 14 16:36 CVS
-rw-r--r--   1 root  wheel  4974 Apr 19 01:18 Makefile
-rw-r--r--   1 root  wheel   715 Feb 15 17:06 README.html
drwxr-xr-x   3 root  wheel   512 Apr 14 16:36 files
drwxr-xr-x   3 root  wheel   512 Apr 19 01:18 patches
drwxr-xr-x   3 root  wheel   512 Apr 19 01:18 pkg

  由于Ports Collection就是用來簡化應用軟件的安裝過程的,因此安裝起來非常簡單, 例如要安裝一個播放mp3的軟件mpg123,則可以首先進入這個Port對應的目錄,然后使用make 命令進行處理。

# cd /usr/ports/audio/mpg123
# make install

  在這台計算機連接到Internet上的條件下,在這個過程中系統將順序完成下載、編 譯、安裝几個步驟。

  make fetch: 每個Port中并沒有保存應用軟件的原始源代碼文件,它保存的 是如何獲得軟件的源代碼,并產生可執行文件的操作過程。每種軟件的源文件通常保存在其 他介質上(一般位于Internet上),那么當通過Ports Collection來安裝一個軟件時,第一 步就是要獲得相關的文件。這個下載文件的功能是Ports Collection的一部分功能,如果這 台計算機聯接到Internet上了,它能夠到網絡上找到該文件并使用fetch命令將文件下載到本 機內,所有的步驟都是完全自動完成的,需要使用者操作的僅僅是使用make命令來啟動這個 過程。

  如果使用的是make fetch命令,fetch參數將使得make僅僅完成下載任務,而不進行 編譯和安裝處理過程。

  即使計算機沒有聯接到Internet上,也不必擔心,因為Ports Collection將所有下載 的文件都保存在/usr/ports/distfiles目錄中,而make命令將首先檢查該目錄中是否已經存在 了要下載的源文件,當發現存在這個文件之后,就不再重新下載。因而可以手工將這個應用軟 件的源代碼文件拷貝到這個目錄下,make時就不會再重復下載過程了。如果不能確定源文件的 位置,可以從Makefile文件中獲得源文件的位置,Makefile中將給出該源文件存在几個不同的 網絡地址,供fetch命令連續嘗試下載,一般最新Ports Collection對應的軟件的源文件都能 從ftp.freebsd.org中下載得到。

  make: 不帶任何參數的make命令在完成上述下載工作之后,就開始編譯軟件了 。make程序首先在這個Port目錄下建立一個工作子目錄,命名為work,此后將源代碼展開到這 個目錄下,再應用這個軟件的各個補丁文件,并啟動自動配置和編譯過程。在這里,每進行一 步操作,就在work目錄下生成一個空文件,這些文件用于標記編譯、安裝port的工作進行到哪 一步了。

$ ls -al /usr/ports/security/ssh
total 8
drwxr-xr-x  3 root  wheel   512 Apr 14 16:57 .
drwxr-xr-x  7 root  wheel   512 Apr 19 01:18 ..
-rw-r--r--  1 root  wheel   768 Apr 14 16:57 .PLIST.mktmp
-rw-r--r--  1 root  wheel     0 Apr 14 15:56 .build_done
-rw-r--r--  1 root  wheel     0 Apr 14 15:56 .configure_done
-rw-r--r--  1 root  wheel     0 Apr 14 15:55 .extract_done
-rw-r--r--  1 root  wheel     0 Apr 14 16:57 .install_done
-rw-r--r--  1 root  wheel     0 Apr 14 15:55 .patch_done
drwxr-xr-x  4 root  wheel  4608 Apr 14 15:56 ssh-1.2.26

  make展開應用軟件包時會檢查下載軟件包的完整性,這是通過驗証下載文件產生的MD5 數據是否與記載在Port中的數據相一致,來保証了下載軟件的正確性。

  每個Port的Patch是一些補丁程序,它包括這個軟件本身存在問題,用于修正或升級的 補丁,或者是維護這個Port的FreeBSD開發者用于修正系統差異而制作的Patch。所有的補丁程 序被放置在該Port目錄下的patches目錄中。

  要對這個軟件進行定制時候,應該首先使用make命令,保証源代碼展開到正確的目錄下 并編譯完畢。這樣能保証make應用了所有的補丁程序對源代碼進行修正,然后才能在此目錄中 修改相應配置,并刪除work子目錄中的相應標記文件.build_done,使得可以重新開始編譯過程 ,重新編譯軟件。

  make install: 如果使用的是make install命令,那么make先完成編譯過程, 然后還將自動安裝這個Port,此時不但將軟件的各個部分安裝到正確的位置之外,還將執行Port 中附帶的shell腳本進行軟件的基本配置。當然這個配置過程是不完整的,完整的配置屬于這個 應用程序本身的功能。

  安裝完畢之后,還可以針對自己定制的Port生成對應的軟件包,使用make package命令 將自動完成這個過程。

  安裝每個Port的同時也就等同于安裝相應的Package,安裝過程同時也將在/var/db/pkg 目錄下記載下相應Package的安裝記錄。由于軟件包之間存在相互依賴關系,Ports Collection 中也使用同樣的原則來處理軟件之間的依賴關系,必須使用預先安裝這個Port依賴的所有其他 Packages之后,才能安裝(不影響編譯)這個Port。這個過程也將在make install中自動完成的 ,系統就會檢查依賴關系,自動使用Ports Collection安裝它所依賴的Port,最后才能繼續這個 Port的安裝過程。

  由于安裝過程依賴于軟件包之間的依賴關系,因此可能會出現比較復雜的情況。例如 Ports Collection的源代碼不完整,缺乏它所依賴的軟件包的信息,這樣安裝就不能正常完成 。還有就是Ports Collection之間不一致,由于軟件的版本不同,就可能造成依賴關系不完整 ,安裝過程不能繼續進行。這就需要使用者檢查依賴關系,更新整個Ports Collection來糾正 問題。

  有的軟件,本來就是提供的二進制形式的軟件,例如Netscape Communicator,因此并不 需要編譯過程。所需要的僅僅是將它們下載并安裝。即便如此,使用Ports Collection仍然能夠 幫助使用者更方便的完成這項工作。因為Ports Collection仍然維護著一些有用的信息,例如要 下載的應用軟件版本號和應用軟件的下載位置,應用軟件的安裝目錄和配置文件所在的目錄等非 常有用的信息。使用包的方式進行安裝和管理,將保証應用軟件之間的依賴關系的完整性,方便 在不用的時候將包卸載,此外Ports Collection還將按照FreeBSD的習慣來組織文件和目錄,便于 將要安裝的文件放置到合適的位置中。

  通常FreeBSD將應用軟件安裝到/usr/local目錄下(X Window應用軟件安裝到/usr/X11R6 目錄下),其執行程序位于/usr/local/bin中,配置文件位于/usr/local/etc中,而應用軟件如 果需要在系統啟動時自動啟動,相應的啟動文件被放置到/usr/local/etc/rc.d目錄中。

未完,待續。。。  



 
  新浪首頁 > 科技時代 > FreeBSD使用大全連載 > FreeBSD連載(55):Ports Collection


網站簡介 | 網站導航 | 廣告服務 | 中文閱讀 | 聯系方式 | 招聘信息 | 幫助信息

Copyright(C) 1999 SINA.com, Stone Rich Sight. All Rights Reserved

版權所有  四通利方 新浪網