FreeBSD   CVSup

.逸晨


CVS => Concurrent Version System
指的是並行版本系統。
目前的專案開發大都是利用此系統來做專案版本的控管,關於 CVS 的介紹,你可以查看底下的連結︰ 當然,連結中的連結,也是您必要參考的文件喲 ^_^
在此,我們將僅為您介紹如何利用 CVSup 來更新 FreeBSD 的原始程式碼。

當您在看 FreeBSD 文件以及 mailing lists 的時候,您可能會常常看到 sup。
Sup 是 CVSup 的前身,訴求也很類似。凡是 Sup 能夠用到的場合都可以使用 CVSup 來取代,而且 Sup 的設定檔還能夠被 CVSup 來使用。
FreeBSD 開發計畫已經不再使用 Sup 了,因為 CVSup 不管在速度或是彈性上都更勝一籌。

因為 CVSup 是用 Modula-3 所寫的,當 CVSup 執行時需要這些函式庫,因此不管您是採用 port 或 package 安裝方式,您都必需在系統安裝上 Modula-3 的函式庫。而 Modula-3 的函式庫很大,您若是利用 port 的安裝方式時,在抓取相關的原始程式碼與編譯都相當的不容易,因此我們建議您採用抓取已將 Modula-3 函式庫靜態連結進去的可執行檔回來安裝︰
  • 先於 root 的 shell 設定檔中加入如下一行︰
    如果您是使用 csh、tcsh
    setenv PACKAGEROOT ftp://ftp4.tw.freebsd.org # 指定遠端存放 packages 的伺服器
    如果您是使用 sh、bash
    export PACKAGEROOT=ftp://ftp4.tw.freebsd.org # 伺服器的位址請改為您覺得連線速度較快的位址

    然後執行︰shell# pkg_add -r cvsup-without-gui 
    如此系統就會前往該伺服器抓取 cvsup-without-gui.tgz 檔案回來並安裝它,您可以使用 pkg_info 來查看是否已安裝完成。

  • 或者您也可以使用如下指令︰
    格式︰pkg_add url/finename
    shell# pkg_add ftp://freebsd.csie.nctu.edu.tw/pub/CVSup/CVSup-bin.tgz

在來您需要編輯 CVSup 的設定檔 (supfile),以便 cvsup 執行時能夠知道它該怎麼做。
supfile 與其他檔案一樣,利用井字號『#』來做為註解,遇到空白行會略過,因此您可以利用這些特性來為您的 supfile 做註解與區塊的分別,以利日後閱讀維護。
您也可以在 /usr/share/examples/cvsup 目錄下找到相關的 supfile 設定範例,您可以隨意覆製其中一檔然後針對需求來編輯它。底下將為您介紹範例中所使用到的設定︰

*default這是行宣告的開始,它是固定的,沒有為什麼,用就對了!!
除了所要抓取原始碼的類別之外,每行的設定開頭一定要由這個關鍵字做開頭。
host指定原始碼存放所在的伺服器位址,如︰
host=cvsup5.tw.freebsd.org
您也可以透過 cvsup -h cvsup5.tw.freebsd.org supfile 來另外指定伺服器位址。
等號前後不能加上空白。
base指定 CVSup 存放執行過程中產生的訊息檔所存放的根目錄,如︰
base=/usr/local
您也可以透過 cvsup -b /usr/local supfile 來另外指定存放訊息檔的根目錄。
等號前後不能加上空白。
所指定的根目錄一定要事先建立。
因為這些訊息檔將會有幾 MB 之多(視您要抓取的原始碼類別與多寡而定),請設定要足夠空間的分割區所在。
prefix指定抓取回來的原始碼要存放的根目錄所在,如︰
prefix=/usr
您也可以透過 cvsup supfile /your/path 來另外指定存放原始碼的根目錄所在。
等號前後不能加上空白。
所指定的目錄一定要事先建立。
release指定 CVS 伺服端所發行的種類名稱。
很難理解吧,不用管它,因為通常我們都是設定為 release=cvs
這個設定能使用的參數,要以 CVS 伺服端所配置的設定來決定,因此我們就照貫例來即可。
tag指定要抓取的版本。
這兒是最重要的地方,因為一字之差您所得到的結果將會全然不同喲。
  • tag=.
    表示抓取 FreeBSD-current 版本
  • tag=RELENG_4
    表示抓取 FreeBSD 4.x-STABLE 版本
  • tag=RELENG_4_5
    表示抓取 FreeBSD 4.5.x-STABLE 版本
  • tag=RELENG_4_RELEASE
    表示抓取 FreeBSD 4.x-RELEASE 版本
  • tag=RELENG_4_6_2_RELEASE
    表示抓取 FreeBSD 4.6.2-RELEASE 版本
