portmaster

在Freebsd上常用的兩套套件管理程式,大概就是portupgrade和portmaster但是portupgrade是透過ruby寫成的,而且需要額外的資料支援來記錄目前所有的ports內容,所以變成當ports有變動的話同時也要將pkgdb做更新的動作,雖然portupgrade所提供更多工具的支援但是速度就是比較慢,最近已經轉換為portmaster+portconf,因為portmaster沒有辦法單獨的設定一個套件需要的額外參數,所以透過portconf的支援,將不同的軟體需要的編譯參數都寫進去就可以做一個全域的管理了,這裡說明一下portmaster+portconf如何合作並使用。

* 架構說明
portconf -> 設定不同軟體編譯參數
make.conf -> 讀取portconf處理完的編譯參數,之後直接設定整個ports編譯過程follow這些參數
ports install (make install clean) -> 已follow所有make.conf各軟體所指定的編譯參數
portmaster -> 直接使用底層的ports升級或新增安裝,因此也會同時follow各軟體指定的編譯參數

* install portconf
# /usr/ports/ports-mgmt/portconf && make install clean
# vim /usr/local/etc/ports.conf (portconf的設定參數)
*: BATCH=yes | WITHOUT_HAL=yes | WITHOUT_DEBUG=yes | WITHOUT_GNOME=yes | WITHOUT_GCONF=yes | WITHOUT_KDE=yes | WITH_NLS=yes
editors/vim*: WITH_X11_ONLY=yes
x11/xterm: WITH_256_COLOR=yes

由此範例可以看出設定的方式很簡單,只要將你想要設定的ports name以path的方式表示,之後如果有多個版本像是vim有6, 7等等的版本,可以直接使用「*」來指定,之後就是加上一個「;」後面就是在ports的Makefile裡面的參數了,以vim來說,我要指定所有的vim版本都使用WITH_X11_ONLY這個參數,而如果有多個參數的話使用「|」來加入更多的設定就行了。
而在我第一行的設定中*: BATCH=yes | .... |.... 它的意思表示,所有的ports的編譯安裝都要符合這個全域的設用,所以我不指定路徑,而是直接使用「*:」來指定。

* install portmaster
# cd /usr/ports/ports-mgmt/portmaster && make install clean

那portmaster就是我用來取代portupgrade的ports管理器,它有非常多的參數可以設定,而也有設定檔可以指定常用的編譯參數。

* portmaster options

-C 防止每次升級或安裝新的ports時都先make clean

-G 防止每次升級或安裝新的ports時都要make config跳出選擇視窗

-H 不顯示編譯過程

-K 防止每次升級或安裝新的ports之後都做make clean

-B 防止升級時,將舊的套件備份起來(在portmaster升級流程中,會先將原套件備份起來以免新套件未成功安裝,但是裝完的時候就會將備份移除,備份檔會放在/usr/ports/packages/裡面)

-b 升級時,將舊的套件備份起來而不移除

-g 升級或是安裝新的套件時順便建立packages(一樣放在/usr/ports/packages/裡面)

-n 將所有的行程模擬跑過一次,但是不會真的編譯升級 (其實可以不用,因為最後都會問是否確認要升級)

-v 顯示更大量的資訊

-w 升級時,將舊的套件的share library備份起來放在/usr/local/lib/compat/pkg中,這個極為
重要,因為升級的時候,如果是share library bump跳版次的話,會造成系統中所有用到此函式庫的程式需要重新,若沒有重編會因ld連不到存在的函式庫而造成不能執行,先保留起來在打算是必要的

-f 強制執行編譯升級ports

-i 互動模式詢問,當升級套件很多的時候,會一個一個的詢問是否要升級安裝

-D 升級或移除ports的時候不要將用不到的distfiles砍掉

-d 升級或移除ports的時候自動將用不到的distfiles砍掉

-m 可以直接下參數給升級ports的時候編譯參數,但我們有portconf所以大概用不到了

-x 避免某個套件升級,當將ports全部都升級,但只有某幾個不想升的話,這個參數就用的到了

--no-confirm 默認執行,不要跳出任何需要管理者同意的資訊,建議不要開,會有點危險

--no-term-title 將你的termainal的title bar顯示為目前進行的進度關掉,預設是開啟的

-P 若網路上有可用的package版本的話,直接使用來加速安裝,若沒有的話則執行編譯

--packages-build 當升級或安裝軟體的時候,會有build dependency,所以會需要安裝automake或make這樣的ports來當成工具編譯需要的套件,但是往往都會浪費時間,所以提供了使用套件來將這些建立工具直接用package來安裝,可增加效能,同常會搭配--delete-build-only來用

--delete-build-only 將build dependency的套件建立完主要的ports之後就將這些工具移除了,同常搭配--packages-build來使用

--packages-if-newer 用packages來升或安裝,假設版本沒有跟上ports tree版本號的話也沒關系,一樣用舊一點的packages,但是仍然會比系統中已安裝的ports還要新

--always-fetch 不論是否有這個distfiles存在總是重抓一次

