如果有一天你有很多台機器,雖然其中一台常常在升級,但是其它台都很少在管理,如果要快速升級的話,最快的就是透過package來升級,不然每台都做編譯的動作非常浪費時間。因此這裡提供一些動作當參考,可以加速ports的升級。
1. 選一台source機,以後都專門做package的機器,並將所有的ports升到最新
# cd /usr/ports && make update fetchindex
# portmaster -a
2. 將機器上所有的ports都做成package
# setenv PACKAGES /tmp/ports_package (將所有的ports做出來的package放在/tmp/ports_package中)
# portmaster -t -y --clean-distfiles (把所有舊有的distfile都清掉)
# portmaster --check-port-dbdir (把沒安裝但留在系統中沒用的所有舊的port config目錄清掉)
# portmaster -afF (指定所有ports且先將所有的distfiles抓完、強制執行)
# portmaster -afg (強制重編所有的ports並且建立package,千萬要記得-g不然都白做了,根據ports的流程,若要建立package的話編譯是必須的,沒辦法由系統直接打包)
之後portmaster就會開紿跑相依性並將所有的ports全都重編且重新安裝,同時會做成package放到之前我們定義的目錄/tmp/ports_package中,不過這過程就要看系統安裝多少ports的複雜度來決定時間,如果你使用的是xterm的話在title bar中會顯示已經完成了多少ports,另外如果不幸中斷的話,可以重新執行最後一行指令,並加上-R讓它將接著下去,而不是全部重做
3. 建立ports index並放入/tmp/ports_package
因為軟體都有使用到portconf做客製化,因此相依性的部份和用fetchindex抓下來的INDEX-8會有些差異,如果要由package來升級的話,portmaster必須要參考此檔來決定那些要升級,因此我們要由目前ports狀態下做出目前的port index
# cd /usr/ports && make index (建立port index INDEX-8)
# mv /usr/ports/INDEX-8 /tmp/ports_package
# cd /tmp/ports_package && bzip2 -z INDEX-8
這個時候ports_package目錄應該為
-INDEX-8.bz2
+ALL
+Latest
+....
+....
4. 將ports_package目錄做成web目錄
總之就是建立一個http,並將目錄指向ports_package。比如我開了一個帳號叫srvupgrade,並將所有的ports_package資料都放在public_html之中,架構為
/home/srvupgrade/public_html/INDEX-8, ALL, Latest而且對外必須要能存取如http://140.xx.3.xx/~srvupgrade/INDEX-8可以取的到index,而http://140.xx.3.xx/~srvupgrade/ALL可以看的到所有的套件的符號連結
5. 在要升級的client端先修改一些參數將package升級導向我們的伺服器
# mkdir /tmp/upgrade_package && setenv PACKAGES /tmp/upgrade_package (將package指定到其它地方不要和系統的目錄搞在一起)
# setenv MASTER_SITE_INDEX http://140.xx.3.xx/~srvupgrade/ (自己做出來的INDEX-8的網址)
# setenv INDEXDIR /tmp/upgrade_package (下載index之後放在/tmp/upgrade_package中)
# setenv PACKAGESITE http://140.xx.3.xx/~srvupgrade/Latest/ (指定package要去我們的server上抓)
如果不希望每次都設定的話,就寫入.cshrc吧!
6. client端開始只使用package升級,而不用到ports
# portmaster --index-only --packages-only --delete-packages -a
會先下載INDEX-8並存在/tmp/upgrade_package中之後檢查那些軟體需要升級,之後會透過我們指定的PACKAGESITE去我們自己的server上下載回來放在/tmp/upgrade_package,最後升級完成後順便將下載回來已經升級完的package刪除。
如果每台機器所裝的軟體都一樣的話,那上面這種方式非常的方便,但是如果這台client還裝了其它的軟體的話,因為server上沒有編,而所做出來的INDEX-8會記錄這些其它軟體也需要升級,所以在升級的過程中我們不能只使用--packages-only,因為一定會有軟體在server上沒有編,所以這些不大的軟體,我們可以由client自己編譯升級,一樣會大幅的減少升級時間
# cd /usr/ports && make update fetchindex (先更新整個ports)
# portmaster --packages --delete-packages -a (以ports為基礎,如果沒有package版本一樣的話,就由client自己編譯)
7. client最後將一些不需要的資料清掉
# portmaster --clean-distfiles (將系統沒安裝或是用不到的distfiles清掉)
# portmaster --clean-packages (將系統沒安裝或是用不到的package清掉)
# portmaster --check-depends (整理所有ports的相依性看有沒有任何的錯誤)
* 結論
當然做出來的package不但能用來升級,如果有新機器要快速建立的話,直都都透過pkg_add來裝就非常的快
透過這種方式升級會更方便且快速,但是做成package來裝的穩定性和相依性比不上由ports來要好,所以除非希望方便升級或是希望要非常快就可以安裝或升級,再用此方法會更好。