至於可以抓取的版本,您可由 http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/cvs-tags.html 查知。
如果您設定了一個 CVS 伺服端所沒有的版本,則 CVSup 將會刪除您已存在的原始程式碼。
如果您沒有設定 tag,那 CVSup 將會把伺服端中所有的發展版本全部抓回來--如果您想做出自己的 RELEASE,您需要這麼做。
如果您的設定檔是針對 ports 用的,您的 tag 設定只能使用 tag=.
因為 ports-tree 發展並無版本之分,只有現行的版本可抓取。
delete給予 CVSup 刪檔的權限。
CVSup 需要有刪除檔案的權限,才能確保您所抓取的原始碼結構是與伺服端同步的。
如果您有自行建立的檔案,比如 FreeBSD 未支援的裝置驅動程式原始碼,CVSup 並不會將它刪除,但若是這些驅動程式的原始碼需要變動到系統原始碼,CVSup 會因與伺服端的檔案比對結果不同,而重新由伺服端抓取下來,因此您需再對這些檔案再編輯一次。
compress啟動傳輸時的 gzip 壓縮模式。
如果您的網路頻寬並不是很寬裕時,您會需要加入此設定。
當加入此設定時,CVSup 會先將原始程式碼先行壓縮,再抓取回來解壓縮存放。這可以節省您的抓取時間。
use-rel-suffixCVSup 執行時會依據您的 $base 所指定的目錄,並於其 sup/ 子目錄下,依據您所指定的抓取類別建立各相關的子目錄,如 src-all/、ports-all/ 等,然後會在各子目錄下建立一個比對檔,檔名為 checkouts
而使用此選項時,CVSup 會在 checkouts 檔名之後,依據您的 $release、$tag 兩個設定值,將它們附加到檔名之後,如︰checkouts.cvs:RELENG_4_6_2_RELEASE
因為此檔是讓 CVSup 為了比對 local 與 server 中檔案是否有所差異與加速抓取的效率用的,所以基本上檔名為何並無差別,加用此選項是為了讓您在管理時能夠依據檔名來判別與維護,至於如何利用此比對檔,則依各人的管理習性而有所不同了。
collection指定要抓取的原始程式碼類別。
這是唯一無需使用 *default 當行開頭的指定值,它是用來告訴 CVSup 該抓取哪些原始程式碼。可不要直接就用 collection 來當指定值喲 ^_^
您應該使用如下的指定值︰
  • src-all
或是︰
  • ports-all

綜合以上的設定說明,我們可以編輯出如下的設定檔︰

※系統原始碼
# 指定伺服器位址
*default host=cvsup5.tw.FreeBSD.org

# 指定 CVSup 存放執行過程中產生的訊息檔所存放的根目錄
*default base=/usr

# 指定抓取回來的原始碼要存放的根目錄所在
*default prefix=/usr

# 指定 CVS 伺服端所發行的種類名稱與抓取版本
*default release=cvs tag=RELENG_4_6_2

# 設定其他的參數
*default delete use-rel-suffix compress


# -- 指定抓取的種類 -- #

# 抓取全部的系統原始碼
src-all

# 直接指定抓取系統核心原始碼的細項
#src-all
src-base
src-bin
src-contrib
src-etc
#src-games
src-gnu
src-include
src-kerberos5
src-kerberosIV
src-lib
src-libexec
src-release
src-sbin
src-share
src-sys
src-tools
src-usrbin
src-usrsbin

※port-tree
# 指定伺服器位址
*default host=cvsup5.tw.FreeBSD.org

# 指定 CVSup 存放執行過程中產生的訊息檔所存放的根目錄
*default base=/usr

# 指定抓取回來的原始碼要存放的根目錄所在
*default prefix=/usr

# 指定 CVS 伺服端所發行的種類名稱與抓取版本
*default release=cvs tag=.