--packages-local 如果今天已取得所有需要安裝的ports且已經做成packages的話,可直接指定用這些package來裝,而不在上網去下載可用版本

--local-packagedir= 配合--packages-local一起使用,若不想和系統的packages放在一起搞混的話,可以將人做整個系統做好的package下載到一個你喜歡的目錄,假設為/tmp/mypkg則可以指定這個路徑,之後使用--packages-local參數來升級,就會以/tmp/mypkg的目錄,將所有的ports以packages的方式全部升級

-a 確認所有的ports有沒有必要升級,通常都要先做完ports tree cvs update

--show-work 來顯示某個ports它的相依性,還有那些沒有安裝,那些已經安裝

-o 將目前的某ports取代成另某ports,比如版本的轉換,將firefox換成firefox36

[R-] -r 重編所有相依到某套件上一層所有ports,通常ports version bump的時候就會這樣做了

-R表示若因某原因中斷,而加上此參數可以接續上次處理一次的流程接著處理完,而不重新執行

-l 列出所有目前安裝的ports並分類好

-L 列出所有目前安裝的ports分類好,且同時檢查是否要升級

--list-origins 列出目前所有上層ports在ports tree的原名

-F 只抓取新的distfiles而不做任何動作

-y 對所有執行的動作都回答yes

-e 移除某個ports且會自動運行-s將不在需要的ports一併移除

-s 移除不在需要相依的ports

--clean-distfiles 移除不在需要的distfiles,若有指定-d的話會自動移除

--clean-packages 移除不在需要的packages

--check-depends 確認目前所有的ports相依性,若有缺當的相依性的話,會顯示出來

--check-port-dbdir 確認目前在/var/db/ports下每個ports的設定,是否有過舊,或ports已移除而將不必要的port config也移除

* portmaster config
如果要將上面的設定都記得的話是件很麻煩的事,所以portmaster有提供一個設定檔在/usr/local/etc/portmaster.rc 可以從portmaster.rc.sample cp一份過來,以下是我常用的設定

NO_BACKUP=Bopt (不要保留已移除ports的備份檔)
ALWAYS_SCRUB_DISTFILES=dopt (不要保留舊有的distfiles)
PM_NO_MAKE_CONFIG=Gopt (升級或安裝時不要做make config)
PM_VERBOSE=vopt (每個portmaster顯示行為和過程)
SAVE_SHARED=wopt (保留已經移除ports的share library避免port version bump)


* portmaster Example

若不直接使用ports tree來安裝新軟體,也可以直接透過portmaster來安裝新的ports
# portmaster editors/vim (若vim軟體已存在的話會自動重裝蓋過,若有新版本的話會自動升級)

用portmaster來移除ports和不在被相依的ports
# portmaster -e portupgrade [-n|-y] (-e會自動呼叫-s做清除無用的ports,且會詢問是否執行)

用portmaster來升級所有的ports
# cd /usr/ports && make update fetchindex (更新ports tree)
# portmaster -a [-n|-y]

用portmaster來安裝或升級軟體,並同時建立package
# portmaster -g editors/vim

用portmaster來轉換其它版本的ports
# portmaster -o www/firefox36 firefox-4.0_1,1

用portmaster來清除無用的distfiles
# portmaster --clean-distfiles [-n|-y]

用portmaster列出目前所有套件並分類
# portmaster -l

用portmaster列出目前所有套件並以ports name來顯示
# portmaster --list-origins

用portmaster來檢查所有ports的相依性問題
# portmaster --check-depends

用portmaster來檢查並刪除舊有的port config
# portmaster --check-port-dbdir [-n|-y]

用portmaster來檢查並刪除舊有的packages
# portmaster --chean-packages [-n|-y]

用portmaster來安裝新ports,但避免時間的浪費,所以將build dependency用packages來裝,且之後這些build dependency的packages要刪除不要佔空間
# portmaster --packages-build --delete-build-only ports-mgmt/portupgrade

用portmaster來檢查新安裝一個ports還需欠有那些相依性要先裝
# portmaster --show-work ports-mgmt/portupgrade

用portmaster來安裝新的ports並看看有沒有packages可以用免得自己編譯浪費時間
# portmaster -P ports-mgmt/portupgrade (注意:這和 PACKAGESITE環境變數有關,不然會抓到的是和光碟版一同釋出的ports版本)

用portmaster全部升級所有ports,但是只有firefox和vim不升級
# portmaster -x firefox -x vim -a

如果某個ports發生ports version bump的話,需要重編所有相依到此ports的上層ports
# portmaster -r graphics/png

如果整個系統做跳版次的升級7.3r -> 8.2r 那麼必須將所有的ports全部重編
# portmaster -fa

* 結論
用了portupgrade差不多一年多了,轉換到portmaster之後覺整個升級流程速度快上很多,雖然portupgrade還是穩定一些,而且選擇更多,但是相對的portmaster比較簡單而且不需要額外的資料庫支援,因為後來發現portconf這個好物之後就直接換到portmaster了,原本只有在portupgrade裡面所用到的pkgtool.conf,而在portconf也可以做的到了。

0 意見: