以前曾經看過很多開發人員提到FreeBSD用於開發是非常優秀的系統,但是之前提到的主要都是freebsd在單機的開發環境下所具有的優勢,但是最近我發現其實FreeBSD在開發方面所具備的優勢並不僅只於此。在一個開發團隊中使用FreeBSD是可以形成一個完整的解決方案的。在單機方面的開發環境上,我不想多說了,Linux其實也具備很多好的特點的,我想說得更多是linux所不具備的特點。當然這個方案使用linux來完成並不是不可能的,但是使用linux來完成其中的很多部分是有一些困難的,從便利性上來講不如FreeBSD,從我這個懶人的角度來講,如果有兩個方法來解決問題,一個既簡單又快速(還很清晰),另一個相對比較復雜,耗時長。那我沒有理由非要選用後一種 。說這話的原因是,我不想跟我們國家普遍存在的某些偏執的人引起任何的爭論。只是想說這裡其實有一種簡單易行的方法。更主要的原因是,這種方法在我已知的情況下還沒有人在開發環境的建立中使用。
其實這個方法所使用的技術都是已經被廣泛采用的,甚至可以說有些古老的東西。只是通過FreeBSD這個系統能夠把它們都串連在一起。可以形成一套完整的開發環境,還包括辦公環境。我這個想法的核心是由一台FreeBSD中心服務器來完成的。這個中心服務器上安裝CVS server,Samba server和NFS server就可以了,其中Samber server可以提供方便的空間共享,之所以除了NFS還要再單裝Samba,是因為Samba在非*nix的環境上也可以使用。同時還可以安裝CUPS來驅動一台打印機,通過Samba共享,讓整個工作環境都可以共享打印服務。用FreeBSD做中央文件服務器和CVS服務器的好處是不會受到廣大的ndows病毒的影響。現在還有一點缺憾的是在FreeBSD上還沒有好的殺毒軟件可用,雖然有個老美的殺毒軟件,但是因為是付費的,付給老美一方面有點貴貴,另一方面也比較麻煩,希望我們國家的殺毒軟件廠商也能考慮做一個能在FreeBSD上運行的版本,就算收點錢也可以。這樣的好處就在於可以在crontab裡運行殺毒軟件定期的掃描文件服務目錄中的文件是不是感染了病毒。其實這對於FreeBSD沒什麼意義,因為FreeBSD也不會受病毒的影響,但是使用這個文件服務的windows的機器就危險了,這也算是我的一個期望吧,也許不太現實。在FreeBSD上安裝 CVS,Samba我都不太想多說了,文章很多了,我和老黃都曾經寫過如何在FreeBSD上安裝CVS server的文章。Samba很簡單了用ports裝就完了。以後有時間了我會把每個服務的安裝文檔整合進來形成一個完整的東西的。現在我們重點講一下在FreeBSD上使用NFS的情況。其實這個是我最想說地,因為通過NFS和FreeBSD本身的軟件系統相結合能夠產生一個很意想不到地效果。
在FreeBSD上如何使用NFS server
其實在FreeBSD上使用NFS server非常簡單。打開NFS server的服務是個很簡單的事情,只需要運行/stand/sysinstall,選擇Configure,在這個菜單中選擇Networking,裡面有一個NFS Server的選項,把它勾上以後會進入編輯器編輯一個文件/etc/exports你直接寫你要export出去的目錄就可以了。需要注意的一點是FreeBSD的NFS有個可能算是不太好的特點,export出去的目錄必須是mountpoint,也就是分區的掛點。例如你運行mount的時候你能看到你現在都mount了那些分區,mount到的那個目錄就是相應的掛點。這點上Solaris就可以指定目錄,所以我覺得FreeBSD這麼弄有點不太爽,也許這樣設計比較簡單吧。在我所要描述的方法中我們需要的是將/usr這個掛點export出去。這裡不得不提到一個問題,很多從linux轉過來的兄弟都有個我們不太推薦的習慣,就是把整塊硬盤就分成一個"/",在linux下其實也不推薦這麼用的,如果在FreeBSD上這樣分的話,問題就更多了,比如用NFS的話,你就得把"/"都export出來,
還不郁悶死了。下面我舉個例子在/etc/exports裡面應該怎麼寫:
代碼:
/usr -alldirs -maproot=root 192.168.0.10
按照上面一行寫的意思就是將整個/usr這個分區都export出來供192.168.0.10
這個地址所使用,如果不寫ip地址就是export給所有人用的,這麼干比較危險,
如果不是在一個100%可靠的網絡裡面最好別這麼干。-alldirs的意思就是
/usr中的每個目錄都可以作為NFS的掛點掛到遠程,這點比較重要,我後面
會提到的,-maproot=root的意思就是給予對方root權限來操作目錄。這裡
說句題外話,Solaris在這點有個不如FreeBSD的地方,Solaris裡面export
給的目標是不能夠寫ip地址的,必須寫對方機器的機器名,而且這個機器
名必須是DNS服務器或者/etc/hosts裡面存在的機器,否則不能共享,用起
來有點繁瑣,不過可能是出於安全方面的考慮,呵呵。如果修改完了這個文件
退出即可,如果是ee的話按ESC退出,如果是vi的話:wq退出。如果對其進行
修改之後需要重啟NFS server可以使用下列命令來完成
代碼:
kill -s HUP `cat /var/run/mountd.pid`
我之前說了這麼一大堆東西到底做什麼用呢?下面我來解釋一下這台中央服
務器裝NFS有什麼用。在整個開發小組都是用FreeBSD的情況下,這樣做
非常具有意義,主要是在裝機上,大家都知道無論是windows還是FreeBSD
還是linux,重新裝一台機器都是一件極度痛苦的事情。因為要首先要對系
統進行升級,之後還有很多常用軟件需要安裝。雖然FreeBSD上面有ports
系統,但是恐怕大家都有感覺,我們常規裝一台FreeBSD的機器,需要在
裝好了之後升級源代碼,然後重新編譯內核,編譯系統,慢點的機器
make world一次等到花兒都謝了。還有一個問題就是,很多人其實不太喜
歡在工作的機器上裝ports和src的,因為這些東西很占地方,一套src差不
多200多MB,一套ports也要300多MB。如果編譯完了不make clean的話src會
增加到350M左右,ports就更多了。但是如果make clean的話,再升級系統
或者應用軟件的時候你又郁悶了,因為make這個工具有個特點,如果代碼
部分發生改變的時候,它只會編譯發生改變的代碼,而沒發生改變的代碼
就不會編譯,所以你要是上次編譯完了make clean了,再編譯就會從頭開
始,如果不做make clean,再編譯一次的速度就很快了。有些人會問為什
麼不用FreeBSD提供的binary級的升級以及使用ports的package?原因是
這樣的,對於系統的binary升級補丁,一方面提供的頻率比較低,而且我
還不知道怎麼下載安裝。而且有的時候更新少的時候我不是太想升級。對
於ports呢,我本人其實不太願意用package,因為官方生成的package更新
的速度很慢,這點很郁悶。自己生成package呢,總有各種各樣的問題,
雖然現在ports可以make package-recusive 但是,我弄了幾次都沒弄出
一套完成的package出來。還是直接用ports來make install最方便,但是
如果這些都在每台機器上重新編譯的話,無疑是很痛苦的,如果是一台快
機器的話,還可以,可能一天就能完了,如果是一台慢的機器弄不好3、4
天…………實在是太煩人了。這個問題怎麼解決才好呢?我們怎麼才能在
1個小時之內裝出一個我們能夠方便使用的,帶有我們所需的應用軟件的
全新的機器呢?windows、linux恐怕都不太可能,我分析一下為什麼這麼
說。從windows來講,我想各位裝的時候首先也都會升級系統,windows
雖然有service pack可用,還有從windows update上下載單獨的binary
補丁,其實也是比較慢的。裝一次windows 2000的sp4也很慢,再去
windows update升級零散的補丁少說也得快1個小時。再加上裝亂七八糟
的軟件,恐怕也得裝個N小時。而linux呢,升級只升級內核,速度很快,
裝軟件有弄好的rpm,也很快但是還是有幾個問題,通常的linux本身裝起
來很慢,這個大家不能否認。裝一下Red hat現在是個非常慢的事,沒個
幾個小時裝不完,而我裝一套FreeBSD的基本系統不超過15分鐘,這一點
就沒法比了。而且linux升級只升級內核的話,只能修正內核的問題,如
果是附帶的應用有問題,例如BIND,ftp,apache之類的東西,還需要單
獨找補丁包升級,也要累死。而且如果需要定制應用的話,rpm也得重新
編譯才行,用binary就要放棄定制的靈活性。所以要是裝一套合用的linux
也是要很長時間的。我所說的這些大家恐怕都有體會。但是FreeBSD上是
可以解決這個問題的,這個恐怕是源於FreeBSD非常合理的系統設計,
ports和src的系統都是非常靈活而且方便的系統,這給我們快速安裝創造
了條件,只要結合了NFS就可以實現。
我現在從安裝一台全新的FreeBSD來講解一下怎麼來實現快速安裝。
我們之前的那台服務器現在就派上用場了。那台中央服務器上可以安裝
src和ports,我們用NFS server把它的/usr export出來,而在新裝的這台
機器上選擇不安裝src和ports,在系統安裝完畢之後,需要在/usr中建立
src和ports的目錄,然後我們通過下列命令來把中央服務器上的src和ports
掛到我們的機器上,我們假設中央服務器ip地址為192.168.0.1,而新裝
的機器的ip地址為192.168.0.10,我們已經在中央服務器上向這個地址
export了它的/usr(方法參考前面提到的)
代碼:
mount_nfs 192.168.0.1:/usr/src /usr/src
mount_nfs 192.168.0.1:/usr/ports /usr/ports
這樣一來,我們新裝的機器上就有了src和ports了。中央服務器在安裝
的時候也會make kernel和make world的,如果客戶機的硬件和希望的配
置跟中央服務器不太一樣,只要在上面再寫個新的內核配置文件,再用
這個配置文件編譯一個適合客戶機的內核就可以了,而make world對於那
台機器都是一樣的,所以我們在客戶機上直接make installworld就完了。
把漫長的make world過程都給省了。裝應用軟件也是一樣,只要有一台
機器曾經用這套ports make install裝過這個軟件,並且沒有make clean
的話,其他的機器就可以跑到這個目錄裡面make reinstall一下就行了。
我解釋一下為什麼要make reinstall,而不是make install,這是因為
ports有個特點,它會在這個應用裝過以後保留下一個install_done的標
記,你在每個裝完的應用目錄裡面的work目錄中能看到這個名為
.install_done.xxxxxx的文件,後面的xxxxxx是這個應用的名字。如果
你換了台機器使用這個ports的話,直接make install的時候會發現並沒
有執行任何的安裝就結束了,就是因為make檢測到了這個文件,就不會
再執行一次安裝了。沒關系,ports還為我們准備了解決的辦法,這就是
make reinstall,簡單吧。這裡還有個問題,我覺得ports解決的很好,
因為通常很多軟件涉及到很多依賴軟件,如果這台客戶機已經安裝了一些
依賴軟件,我在安裝一個依賴這些軟件的新軟件的時候,這些已經安裝的
依賴軟件是不是也會重新來一遍呢?這不會很慢麼?其實不會的,這涉及
到多個系統共享一個ports時候多個系統安裝差異的問題,不過這個考慮
其實是多余的了,因為FreeBSD在安裝上一個應用軟件之後會在/var/db/pkg
中保留一個這個軟件的安裝記錄,所以你在安裝一個依賴了很多軟件的新
軟件的時候,它會檢測你裝了什麼,沒裝什麼,已經裝過了的就不會再
安裝一次了。通過這樣的方法,我們重新安裝一個新的開發環境就變得
異常的快速,而且可以靈活的定制。為什麼會說靈活定制呢?你這裝得
不也是binary麼?是這樣的,以gnome2為例子,gnome2實際上是由一系
列的小軟件組成的,這個大家應該都清楚,如果我想定制其中一個小軟
件只要修改那個軟件的編譯參數重新編譯一遍就可以了,其他的部分依
然不會受到影響。編譯單個的小軟件無論對於什麼機器來講都是很快的
所以對於安裝速度的影響,就很小了。這種方法無論對於批量裝機,還
是單獨定制都是個很爽的辦法。但是這個方法我為什麼要放在這樣一個
標題下講,是因為這個方法需要一台單獨的機器來做中央服務器,這對
於大多數的個人用戶是不現實,也沒有意義的。但是卻對於有多個人的
開發團隊來講,一台機器是個小問題,能夠快速的安裝出來一台開發環
境能夠大幅度的提高效率,具有的意義就非同一般了。而且這個方法也
只需要這台中央服務器定期更新它的src和ports,定期編譯,客戶機就
可以跟著一起升級了,省得大家重復勞動了。提出這個方案是源於我們
這個團隊的開發環境都是使用的FreeBSD,因為我們是進行J2EE項目開發
的,在FreeBSD上開發的時候我們需要編譯jdk、Xfree、gnome2、
eclipse等等軟件,這都是裝起來很慢的軟件,每台機器都單獨安裝的
話,大家都得累死。使用這個方法的話,實在是爽的不得了。差不多
一個小時左右,一台合用的機器就完成了。補充一個需要注意就是大家
如果在共享一個ports的時候使用portupgrade時候需要小心,一定要
加上-wW參數,否則把共享的ports內容給清光了,會有人很郁悶的……
最後我需要感謝黃冬教給我這個方法。其實這個方法是他們以前經常
使用的方法,只不過不是用在開發環境的建立上,是他在門戶網站的時
候他們用來批量安裝web服務器的方法,所以對於所有門戶網站的管理員
來講這也是一個非常有用的辦法。因為據我所知,國內幾個用FreeBSD
的門戶網站,都是有大批量的FreeBSD服務器集群來進行服務的,裝機
就成為一個工作量很大的工作,如果采用這種方法,大家裝機的時候也
能夠輕松不少了。而我個人的感覺其實在團隊開發環境的建立上,使用
這個方法其實比服務器的批量裝機還更有意義,因為服務器通常裝的
那些軟件還都比較小,而裝一台開發用的機器要裝得大軟件就多的很
了,所以我個人認為這對於開發環境來講具有的意義更大。我把這個
方法貢獻出來,已經很熟悉這個方法的朋友不要罵我,我只是覺得雖
然這個方法用的已經很普遍而且其實非常的簡單,但是以前並沒有人
把它寫出來給大家共享一下,另外因為其在使用上有一些小小的技巧
需要注意,所以小弟我給大家獻丑了。