FreeBSD連載(62):升級系統

2000年1月3日 13:55 王波

升級系統

  通過CD-Rom或Internet能夠很方便的獲得FreeBSD的新版本,由於每一次版本升級都修正了原 有版本中存在的問題,並增加了一些新特性。因此保持系統與最新版本相一致是十分有益的事情。

  升級核心的最直接想法是直接編譯新核心,可以將新版本的核心展開到系統中的目錄中,然後按照前面的步驟編譯安 裝新核心。這個方法在同一版本分支中作子版本的升級十分方便,例如從FreeBSD 2.2.7release升級到 2.2.8release。如果要從2.2.x版本升級到3.x版本,由於升級了主版本號,基本系統有了較大改動,因 此不僅要升級核心,還需要升級系統中的應用程序。此時一般應使用sysinstall中的Upgrade選項進行升級 。

  • 使用源碼升級系統

  除了使用sysinstall直接升級之外,另一種升級方法是從系統的原始碼中升級系統。這要安裝要 升級版本的全部源碼,從而能重新編譯整個系統,包括系統核心和各個應用程序。可以通過下面的辦法 手工安裝系統源碼。

# cd /cdrom/src
# ./install.sh

  重新編譯整個系統是一個漫長的時間,根據使用的系統硬體不同,將需要幾個小時的時間或更長 時間來完成這個任務。這個編譯命令被稱為 “make world” ,表示重新編譯構建整個FreeBSD系統。

# cd /usr/src
# make world

  如果是從2.2版本或3.0-release升級到3.1-stable,那麼直接這樣make world會遇到問題。主要 原因是3.0-stable之後,系統的執行檔案格式從原有的a.out轉向了ELF(3.0-release的執行檔案雖然是 ELF格式的,但其核心還保持a.out格式)。make world就提示用戶使用make upgrade進行升級,因此使 用者就應該按照make world的提示進行操作:

# make upgrade

  其他的make目標有:

  buildworld:編譯所有的原始碼﹔

  installworld:安裝buildworld編譯產生的結果﹔

  world:執行buildworld和installworld,重新編譯安裝整個系統﹔

  aout-to-elf-build:編譯從aout到elf升級系統所需的原始碼﹔

  aout-to-elf-install:在aout-to-elf-build的基礎上升級系統﹔

  aout-to-elf:依賴於aout-to-elf-build和aout-to-elf-install,進行a.out系統到elf系統的升級轉換﹔

  update:進行系統升級,對於3.1-stable來講即包括aout-to-elf﹔

  reinstall:在以前已經編譯好的基礎上,不重新編譯而再次安裝編譯產生的結果﹔

  當使用原始碼的方式重新編譯系統時,由於需要使用編譯工具和這些工具的預設設置,這些工具就需要預先更新。編 譯工具一般不需要升級,但編譯工具的設置常常需要更新。當更新所有的原始碼時,就不存在這個問題,但如果只是更新部分 原始碼,就會出現這個問題。如果不打算更新所有的原始碼,可以通過預安裝的一個很小的系統升級軟體包來解決編譯工具設 置更新問題。例如需要更新Ports Collectin,但不打算更新全部原始碼(從3.1-release升級到 3.1-stable),就需要安裝31Upgrade.tgz。

  • 使用CVSup維護系統源碼

  FreeBSD的原始碼可以從安裝介質上或從網路上下載得到。然而FreeBSD的開發是非常活躍的,系統更 新速度相當迅速,只有通過網路更新,才能保持原始碼和其他FreeBSD使用者和開發者一致。但如果每次系統更新都從 網路下載全部原始碼,不僅浪費了網路帶寬,而且也沒有必要,因為系統中的絕大部分代碼並不會更新,每次系統升級更新的 只是其中很小的一部分。FreeBSD的全部原始碼相當大,尤其對於慢速Internet連接的使用者,下載一次並不 是一件簡單的任務。所以需要一種方法,使用戶每次都只需要下載原始碼的更改部分。

  軟體開發中的版本維護工具是一種維護同一個軟體的不同版本的方法,程序員可以通過這個工具同時維護不同的軟體 版本。但雖然版本維護工具同時維護多個版本,但並不是將這些版本都獨立保存一份,而只是保存一個基本版本及其他版本與 它的差異。因此,基於這種版本維護工具的方式,FreeBSD就提供了更新部分原始碼的方法,使得用戶每次只需要下載 更改過數據,這樣使用者就能通過Internet與FreeBSD原始碼樹保持一致,保持最新版本的原始碼,並節約了 網路帶寬。

  為了維護FreeBSD的原始碼樹,需要一個版本控制軟體包CVSup和用於維護原始碼的300M硬碟空間。

  FreeBSD的所有原始碼本來就是通過CVS(Concurrent Versions System)版 本維護系統進行維護的,所有的使用者都能讀取同樣的原始碼,但只有FreeBSD的開發者能夠更改這些原始碼,這樣就 保持了FreeBSD原始碼的一致性。

  為了使用CVSup,首先要安裝這個應用軟體。這個軟體被收錄在Packages Collection中, 因此安裝非常容易。可以使用pkg_add來完成這個任務:

# pkg_add cvsup-bin-16.0.tar.gz

  安裝好CVSup軟體之後,下一步就是配置一個配置檔案,告訴cvsup從哪個伺服器上同步原始碼樹, 以及同步哪些原始碼。在安裝CVSup的時候,還將安裝cvsup的配置檔案例子到/usr/share/examples/cvsup 目錄下。

$ ls /usr/share/examples/cvsup
README           ports-supfile           secure-supfile
cvs-supfile      secure-cvs-supfile      stable-supfile
gnats-supfile    secure-stable-supfile   standard-supfile

  這個目錄下的每個檔案都用於一個特定目的,用來同步某個原始碼樹。其中standard-supfile用於 同步FreeBSD -current分支的原始碼樹,stable-supfile用於同步FreeBSD -stable分支的原始碼樹, ports-supfile用於同步Ports Collection的原始碼,等等。通常這些例子檔案中需要修改的只是需要連接 的cvsup伺服器的名字,例如一個用於同步3.1-stable的配置檔案supfile如下,這個檔案是根據stable-supfile 生成的,僅僅修改了host的設置,以指向正確的主機。

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

  配置檔案中使用tag的值用來標識要同步的不同原始碼樹。FreeBSD有多個版本,可以根據使用者的選擇來 獲得不同的版本的原始碼。最常用的原始碼是 -current分支的原始碼和-stable分支的原始碼,通常對於- current分支的原始碼,需要設定 “tag=.” ,而stable分支就要指定版本號,這裡為RELENG_ 3_1(或者使用RELENG_3表示3.x分支中的最新版本)。

  host的值用於指明用於同步原始碼的伺服器的名字,出於速度的考慮,最好使用離用戶最近的CVSup伺服器 。

  base指明用於放置cvsup的狀態檔案的目錄,prefix指明用於放最終的原始碼檔案的目錄。由於最終 的原始碼和cvsup均要占用大量的磁碟空間,因此需要注意為其留下足夠的空間。

  release指明原始碼樹是使用cvs進行版本維護的,後面為從伺服器上傳輸原始碼及處理本地檔案時使用的 參數。

  src-all用於同步所有的原始碼,為了節約磁碟空間和同步時間,可以只同步部分原始碼。配置檔案中給出了 同步部分原始碼的配置情況,但被注釋了。需要使用#符號將src-all注釋掉,指明其他要同步的原始碼,如port s-all。

  如果這個配置檔案名為stable-supfile,那麼就能使用下列命令啟動cvsup:

# cvsup -L2 stable-supfile

  參數-L2標識使用第2級記錄方式在螢幕上打印出cvsup同步原始碼的同步過程,如果系統位於防火牆內, 會需要-P m參數以使用被動方式越過防火牆。

# cvsup -P m stable-supfile

  cvsup可以在X Window下運行,此時它使用圖形界面。

  通常對於不太經常更新系統的管理員來講,手工啟動cvsup來更新系統原始碼就夠用了,如果要經常更新 原始碼,就需要將cvsup命令放入crontab中執行。

  除了cvsup,FreeBSD也可以通過Email來提供原始碼同步,這種方式稱為CTM,與cvsup不同在於,cvsup 必須由本地系統啟動以從遠端下載,CTM是由遠端伺服器發送回來的。CTM對於網路連接比較慢,或只能通過Email 訪問Internet的系統最方便,對於與Internet直接相連的系統,一般不需要使用CTM。

  由於使用了cvsup,所有的FreeBSD用戶和開發者都能訪問同一個原始碼樹,這樣就維護了系統的一致性, 就使得只存在一個單一的FreeBSD系統,不致造成不同的版本混亂。