19.3. 透過網路來對 Source Trees 進行同步化

Contributed by Jordan K. Hubbard .

有很多方法可以透過網路 (或是 email) 來讓 FreeBSD 的 source 保持最新版本,無論是一部份或是整個 source, 全看您對那些部份有興趣。我們主要提供 Anonymous CVSCVSup、以及 CTM

Anonymous CVSCVSup 是採用 pull 的方式來更新 source。以 CVSup 來說,當使用者 (或是 cron) 執行 cvsup ,它會和遠端的 cvsupd 伺服器取得連繫,然後就會更新您的檔案。 您取回的更新檔是最新的,而且只有當您想要的時候,您才會拿到這些檔案。 您可以很輕易地限制您的更新動作只更新您感興趣的某個檔案或是某個目錄。 更新的動作是由伺服端根據您有什麼以及您要什麼來即時完成的。 Anonymous CVS 比起 CVSup 來說是簡單很多了,它只是一個 CVS 的擴充版,允許您可以直接從遠端的 CVS repository 中取得改變的部份。CVSup 也可以做到這一點,而且更有效率,但是 Anonymous CVS 使用上則容易得多。

在另一方面,CTM 並不是以交談式介面來比對您所擁有的 sources 和伺服器上的 sources 或是您取得的更新部份。相反的,會有一個 script 檔專門用來辨識變更過的檔案,這個程式是由 CTM 伺服器來執行, 每天會比對數次,並把兩次執行期間內變更過的檔案加以壓縮, 給它們一個序號,然後就加以編碼 (以可列印的 ASCII 字元為主) 並以 email 的方式寄出。當您收到它的時候,這些 ``CTM deltas'' 就可以由 ctm.rmail(1) 這個程式來處理,它可以自動解碼, 確認並在使用者的 sources 上使用這些變更。這個程序比 CVSup 或是 Anonymous CVS 來說是快得多了, 而且這個動作對我們的伺服器來說是比較輕鬆的,因為這是一個 push 的動作而不是 pull 的動作。

當然這還有很多方法可以使用。如果您不小心把您部份的程式清除掉了, CVSup 會偵測出來, 並自動為您把不足的部份補齊。CTM 並不會為您做這些動作,而 Anonymous CVS 則會覺得十分困惑。如果您清掉了您的部份 source (而且您沒有備份), 您可以從頭開始 (從最新的 CVS ``base delta'') 並用 CTM 來重建它們,或是用 anoncvs 來完成, 只要把不正確的地方刪掉再重新做同步的動作即可。

想要得到更多有關 Anonymous CVSCTM、以及 CVSup 的資訊的話,請參閱下列各節:

19.3.1. Anonymous CVS

Contributed by Jordan K. Hubbard

19.3.1.1. 介紹

Anonymous CVS (另稱 anoncvs) 是一個 FreeBSD 內附 CVS 程式所提供的功能,能夠和遠端的 CVS repository 的資料做同步更新。尤其是它可以讓 FreeBSD 的使用者能夠在沒有任何特殊權限的情況下以唯讀的方式將 FreeBSD 官方 anoncvs 伺服器中的資料以 CVS 取出來。 要使用它只要設定 CVSROOT 這個環境變數, 將它指向適當的 anoncvs 伺服器,然後就可以用 cvs(1) 這個指令來存取資料,就好像您在使用本地端的 repository 一樣。

雖然基本上來說 CVSupanoncvs 做的事情很類似, 它們之間仍然有很多不一樣的地方,進而影響了使用者的選擇。 簡單地來說,CVSup 在使用網路資源方面是比較有效率的,而且在技術上來說是比較複雜的, 但是要使用它就要付出一點代價。在使用 CVSup 之前,您必須先安裝並設定一個程式, 而且它所存取的是一個 CVSup 稱為 collections 的巨大單位。

對照起來,Anoncvs 可以用來檢驗任何東西,包括某個程式 (例如 ls 或是 grep) 的某個單獨檔案。 當然,anoncvs 只能對 CVS repository 進行唯讀的動作,所以如果您想要自己開發並和 FreeBSD 共享一個 repository 的話,CVSup 就是您的唯一選擇了。

19.3.1.2. 使用 Anonymous CVS

設定 cvs(1) 來使用 Anonymous CVS repository 是很簡單的, 只要把 CVSROOT 環境變數指向 FreeBSD 的其中一個 anoncvs 伺服器即可。 在本文寫作的時候,您可以使用下面這個伺服器:

  • USA: anoncvs@anoncvs.FreeBSD.org:/cvs

儘管 CVS 實際上能讓使用者 "取出" 任何曾經存在過 (或者在某些情況下,將要存在 :) 的 FreeBSD 版本的程式,您仍然要熟悉 cvs(1) 的版本 (revision) (-r) 選項以及它在 FreeBSD 計畫中可能的值。

有兩種標籤 (tag) 可以使用,版本標籤 (revision tag) 以及分支標籤(branch tag)。版本標籤可以用來指定某個特定的版本。 版本標籤所代表的意義不管在什麼時候都是相同的。在另一方面, 分支標籤指的是任何時候某個發展線的最新版。 因為分支標籤並非指定某個特定版本, 明天它所代表的意義和今天就是不一樣的。

下面這些就是使用者可能感興趣的分支標籤:

HEAD

主發展線 (FreeBSD-current) 的一個代名。 如果您沒有指定版本時,它就是預設值。

RELENG_3

FreeBSD-3.x (FreeBSD-stable) 的發展線。對 ports collection 而言這是不合法的。

RELENG_2_2

FreeBSD-2.2.x (2.2-stable) 的發展線。對 ports collection 而言這是不合法的。

RELENG_2_1_0

FreeBSD-2.1.x 的發展線 - 這個分支已經不再使用了。 對 ports collection 而言這是不合法的。

下面這些就是使用者可能感興趣的版本標籤:

RELENG_3_2_0_RELEASE

FreeBSD-3.2. 對 ports collection 而言這是不合法的。

RELENG_3_1_0_RELEASE

FreeBSD-3.1. 對 ports collection 而言這是不合法的。

RELENG_3_0_0_RELEASE

FreeBSD-3.0. 對 ports collection 而言這是不合法的。

RELENG_2_2_8_RELEASE

FreeBSD-2.2.8. 對 ports collection 而言這是不合法的。

RELENG_2_2_7_RELEASE

FreeBSD-2.2.7. 對 ports collection 而言這是不合法的。

RELENG_2_2_6_RELEASE

FreeBSD-2.2.6. 對 ports collection 而言這是不合法的。

RELENG_2_2_5_RELEASE

FreeBSD-2.2.5. 對 ports collection 而言這是不合法的。

RELENG_2_2_2_RELEASE

FreeBSD-2.2.2. 對 ports collection 而言這是不合法的。

RELENG_2_2_1_RELEASE

FreeBSD-2.2.1. 對 ports collection 而言這是不合法的。

RELENG_2_2_0_RELEASE

FreeBSD-2.2.0. 對 ports collection 而言這是不合法的。

RELENG_2_1_7_RELEASE

FreeBSD-2.1.7. 對 ports collection 而言這是不合法的。

RELENG_2_1_6_1_RELEASE

FreeBSD-2.1.6.1. 對 ports collection 而言這是不合法的。

RELENG_2_1_6_RELEASE

FreeBSD-2.1.6. 對 ports collection 而言這是不合法的。

RELENG_2_1_5_RELEASE

FreeBSD-2.1.5. 對 ports collection 而言這是不合法的。

RELENG_2_1_0_RELEASE

FreeBSD-2.1.0. 對 ports collection 而言這是不合法的。

當您指定了分支標籤以後,通常您會取得這條發展線最新版的檔案。 如果您想要舊版的檔案,您可以藉由利用 -D date 指定日期來達到這個目的。請參閱 cvs(1) 的 man page 以獲得更多資訊。

19.3.1.3. 範例

雖然說我們強烈建議在您做任何事之前先把 cvs(1) 的 man page 看過一篇,我們還是在這裡提供了一些範例來示範 Anonymous CVS 的用法:

Example 19-1. 取出 -current (ls(1)) 的東西然後再把它刪除掉:

    % setenv CVSROOT anoncvs@anoncvs.FreeBSD.org:/cvs
    % cvs co ls
    % cvs release -d ls

Example 19-2. 取出 2.2-stable 分支的 ls(1) :

    % setenv CVSROOT anoncvs@anoncvs.FreeBSD.org:/cvs
    % cvs co -rRELENG_2_2 ls
    % cvs release -d ls

Example 19-3. 製作一份 FreeBSD 2.2.2 和 FreeBSD 2.2.6 對於 ls(1) 差異的列表 (以 unidiffs 的格式呈現):

    % setenv CVSROOT anoncvs@anoncvs.FreeBSD.org:/cvs
    % cvs rdiff -u -rRELENG_2_2_2_RELEASE -rRELENG_2_2_6_RELEASE ls

Example 19-4. 找出其他可用的模組名稱:

    % setenv CVSROOT anoncvs@anoncvs.FreeBSD.org:/cvs
    % cvs co modules
    % more modules/modules
    % cvs release -d modules

19.3.1.4. 其他資源

下面這些資源可以幫您學習使用 CVS:

19.3.2. CTM

Contributed by Poul-Henning Kamp . Updated 19-October-1997.

CTM 是一種可以讓遠端機器的目錄樹和主要機器的目錄樹保持同步的一種方法。 它是為了要在 FreeBSD 的 source tree 上使用而發展出來的, 但是隨著時間過去,其他人發現到把這個技術應用在其他方面也是很有用的。 目前關於如何製作 deltas 的文件就算有也不多, 所以如果您想在其他地方應用 CTM 的話,您可以連絡 Poul-Henning Kamp 以得到更多資訊。

