FreeBSD安裝盤上還提供了一些packages。這些packages是預先遍一號的應用程序。對於一台擁有很好的Internet連接的、速度足夠快的機器來說,並不需要安裝packages(KDE和X除外,編譯它們各需要花上一天一夜的功夫)。這台機器速度還稱不上“足夠快”,所以我安裝了 cvsup,它在devel中。
到目前為止,我們已經安裝了FreeBSD的基本系統。由於FreeBSD基本系統中包括很多庫文件,並且,這些庫文件可能已經被發現存在問題,因此現在立刻安裝應用程序或服務(如Apache等等)是不合適的。此後我們將講解FreeBSD的在線升級(cvsup)、應用程序的安裝,以及優化。
更新FreeBSD
完成了安裝、配置,FreeBSD基本上就算裝完了。不過,目前為止沒有哪個通用操作系統能夠保證“bug-free”,FreeBSD也一樣。在重新啟動之後,我們需要做一些調整;並且,通過重新配置內核,我們可以得到一個更小、更快的操作系統。
第一步要做的是同步源代碼。FreeBSD是一套開放源代碼的操作系統,它的全部源代碼都可以通過cvsup與中央cvsup服務器,或它的某個鏡像同步。
cvsup是一個可選的package,同樣的,它也可以從ports裡面安裝(/usr/ports/devel/cvsup和 /usr/ports/devel/cvsup-nogui)。考慮到許多應用程序都依賴X的庫文件,在前面安裝的部分我安裝了它,並且直接安裝了 cvsup的package。不過,如果你有足夠的耐心去一個一個地make需要的ports,那麼先安裝ports collection,然後make cvsup-nogui也是一個不錯的主意,盡管這需要比較長的時間。
創建一個用於cvsup(1)的supfile,命名為stable-supfile:
*default base=/usr
*default prefix=/usr
*default release=cvs tag=RELENG_4
*default delete use-rel-suffix
src-all
ports-all tag=.
隨後執行
cvsup -g -L 2 stable-supfile
這裡需要稍微解釋一下FreeBSD的幾種版本。
FreeBSD包括3類分支:-RELEASE,-STABLE和-CURRENT。FreeBSD 3.x、4.x和5.0是目前受到維護的版本,如果你期待穩定運行,那麼,可以選擇的最新版本將是FreeBSD 4.6-STABLE(如果你是在4.6.2-RELEASE發行之後更新的,那麼它實際上比4.6.2-RELEASE新,並且,它正式的CVS tag是RELENG_4,即FreeBSD 4-STABLE)。
那麼,三類分支有什麼區別呢?
FreeBSD的開發是非常活躍的。系統中可能會隨時引入一些新的特性。最新的代碼是在-CURRENT分支中引入的。-CURRENT的修改非常頻繁,每天都可能有數百處修改。使用-CURRENT分支的FreeBSD需要耐心和勇氣,因為你的系統隨時可能崩潰(隨著FreeBSD 5.0開發尾聲的接近,這種現象已經越來越少),make world也可能空手而歸(沒有人保證-CURRENT分支能夠正常編譯),此外,這個分支的性能也不好(因為調試的原因,這個分支引入了大量的調試選項,這意味著運行速度不會太快)。當然,正像它的名字那樣,-CURRENT分支的版本也是最新的5.0,而且,一切FreeBSD的錯誤和漏洞的修正都是首先在-CURRENT分支引入的。目前,-CURRENT分支碩果僅存的只有FreeBSD 5-CURRENT(指定cvs tag時寫“.”),這個分支包括了FreeBSD 5.0開發的最新進展。
FreeBSD 5中將引入大量的新特性,包括核心級線程(目前FreeBSD中的線程支持僅限於用戶級線程,這在多處理器的環境下性能不夠好,當然,目前使用fork ()來支持的多進程線程模擬能夠提供類似核心級線程的功能,但並不是所有的程序員都知道如何使用fork)、完整的Soft Updates(這一變化將提供更好的文件系統性能,同時提供更好的穩定性),等等。如果你有快速的Internet連接,一台或一些空余的機器(當然,不是生產用的服務器),並且希望為FreeBSD的開發作貢獻,或者你關心操作系統的最新發展,那麼,-CURRENT分支是最好的選擇。
此外,由於-CURRENT分支性能不好、穩定性不夠等這些缺點,對於生產的服務器來說,通常運行的應該是FreeBSD-STABLE。如同它的名字那樣,FreeBSD-STABLE的目的是“穩定地運行”。-CURRENT分支中的代碼,在經過一段時間(通常是7到90天,但安全更新屬於特例,通常會在幾個小時)的驗證之後,符合版本條件(有些新特性只能用於FreeBSD 5.0)的代碼會被FreeBSD-STABLE吸收,這個操作稱作MFC(Merge From -CURRENT,不是Microsoft Foundation Classes:P)。
由於FreeBSD 5.0的第一個RELEASE至今仍然沒有發布,因此,目前還沒有5.0-STABLE。目前,FreeBSD-STABLE有兩個版本,FreeBSD 3-STABLE和FreeBSD 4-STABLE,分別對應3.x和4.x的最新穩定版代碼(對應的cvs tag分別是RELENG_3和RELENG_4)。由於版本的更新換代,其中3.x的-STABLE正在逐漸消亡。FreeBSD-STABLE每天平均會修改10個左右的文件。
每隔一段時間,FreeBSD的發行工程組(Release Engineering Team)會對FreeBSD-STABLE的源代碼樹進行鎖定。這段時間(目前的規定是30天,之前還有30天准備)內,所有的MFC操作都需要發行工程組的批准,因此,FreeBSD-STABLE在這個階段基本不會引入任何新的特性。經過這段時間之後,發行工程組會在最後鎖定ports樹,並 build一份所有的package,之後,這份鎖定的-STABLE,可能經過若干RC(Release Candidate),被命名為RELEASE,並制作光盤發行。
顧名思義,-RELEASE的設計目標是“發行”。一個版本一旦 RELEASE,那麼他的功能就不會再增加了。此後的所有維護的目標都只有一個,那就是絕對穩定。如果你和-RELEASE分支同步,那麼絕不會出現 make無法通過的情況,而且,通常這也可以保證你的系統“絕對”穩定,因為它不會引入任何新功能(例如,4.6就是4.6,如果你想要4.6.2的功能,必須明確地指定4.6.2)。
目前,FreeBSD有很多RELEASE版本,它們的cvs tag如下。我個人建議使用最新的4.6.2-RELEASE。
對於多數人來說,-RELEASE是一個比較極端的選擇。無論何時出現版本升級,如果你想跟進,那都必須修改supfile,如果你選擇不跟進,那麼就可能造成ports工作異常。如果經常更新,-RELEASE可以保證操作系統本身的安全性,但同其他分支一樣,如果ports出了問題,那麼也得一塊 make,而既然這樣,還不如使用-STABLE。
如果你符合下面的條件,那麼RELEASE分支可能比-STABLE分支更適合你
你使用的軟件對於操作系統的變化非常敏感,比如,它只能FreeBSD 4.5,而無法在4.6上運行;同時,你不打算采用它的更新版本,或者它的作者拒絕更新
操作系統的更新對於你來說沒有任何意義,比如,你打算把FreeBSD當作一個相對固定的嵌入式操作系統來使用,例如,作為防火牆的一部分
更新會對你造成困擾,操作系統的絕大多數新特性對於你來說除了增加煩惱之外,不能帶來任何其他東西。-並且,符合以下的全部條件-
你每天察看FreeBSD,以及使用的全部軟件的安全公告
你的Internet連接比較通暢
目前我本人維護的所有主機,除了作為防火牆的那台之外,使用的都是FreeBSD-STABLE。
一旦同步完源代碼,就應該對整個系統進行更新。如果你沒有每天察看安全公告的習慣,那就應該關心一下cvsup到底更新了哪些代碼。nectar是目前 FreeBSD的Security Officer。如果你發現他一下子更新了許多代碼,那麼對你來說立即make world和kernel很可能是必需的。
為了更新整個系統,在/usr/src中執行
make world
以及
make kernel KERNCONF=內核配置文件名
當然,也可以連起來執行:
make world kernel KERNCONF=內核配置文件名
如果你的計算機運行速度較慢,那麼,對於基本系統的更新(相當於不包括庫的一次world),可以用
make most
替代make world,但make world是一個不錯的主意,因為它能夠保證對C運行環境的改變應用到所有的程序中,如果修正的不是動態連接的C函數庫,那麼make world可以保證代碼的一致性。
make kernel是一個需要重新啟動的操作。如果你的make world修改了系統的關鍵服務,那麼最好也重新啟動一下。我很少有耐心看完make world和kernel的執行,根據系統的運行速度不同,這需要一個小時到一天的時間,而且,不是所有的SSH客戶端都能夠長時間正確的執行,例如, SecureCRT的多個版本都有內存洩漏問題。
為了解決這個問題,我用下面的命令來完成更新:
make world kernel KERNCONF=內核配置文件名 clean > /var/log/world,out && reboot &
這個命令能夠記錄更新的全過程,如果在什麼地方編譯失敗,你可以很快地找到原因。對於多數人來說,由於後面的&&,只需要察看uptime就能知道便以是否成功。
需要說明的是,FreeBSD的make world並不總能成功。有時需要修改一些環境變量才能成功完成make。為了保證make成功,在/usr/src中執行任何make操作之前,建議你看一眼UPDATING中是否有特殊的要求(這種要求並不是在FreeBSD Release的時候才會出現,很多時候他會在某個CURRENT中引入,然後隨著MFC進入-STABLE分支),並且,在進行大的版本升級之前(跨 RELEASE,甚至主版本號),首先執行下面的命令
mergemaster -p
並在make world之後執行
mergemaster -i
運行mergemaster腳本需要一定的Unix配置知識,不過,由於配置文件中包含很多幫助信息,因此,只要master.passwd、 group這樣的文件不出大問題(如果cvsup更新了master.passwd,那麼就需要留神,因為master.passwd標准配置是root 口令為空,這時需要用m來合並,而不是使用i安裝),mergemaster並不會引入什麼新的問題。
筆者曾經遇到過FreeBSD因為系統日期不正確而無法make的情況,因此,再次特別提醒大家,如果你的系統日期不正確,最好是用date命令修改一下,或者干脆用ntpdate或ntpd來同步時間。關於如何使用ntp,將在以後說明。