FreeBSD連載(55):Ports Collection

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絨N舋舅U載工具從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目錄中。