19.3.2.1. 為什麼我要用 CTM

CTM 可以讓您在本地端保留一份 FreeBSD 的 source trees。有很多 ``種類'' 的 tree 可供選擇。不管您是想要整棵 cvs tree 或是只想要其中的一個分支, CTM 都可以提供您必需的資訊。 如果您是一個活躍的 FreeBSD 發展者,但是您的 TCP/IP 連線品質很差,甚至沒有, 或是您只是單純地希望所有的變動能夠自動地送到您手上, CTM 是您最好的選擇。在最活躍的分支上, 您最多需要一天取得三份 deltas。無論如何, 您最好考慮讓它們自動送到您手上。 這些更新部份的大小會盡可能地縮小,通常小於 5K,偶爾 (十分之一的機會) 會到 10-50K,很少的情況下才會出現 100K+ 或是以上的大怪物。

您也必須讓自己習慣於面對各種問題, 這些問題通常會發生在發展中的程式,而非包裝好的 release 版。 如果您選擇的是 ``current'' 的 source 的話,這更重要。 建議您先讀過 使用 FreeBSD Current

19.3.2.2. 我需要那些東西才能使用 CTM

您需要兩個東西:CTM 程式以及要餵給它的 initial deltas (為了要達到 ``current'' 的層次)。

CTM 程式在 FreeBSD 2.0 版以後就屬於系統的一部份了,如果您有 source 的話,它就位於 /usr/src/usr.sbin/CTM

如果您用的是 FreeBSD 2.0 以前的版本,您可以直接從這裡取得最新的 CTM 程式:

ftp://ftp.FreeBSD.ORG/pub/FreeBSD/FreeBSD-current/src/usr.sbin/ctm

您要餵給 CTM 的 ``deltas'' 可以經由 FTP 或是 e-mail 來取得。 如果您可以在 Internet 上使用 FTP 的話,您可以在下面這個 FTP 站取得 CTM

ftp://ftp.FreeBSD.ORG/pub/FreeBSD/CTM

或是您也可以參考 mirrors這一節。

把相關的目錄用 FTP 取回並取得 README 檔,先讀這個檔。

或是您想經由 email 來取得 deltas:

寄 email 給 來訂閱其中一個 CTM 套件。 ``ctm-cvs-cur'' 是整個 cvs tree 的。 ``ctm-src-cur'' 是發展中分支的。 ``ctm-src-2_2'' 是 2.2 分支,諸如此類。 (如果您不知道如何用 majordomo 來訂閱通信論壇 的話,請先寄一封內容為 help 這個字的信過去 - 它會把使用說明寄回來給您。)

當您開始收到您的 CTM 更新檔時,您可以用 ctm_rmail 來解開並使用它們。 事實上如果您想讓自動進行 ctm_rmail 這個程式的話,您也可以在 /etc/aliases 裡安排。請參考 ctm_rmail 的 man page 以取得更多資訊。

Note: 無論您是透過什麼方式取得 CTM deltas 的,您都應該訂閱 通信論壇。未來任何有關 CTM 系統的公告都只會公布在這裡。要加入這個論壇只要寄一封內容只有一行 subscribe ctm-announce 的信到 即可。

19.3.2.3. 第一次使用 CTM

在您使用 CTM deltas 之前,您要先取得一個 deltas 的基準點。

首先您要先決定到底您有什麼。每個人都要從 ``empty'' 目錄開始。您必須用一個啟始的 ``Empty'' delta 初始化您的 CTM tree。為了使用者方便,將來這些 ``started'' deltas 會以出現在 CD 上的方式來散佈,雖然目前並不是這樣做。

However, since the trees are many tens of megabytes, you should prefer to start from something already at hand. If you have a RELEASE CD, you can copy or extract an initial source from it. This will save a significant transfer of data.

您可以輕易地認出這些 ``starter'' deltas ,它們都在號碼後面接了一個 X (例如 src-cur.3210XEmpty.gz)。 X 後面的名稱符合您啟始 ``seed'' 的起點。Empty 是一個空目錄。通常來說, Empty 是每一百個 deltas 就產生一次的。 除此以外,它還是個龐然巨物!通常一個 XEmpty deltas 包括了好幾十 Megabytes 的 gzip'ed 壓縮資料。

一旦您選定了一個基礎的 delta 之後,您也要把所有大於這個號碼的 deltas 都取回。

19.3.2.4. 在日常工作裡使用 CTM

要使用 deltas,只要:

    # cd /where/ever/you/want/the/stuff
    # ctm -v -v /where/you/store/your/deltas/src-xxx.*

CTM 能辨認被 gzip 起來的 deltas,所以您不必先把它們給 gunzip,這樣能夠節省一點磁碟空間。

CTM 不會動到您的 source tree 除非它覺得整個過程都很安全。如果想要驗證 delta 的話您可以使用 -c 選項,則 CTM 不會真的去改變您的 source tree;它只會檢查是否這個 delta 可以毫無錯誤地用在您目前的 source tree 上面。

CTM 還有很多選項可以使用,看看使用手冊或是閱讀其他資源可以得到更多資訊。

如果有人能幫忙建立一個 ``使用者界面'' 的話, 我也會覺得十分高興, 因為我知道我無法決定什麼時候該怎麼使用那個選項。

就是這麼單純。每當您拿到一個新的 delta,只要把它丟給 CTM 就可以使您的 source 保持在最新版。

如果重新下載很困難的話,千萬不要把那個 deltas 刪除掉。 您最好保留那些檔案以防有什麼意外發生。即使您只有軟碟可以用, 您也要考慮用 fdwrite 來把它們備份下來。

19.3.2.5. 保留自己變動的部份

身為一個開發人員,人們往往喜歡對 soruce tree 進行一些實驗或是改變。 CTM 允許您做變更,只是有點限制:在檢查 foo 這個檔案之前,它會先檢查 foo.ctm。 如果這個檔存在的話,CTM 就不會作用在 foo 上而會作用在該檔上。

這個行為可以讓我們進行檔案的修改: 只要把您想修改的檔案拷貝一份並加上 .ctm 的檔尾即可。之後您就可以快樂地進行程式碼的研究,同時 CTM 也會保持 .ctm 的最新版本。

19.3.2.6. 其他有趣的 CTM 選項

19.3.2.6.1. 找出有那些檔案會被更新

您可以藉由 -l 選項來得知 CTM 會對您的 source repository 的那些檔案進行變更。

如果您想要對有那些檔案進行變更做記錄的話, 不管是在變更前或變更後,或是您只是覺得這有很趣, 這個選項都是很有用的 :-)。

19.3.2.6.2. 在更新前先備份

有時候您可能會想要把所有會被 CTM 更新動作所改變的檔案都給備份起來。

指定 -B backup-file 可以令 CTM 把所有改過的檔案都備份在 backup-file 裡。

19.3.2.6.3. 限制昇級所能影響到的檔案

有時候您可能只想要使用某些 CTM 的昇級檔,或是只想要解開一系列 deltas 所變更的某些檔案。

您可以用 -e-x 選項指定 regular expression 來控制到底要改變那些檔案。

例如說,如果您想要根據您的 CTM deltas 來更新您的 lib/libc/Makefile 的話,就要執行下列指令:

    # cd /where/ever/you/want/to/extract/it/
    # ctm -e '^lib/libc/Makefile' ~ctm/src-xxx.*

對於每個 CTM delta 所指定的檔案而言,-e-x 選項是照命令列所指定的順序來引用的。 CTM 只會對符合所有 -e-x 選項的檔案起作用。

19.3.2.7. CTM 的未來

有很多計畫:

  • 在 CTM 系統中加入一些認證資訊,以防被人偽造 CTM 昇級檔。

  • 簡化 CTM 的選項, 它們現在是太令人困惑而又不直覺了。

但是有一個壞消息,那就是我太忙了, 所以如果有任何人想要幫我做到這些工作都是十分歡迎的。 而且也請不要忘了告訴我您還想要什麼...

19.3.2.8. 雜項

所有被 ``DES 出口限制'' 所影響的程式都不在 CTM 的範圍之內。您只可能得到 ``國際版'' 的程式而已。 很多使用者都對這個感興趣的話,我們可能會考慮設一個 sec-cur 系列。 另外也有一個系列是關於 ports 的, 但是似乎沒什麼人感興趣。如果您認為應該要有一個 email list 是專門放這個的,請通知我一聲,我們會考慮的。

19.3.2.9. Thanks!

Bruce Evans

感謝他的生花妙筆和無價的批評。

Søren Schmidt

感謝他的耐心。

Stephen McKay

十分感謝他寫了 ctm_[rs]mail

Jordan K. Hubbard

感謝他的堅持,所以我才能做得更好。

All the users

希望你們都會喜歡這篇文章...

19.3.3. CVSup

Contributed by John Polstra .

19.3.3.1. Introduction

CVSup 是一套可以從遠端伺服器的主 CVS repository 中散佈和昇級 source tree 的軟體。 FreeBSD 的 sources 就是存在一臺位於加州的中央發展機器的 CVS repository 上。FreeBSD 的使用者可以利用 CVSup 很輕易地使他們自己的 source trees 保持在最新版本。

CVSup 用的是一種叫做 pull 的昇級模型。在這個模型裡, 當使用者需要的時候,就向伺服器發出要求昇級的訊息。 伺服端被動地等待使用者提出昇級要求。 如此一來所有的昇級動作都是由使用者來發動。 伺服器從不主動提出昇級。使用者必須手動執行 CVSup 程式來昇級或是利用 cron 來讓它定時自動執行。

CVSup 這個字代表的是整個軟體套件。 它的主要成份是一支執行在使用者機器上叫做 cvsup 的程式,另一支是執行在 FreeBSD mirror 站臺上的 cvsupd 伺服器程式。

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

