2008年12月12日 星期五

FreeBSD的package management

上次談過了FreeBSD怎麼更新系統,這次談談package management
在談這個之前要先有的觀念是dependency
什麼是dependency,意思是,要完成a這件事情的話,必須先完成b這件事情
例如:要騎腳踏車之前,必須先學會騎腳踏車,必須先買腳踏車,必須先學會保持平衡,學會騎腳踏車這件事情就是騎腳踏車的dependency
為甚麼要了解這個呢,因為package management也是一樣的意思,要安裝xxx軟體之前,系統必須先安裝好yyy軟體
因為現在的程式開發都是模組化的觀念了,共用的元件會獨立出來,變成library的方式讓其他程式來呼叫,所以要安裝並能夠正常執行xxx軟體,必須先把xxx軟體所需要的library都安裝起來,也因此會有了dependency
一般來說,開發團隊放出來的如果沒有特別包裝成package的格式的話,是以壓縮檔的形式來在網路上,像是xxxx.tar.gz這樣的檔案,拿到之後呢,解壓縮,然後看說明之後,確定所有需要的東西都安裝好之後,在執行./config後面接參數,產生makefile之後執行make,make install,這樣的步驟來安裝
這樣的問題在於,每一次有新版的出來,這個程序就重新來一次,而且每一次config的參數有可能不一樣,不一樣的人有不同的參數,這次安裝的時候設定了什麼參數,可能也沒有人記得,有可能變成最後系統裡面到底安裝了什麼東西都沒有人知道,同樣的東西會有不同的版本同時存在系統裡面,造成日後維護管理上的不便,或是有security patch沒上到,被人家crack
為了解決這個問題,不同的系統有不同的解決方法,就算是windows也是有這樣的機制來管理,就是新增移除程式,如果再安裝軟體的時候出現要先安裝xxx軟體那就是了,目前比較多的可能是微軟的dot net framework這東西吧
在linux上不同的發行版本有不同的解決方案,我個人比較熟悉的主流的是rpm , deb這兩種package格式,而有了編譯好的package之後,就是要解決dependency的問題了,這個就很多解決方法了,如yum , apt , yast等等不同的工具來處理dependency的問題,還有升級的處理
而在FreeBSD上,有不同的處理方法,稱為ports,另一個方式是package,總共有兩種方式
ports,簡單的說就是從網路上抓tar.gz的壓縮檔案回來,然後用系統本身的gcc來編譯,然後安裝起來,這是由maintainer來維護的,為了確保編譯及執行沒問題,會有一些相對應的patch對程式做一些調整或是修改,安裝的路徑也跟自己手動編譯的不一樣,有些人會說,有些東西自己編譯比較有彈性,這種話是鬼扯,現在的ports也已經有模組化的觀念了,例如php5好了,/usr/ports/lang/php5/這個ports,有選單可以勾選需要哪些模組,勾選好之後就全部安裝起來了,之後還是可以另外再加入其他的模組,新增移除模組都很方便,ports的優點就是版本永遠是最新的,缺點就是自己編譯的時候要花的時間比較久,如果硬體不是那麼好的話,編譯真的很花時間
packages,就是已經編譯好的ports,在每個版本release的時候,會有一段時間會把ports tree freeze,目的就是要編譯出對應的版本的packages,之後讓pkg_add這個指令來直接安裝,這個優點就是不需要自己編譯,很快就安裝好軟體,但缺點就是版本會比較舊

了解了這些觀念之後,再來看怎麼用
更新ports tree,上次已經談過了,這邊就不多說,更新完之後要安裝某個ports,就cd /usr/ports/xxxx/yyyy ; make install clean然後等編譯完就安裝好了,如果是用csh , tcsh的話,還要用rehash指令來讓系統找到新安裝好的執行檔
有些ports會有一些參數可以下,或是定義要包含哪些功能,這時候就會有選單跑出來,勾選之後會記錄在/var/db/ports/這邊,之後升級的時候就可以直接使用這邊的參數
如果是開機會自動執行的話,會在/usr/local/etc/rc.d/安裝好啟動的script,然後透過rc.conf裡面的設定來決定開機是不是自動啟動
例如安裝了apache22,會在/usr/local/etc/rc.d/安裝一個apache的script,然後需要在/etc/rc.conf裡面設定apache22_enable="YES"來讓apache開機自動起動,其他也都是如此,因為現在的系統不管是內建的service,還是用ports安裝的,都是必須透過/etc/rc.conf來決定是否啟動
不管是用ports安裝的或是用packages安裝的,都會在/var/db/pkg/裡面記錄了安裝了哪些檔案,安裝在哪裡,有哪些dependency等等這些資訊,要移除的話就只要/var/db/pkg/裡面下pkg_delete xxxx就可以移除了,其他常用的還有pkg_info , pkg_updating等等,如果要升級的話,請看之前的系統升級的部分囉

沒有留言:

張貼留言