# 設定其他的參數
*default delete use-rel-suffix compress


# -- 指定抓取的種類 -- #

# 抓取全部的 port
ports-all

# 直接指定抓取 port 細項
#ports-all
ports-base
ports-archivers
ports-astro
ports-audio
ports-benchmarks
ports-biology
ports-cad
ports-chinese
ports-comms
ports-converters
ports-databases
ports-deskutils
ports-devel
ports-editors
ports-emulators
ports-french
ports-ftp
ports-games
ports-german
ports-graphics
ports-hebrew
ports-irc
ports-japanese
ports-java
ports-korean
ports-lang
ports-mail
ports-math
ports-mbone
ports-misc
ports-net
ports-news
ports-palm
ports-picobsd
ports-print
ports-russian
ports-science
ports-security
ports-shells
ports-sysutils
ports-textproc
ports-ukrainian
ports-vietnamese
ports-www
ports-x11
ports-x11-clocks
ports-x11-fm
ports-x11-fonts
ports-x11-servers
ports-x11-toolkits
ports-x11-wm

是否感覺到設定檔的內容似乎太過於龐大呢?其實通常我們是不會在設定檔中指定如此多細目的,在指定抓取種類處,我們一般都只是下個 src-all 或是 ports-all 的設定而已,如果有不想抓取的,我們會另外在 $base/sup/ 目錄下編輯個 refuse 檔案,用來指定不需要抓取的細目。
像 ports-tree 中,我們應該不太會需要用到非臺灣語系的套件,因此我們可以在 $base/sup/refuse 檔案中編入如下設定︰

ports/german
ports/japanese
ports/korean
ports/russian
ports/vietnamese

凡是編寫在 $base/sup/refuse 檔案中的細項,CVSup 皆不會浪費時間去比對抓取。您可以針對您不想抓取的細項來加入這個檔案中,不管是系統原始碼或 ports 的部份,全部都是寫在此檔中。

如果您想將 source code 與 ports-tree 的 supfile 寫為一個檔案的話,在 ports 的地方要注意到 tag 的部份,您需要在 ports 的指定項目後加入個 tag=. 的設定,不然 CVSup 會將您現有的 ports-tree 完全刪除喲。整個的設定檔如下︰

*default host=cvsup5.tw.FreeBSD.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=RELENG_4_6_2
*default delete use-rel-suffix compress

src-all
ports-all tag=.

不過通常我們是會將 source code 與 ports 的 supfile 分開來寫,然後再寫個 script 來執行抓取的動作,底下這個 script 您可以參考看看,當然您也可以直接覆製使用︰

#!/bin/sh --
PID=`ps auxw|grep "cvsup -d"|grep -v grep|awk '{print $2}'`
if [ ! ."$PID" = ."" ]; then
  exit
else
  if [ -f /var/log/cvsup.log ];then
    /bin/mv -f /var/log/cvsup.log /var/log/cvsup.log.0
  fi

  case "$1" in
  src)
    cvsup -g -z -L 1 /etc/cvsupfile-stable | /usr/bin/tee /var/log/cvsup.log
    sync
    ;;
  ports)
    cvsup -g -z -L 1 /etc/cvsupfile-ports | /usr/bin/tee -a /var/log/cvsup.log
    sync
    ;;
  all)
    cvsup -g -z -L 1 /etc/cvsupfile-stable | /usr/bin/tee /var/log/cvsup.log
    cvsup -g -z -L 1 /etc/cvsupfile-ports | /usr/bin/tee -a /var/log/cvsup.log
    sync
    ;;
  *)
    echo "Usage: `basename $0` {src|ports|all}"
    ;;
  esac
fi

假設您將此檔存放於 /root/bin 目錄下,並命名為 run_cvsup 且也附予了執行的權限,您可以執行

/root/bin/run_cvsup src => 抓取 source code
/root/bin/run_cvsup ports => 抓取 ports-tree
/root/bin/run_cvsup all => 抓取 source code 之後再抓 ports-tree

當完成後,如果您想要更新整個系統,您需要執行 make world 來重建新版本的系統。


上一篇返回首頁目錄索引章節目錄回上一頁Page UP下一篇

最佳瀏灠環境︰Mozilla & 1024x768