19.3.3.2. 安裝

如果您用的是 FreeBSD 2.2 或是以後的系統,要安裝 CVSup 最簡單的方法就是用 FreeBSD ports collection 裡的 the port,或是對應的 可執行檔 packages,全靠您自己決定。

如果您用的是 FreeBSD-2.1.6 或是 2.1.7,很不幸地您不能直接使用可執行檔 packages,因為它用到的 C 函式庫版本在 FreeBSD 2.1.{6,7} 時尚未出現。 您可以使用 the port,就像在 FreeBSD 2.2 一樣。只要把 tar 檔給 unpack 開,切換到 cvsup 的子目錄裡然後鍵入 make install

因為 CVSup 是用 Modula-3 寫的,不管您是用 port 或是用 package 來安裝, 都必須安裝 Modula-3 的執行時期函式庫。 您可以在 lang/modula-3-lib port and the lang/modula-3-lib-3.6 找到 package。如果您照著上面的步驟安裝 cvsup, 這些函式庫將會在您安裝 CVSup 時自動安裝好。

Modula-3 的函式庫很大, 不管是要取得或是要編譯都不是件簡單的工作。 因為如此,所以我們提供了第三個選擇。 您可以在美國的站臺上取得 靜態連結 好的 FreeBSD 可執行檔:

您也可以在世界各地的 FreeBSD FTP mirror 站臺 找到它們。

大多數的使用者只會用到客戶端程式。這些執行檔都是可以獨立運作的, 可以在 FreeBSD-2.1.0 到 FreeBSD-current 的任何一個版本的機器上執行。

總結來說,您有下列方法來安裝 CVSup:

  • FreeBSD-2.2 or later: 靜態連結的可執行檔, port, 或是 package

  • FreeBSD-2.1.6, 2.1.7: 靜態連結的可執行檔或是 port

  • FreeBSD-2.1.5 or earlier: 靜態連結的可執行檔

19.3.3.3. CVSup 設定

CVSup 的操作是靠設定一種叫做 supfile 的檔案來達成的。 從 FreeBSD-2.2 開始,在 /usr/share/examples/cvsup 目錄下就有很多 supfile 的範例了。如果您使用的是 2.2 以前的系統, 您也可以在 ftp://ftp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/src/share/examples/cvsup/ 下找到這些範例。

supfile 檔裡有關 cvsup 的資訊包括了:

在下面的幾節裡,我們將會藉著回答這些問題來建立一個典型的 supfile 。首先,我們先來看看 supfile 的整體架構。

supfile 是一個文字檔。 從 # 一直到該行末都會被視為是註解。 空行或者是只有註解的那幾行將會跳過。

剩下來的每一行都描述了一組使用者想得到的檔案。 這幾行都是用 ``collection'' 為開頭, 是伺服器為一組邏輯上相關的檔案所作的定義。 collection 的名字就是告訴伺服器到底您要的是那些檔案。 在 collection 名之後可能會出現一個以上以空白隔開的欄位。 這些欄位就回答了上面所述的問題。欄位可以分成兩類: 旗標欄位以及值欄位。旗標欄位的內容是一個獨立存在的關鍵字, 例如 delete 或是 compress。 值欄位的內容是由一個關鍵字帶頭,後接不以空白隔開的 = 以及其值。例如 release=cvs 就是一個值欄位。

通常一個 supfile 會指定接收不止一個 collection。一個作法是明確地指出每個 collection 的相關欄位。 但是這麼一來會讓每一行變得太長,而且很不方便, 因為所有 collection 相對應欄位的值都差不多。 CVSup 因此提供了一個預設值的機制來避免這個問題。以特殊虛擬 *default 為開頭的每一行都會被視為是為後面的 collection 設定旗標和預設值。它也允許您為了某個 collection 來改變預設值,只要您在該 collection 中自行設定即可。 您也可以靠著在 supfile 的中間設定 *default 來改變或增加預設值。

有了這樣的背景認識之後,我們現在就要開始為了接收以及更新 FreeBSD-current 的主 source tree 來建立一個 supfile 了。

  • 您想取得那些檔案?

    所有可以透過 CVSup 取得的檔案都被分成幾個有名字的 ``collections''。 這裡 描述了所有可以取得的 collections。在這個例子中,我們想要取得 FreeBSD 系統的主 source tree。有一個叫做 src-all 的巨大 collection 包含了除了有出口限制的編碼程式以外的所有東西。 在這個例子中我們假設我們處在美國或加拿大。因此,我們可以用 cvs-crypto 這個額外的 collection 來取得這些編碼程式。建立這個 supfile 的第一步就是把我們想要的 collections 一行一行地列出來:

        src-all
        cvs-crypto
  • 您想取得什麼版本?

    基本上您可以藉著 CVSup 取得任何一個曾經存在過的版本的程式。這是因為 cvsupd 的伺服器是直接和 CVS repository 做溝通,而 CVS repository 又保存有所有版本的程式的關係。 您可以藉由設定 tag= 以及 date= 這兩個值欄位來指定您要的版本。

    Warning您要仔細地檢查 tag= 欄位是不是設對了。有的標籤只對某些 collection 來說是正確的。 如果您指定錯標籤或是拼錯字了,CVSup 可能會把一些您不想刪掉的檔案給刪除。特別注意的是,對於 ports-* collections 您 只能 使用 tag=.

    tag= 欄位是在 repository 裡建立一個符號標籤。事實上有兩種標籤,版本標籤以及分支標籤。 版本標籤指的是某個特定的版本。 它所代表的意義不管什麼時候都是相同的。在另一方面, 支標籤不管在什麼時候指的都是某個發展線的最新版。 因為分支標籤並沒有指定某個特定版本, 它在明天所代表的意義和今天可能不同。

    下面是一些使用者可能感興趣的分支標籤:

    tag=.

    主發展線,也叫 FreeBSD-current。

    Note: . 並不是一個標點符號; 它是標籤的名字。對任何 collection 都是合法。

    RELENG_3

    FreeBSD-3.x 發展線,也叫 FreeBSD-stable。 對 ports-* collections 而言是不合法的。

    RELENG_2_2

    FreeBSD-2.2.x 發展線,也叫 2.2-stable。 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_1_0

    FreeBSD-2.1.x 發展線 - 這個分支已經不再使用了。 對 ports-* collections 而言是不合法的。

    下面是一些使用者可能感興趣的版本標籤:

    tag=RELENG_3_2_0_RELEASE

    FreeBSD-3.2. 對 ports-* collections 而言是不合法的。

    tag=RELENG_3_1_0_RELEASE

    FreeBSD-3.1. 對 ports-* collections 而言是不合法的。

    tag=RELENG_3_0_0_RELEASE

    FreeBSD-3.0. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_2_8_RELEASE

    FreeBSD-2.2.8. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_2_7_RELEASE

    FreeBSD-2.2.7. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_2_6_RELEASE

    FreeBSD-2.2.6. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_2_5_RELEASE

    FreeBSD-2.2.5. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_2_2_RELEASE

    FreeBSD-2.2.2. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_2_1_RELEASE

    FreeBSD-2.2.1. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_2_0_RELEASE

    FreeBSD-2.2.0. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_1_7_RELEASE

    FreeBSD-2.1.7. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_1_6_1_RELEASE

    FreeBSD-2.1.6.1. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_1_6_RELEASE

    FreeBSD-2.1.6. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_1_5_RELEASE

    FreeBSD-2.1.5. 對 ports-* collections 而言是不合法的。

    tag=RELENG_2_1_0_RELEASE

    FreeBSD-2.1.0. 對 ports-* collections 而言是不合法的。

    Warning在鍵入標籤名的時候要特別小心一定要跟上面的一樣。 CVSup 無法分辨一個標籤是合法或是不合法。如果您把標籤名給拼錯了, CVSup 會認為您指定了一個沒有任何檔案的標籤。 因此它就會把您所有已存在的 source 給刪掉。

    當您指定了一個分支標籤後, 通常您會收到該發展線最新版的檔案。如果您想拿舊版的, 可以藉由指定 date= 這個值欄位來達成。 cvsup(1) 的使用手冊裡有提到該如何做。

    對我們的範例而言,我們希望取得 FreeBSD-current。 我們把下面這一行加在 supfile 的最前面:

        *default tag=.

    如果您又沒指定 tag= 又沒指定 date= ,則會產生一個很重要的特例。 在這個情況之下,您將會從伺服器的 CVS repository 取得真正的 RCS 檔而非某個特定版本。開發人員一般而言比較喜歡這種操作模式。 藉由在他們自己的機器上維護一份 repository, 他們可以瀏覽整個版本歷史,也可以檢視檔案過去的版本。 但是要做到這個所要付出的龐大代價就是磁碟空間。

  • 您想從什麼地方取得這些東西?

    我們用 host= 欄位來通知 cvsup 程式要去那裡取得這些昇級檔。 這個欄位可以填上任何一個 CVSup mirror 站臺 的位址,您可以選一個離您最近的。 在這個範例裡,我們使用 FreeBSD 的主站臺 cvsup666.FreeBSD.org

        *default host=cvsup666.FreeBSD.org

    您也可以在執行 cvsup 時用命令列參數 -h hostname 來覆蓋這個設定。

  • 您想把這些東西放在您自己機器上的什麼地方?

    prefix= 欄位告訴 cvsup 要把它收到的檔案存放在那裡。在這個範例裡面, 我們將會把 source 檔直接放在我們的主 source tree /usr/src 下面。src 這個目錄是在 collections 定義中隱含的,所以正確的宣告應該是:

        *default prefix=/usr
  • 您想把您的狀態檔放在那裡?

    cvsup 客戶端程式會在 ``base'' 目錄下維護一份狀態檔。 這個檔可以藉由記錄到底您已經做了那些昇級動作來加速 CVSup 的效率。 我們使用標準 base 目錄 /usr/local/etc/cvsup

        *default base=/usr/local/etc/cvsup

    如果沒有在 supfile 中特別指定的話, 這個設定是預設值,所以事實上我們並不需要寫上面那行。

    如果您的 base 目錄不存在的話,現在就是建立的好時機。 cvsup 程式在 base 目錄不存在的情況下是不會動作的。

  • supfile 雜項設定:

    通常我們還會在 supfile 中多加一行:

        *default release=cvs delete use-rel-suffix compress

    release=cvs 命令伺服器從 FreeBSD 的主 CVS repository 取得資訊。通常的情況都是如此, 但是除了我們討論的這些範圍之外還是有其他的選擇。

    delete 給了 CVSup 可以刪檔的權限。 您最好每次都這麼指定,這樣 CVSup 才能保證您的 source tree 能夠完整昇級。 CVSup 會非常小心地只刪除必要的檔案。 您自己加進的任何檔案都不會被動到。

    use-rel-suffix 是一個 ... 神祕的選項。 如果您真的想要知道它是做什麼用的,請看 cvsup(1) 的使用手冊。不然的話,就直接設定下去,不要管他。

    compress 可以啟動傳輸時的 gzip 壓縮模式。如果您的網路連線是 T1 或是以上的高速, 或許您不必用到壓縮功能。它對傳輸的幫助是很大的。

  • 把這些設定全放在一起:

    下面就是我們這個範例的完整 supfile

        *default tag=.
        *default host=cvsup666.FreeBSD.org
        *default prefix=/usr
        *default base=/usr/local/etc/cvsup
        *default release=cvs delete use-rel-suffix compress
        
        src-all
        cvs-crypto

19.3.3.4. 執行 CVSup

現在您可以試著開始昇級了。執行的指令十分簡單:

    # cvsup supfile

此處 supfile 指的當然就是您剛建立的 supfile。假設您正在 X11 下, cvsup 會開啟一個 GUI 視窗,上面有一些日常工作的按鍵。按下 ``go'' 按鍵,然後看它執行。

因為在這個範例裡面您必須昇級您的 /usr/src 目錄,所以您必須用 root 的身份來執行這個程式, 不然 cvsup 就沒有足夠的權限。 在您剛把設定檔寫好,而且之前又沒有執行過這支程式的時候, 第一次執行可能會讓您有點緊張。有一個可以不修改您檔案的簡單測試法。 在別的地方建一個空目錄,把它當成命令列的額外參數:

    # mkdir /var/tmp/dest
    # cvsup supfile /var/tmp/dest

您所指定的目錄就會變成這次昇級的目的目錄。 CVSup 會檢查您 /usr/src 裡的檔案, 但是並不會修改會是刪除它們。任何該被修改的檔案都會轉而放在 /var/tmp/dest/usr/srcCVSup 也不會去動到 base 目錄裡的狀態檔。新版的檔案都會被寫在您所指定的目錄中。 只要您有 /usr/src 的讀取權限, 在執行這個操作時就不須要變成 root。

如果您不是在 X11 下,或是您不想使用 GUIs,您必須在使用 cvsup 時在命令列加入下列選項:

    # cvsup -g -L 2 supfile

-g 選項是叫 cvsup 不要使用 GUI。 如果您不是使用 X11 的話這個選項會自動執行, 不然的話您必須指定它。

-L 2 叫 cvsup 詳細地印出昇級時更動到了那些檔案。 有三個層次可以選擇,從 -L 0-L 2"。預設值是 0,表示除了錯誤訊息以外不印出任何東西。

還有很多選項可以指定。只要輸入 cvsup -H 就可以看到簡單的列表。如果想要了解更詳細的內容,請看使用手冊。

一旦您對這個執行模式感到滿意,您可以安排使用 cron(8) 來讓 cvsup 自動執行。顯然在用 cron 跑 cvsup 時您不能讓它使用它的 GUI。

19.3.3.5. CVSup File Collections

透過 CVSup 可以取得的檔案 collections 是階層式管理的。有一些大的 collections, 它們也會分成小一點的 sub-collections。取得大 collection 跟取得它的每一個 sub-collections 是一樣的。collections 之間的階層關係可以從下表的縮排中看出來。

最常用的 collections 是 src-allcvs-crypto、還有 ports-all。 其他的 collections 通常只有某些小團體為了某些特殊原因才會去使用, 有一些 mirror 站臺可能也沒有這些 collections。

cvs-all release=cvs

FreeBSD 的主 CVS repository, 除了出口限制的編碼程式以外。

distrib release=cvs

有關 FreeBSD 散佈和 mirror 的檔案。

doc-all release=cvs

FreeBSD 使用手冊和其他文件的原始檔。

ports-all release=cvs

FreeBSD 的 ports collection.

ports-archivers release=cvs

壓縮相關的程式。

ports-astro release=cvs

天文相關的程式。

ports-audio release=cvs

聲音相關的程式。

ports-base release=cvs

/usr/ports 目錄下無法分類的檔案。

ports-benchmarks release=cvs

測試用程式。

ports-biology release=cvs

生物相關的程式。

ports-cad release=cvs

電腦輔助設計。

ports-chinese release=cvs

中文支援。

ports-comms release=cvs

通訊軟體。

ports-converters release=cvs

字碼轉換相關的程式。

ports-databases release=cvs

資料庫。

ports-deskutils release=cvs

在電腦發明前常放在桌面上的工具。

ports-devel release=cvs

發展工具。

ports-editors release=cvs

編輯器。

ports-emulators release=cvs

其他作業系統的模擬器。

ports-games release=cvs

遊戲。

ports-german release=cvs

德文支援。

ports-graphics release=cvs

繪圖工具。

ports-japanese release=cvs

日文支援。

ports-korean release=cvs

韓文支援。

ports-lang release=cvs

程式語言。

ports-mail release=cvs

郵件軟體。

ports-math release=cvs

數學計算軟體。

ports-mbone release=cvs

MBone 應用程式。

ports-misc release=cvs

無法分類的工具。

ports-net release=cvs

網路軟體。

ports-news release=cvs

USENET 新聞軟體。

ports-palm release=cvs

3Com Palm(tm) 系列的軟體支援。

ports-plan9 release=cvs

Plan9 來的程式。

ports-print release=cvs

列印軟體。

ports-russian release=cvs

俄文支援。

ports-security release=cvs

系統安全工具。

ports-shells release=cvs

命令列 shell。

ports-sysutils release=cvs

系統工具。

ports-textproc release=cvs

文字處理工具 (不包括桌上排版系統)。

ports-vietnamese release=cvs

越南文支援。

ports-www release=cvs

WWW 相關軟體。

ports-x11 release=cvs

支援 X 視窗的 ports。

ports-x11-clocks release=cvs

X11 上的時鐘。

ports-x11-fm release=cvs

X11 上的檔案管理程式。

ports-x11-fonts release=cvs

X11 上的字型和字型工具。

ports-x11-toolkits release=cvs

X11 發展工具。

ports-x11-wm

X11 視窗管理程式。

src-all release=cvs

FreeBSD 的主程式,除了出口限制的編碼程式以外。

src-base release=cvs

/usr/src 裡無法分類的檔案。

src-bin release=cvs

單使用者模式下可能會用到的使用者工具程式。 (/usr/src/bin)

src-contrib release=cvs

FreeBSD 計畫之外的工具程式和函式庫, 幾乎未加更動就拿來使用。 (/usr/src/contrib)

src-etc release=cvs

系統設定檔。 (/usr/src/etc)

src-games release=cvs

遊戲。 (/usr/src/games)

src-gnu release=cvs

GNU Public License 下的工具程式。 (/usr/src/gnu)

src-include release=cvs

標頭檔。 (/usr/src/include)

src-kerberosIV release=cvs

KerberosIV 系統安全套件。 (/usr/src/kerberosIV)

src-lib release=cvs

函式庫。 (/usr/src/lib)

src-libexec release=cvs

通常由其他程式來執行的系統程式。 (/usr/src/libexec)

src-release release=cvs

製作 FreeBSD release 的相關檔案。 (/usr/src/release)

src-sbin release=cvs

單使用者模式下的系統工具。 (/usr/src/sbin)

src-share release=cvs

可以跨系統分享的檔案。 (/usr/src/share)

src-sys release=cvs

kernel 程式。 (/usr/src/sys)

src-tools release=cvs

維護 FreeBSD 的工具程式。 (/usr/src/tools)

src-usrbin release=cvs

使用者工具程式。 (/usr/src/usr.bin)

src-usrsbin release=cvs

系統工具程式。 (/usr/src/usr.sbin)

www release=cvs

WWW 資料的原始檔。

cvs-crypto release=cvs

出口限制的編碼程式。

src-crypto release=cvs

FreeBSD 計畫之外的出口限制工具程式和函式庫, 幾乎未加更動就拿來使用。 (/usr/src/crypto)

src-eBones release=cvs

Kerberos 和 DES。 (/usr/src/eBones)

src-secure release=cvs

DES。 (/usr/src/secure)

distrib release=self

CVSup 伺服器的設定檔。CVSup mirror 站臺可以使用。

gnats release=current

GNATS 問題追蹤系統資料庫。

mail-archive release=current

FreeBSD mailing list 存檔。

www release=current

安裝好的 WWW 資料。WWW mirror 站臺可以使用。

19.3.3.6. 公告,問題,以及錯誤回報

For the CVSup FAQ and other information about CVSup, see The CVSup Home Page.

大多數 FreeBSD 相關的 CVSup 討論都在 FreeBSD technical discussions mailing list 上進行。新版軟體會在那邊公告,同時也會在 FreeBSD announcements mailing list 公告。

任何問題和錯誤回報請給程式作者