2008年9月3日 星期三

談談FreeBSD如何更新系統

用FreeBSD很久了,深深感覺到它的功能強大,但是同時也需要有一台強大一點的機器來跑,用起來才比較爽,因為有些東西還是自己用ports編譯比較有彈性阿
要了解怎麼升級,主要有兩個部分,一個是world , kernel,也就是FreeBSD系統本身,稱為src tree,另外一個部分就是3rd party的東西了,這些東西稱為ports tree
所謂的world就是指整個系統,如內建的指令,內建的service等等,除了kernel以外的東西,而kernel也就是核心,是負責讓world來跟電腦的硬體溝通的程式,用途是跟linux的核心是一樣的

在談怎麼更新系統之前要先了解cvs這個概念,所謂的cvs就是一個功能強大的版本控制系統,可以讓程式開發專案的團隊成員,將新的程式碼加入就有程式碼中,並產生差異報告,也能夠將程式還原到某一個階段的狀態,還可以分權限控管每個成員對特定程式碼的權限,所以是個很受歡迎的功能,很多free software的專案都是用這個方式來開發,而每一個程式碼都會有一個自己的cvs id,用來在系統中辨認特定的程式碼,每個patch也會有一個cvs id,用來組合成新的程式碼,而新的程式碼也會有一個新的cvs id,以此類推
了解了這個之後,再來看src tree , ports tree這兩個,src tree放在/usr/src/裡面,ports tree在/usr/ports/,這兩個目錄裡面的每一個檔案都是一個程式碼,也都有自己的cvs id
系統升級就是從cvs server上抓新版本的程式碼到自己的系統裡面,而以前的話是用cvsup這個程式(需要從ports安裝),或是用make update這個指令,現在的系統內建了一個csup這個指令,只要指定好相對應的系統版本就可以將src tree , ports tree更新到想要的版本,我個人建議就用內建的csup就好

再來談FreeBSD的版本有哪些,目前有這幾種,current , stable , release
current就是還在開發中的,每天都會有新的程式碼加入world , kernel中,會是production release的下一版,也就是還在開發中的版本,通常都是心臟很強的系統管理者在用的,或是有在開發world , kernel的core team成員在用的版本,不保證功能都會正常,也不保證穩定性,這邊指的版本是大的版本編號,例如從7到8這樣的大版號跳躍
release顧名思義就是發行版,release只要發行了之後,程式碼就不會再做更動了,只會有安全性修正的patch會加進來,比較適合做為server用途,追求穩定的時候就適合使用release版搭配security patch
stable並不是所謂的穩定版,它只是目前的release版本到下一個release版本之間的版本,每天都會有新功能加進來,不過和current比起來,算是比較穩定的,下一個release版本的新功能會在stable先做測試,新功能測試的差不多之後就會變成新的release,適合喜歡用新功能,可是又怕不穩的人,或是自己的工作站,自己的desktop這類的用途,這邊指的版本是小的版本編號,例如從7.0到7.1這樣的小版號跳躍

目前系統是哪個版本,跟想要升級到哪個版本會影響csup所使用的設定檔內容

再來談csup用的設定檔,這部分可以看/usr/share/example/cvsup/,有些東西就不用看了,只要看兩個就可以了ports-supfile , stable-sufile
這兩個檔案的內容很類似,所以只要看懂一個就可以了,重要的是這些
# IMPORTANT: Change the next line to use one of the CVSup mirror sites
# listed at http://www.freebsd.org/doc/handbook/mirrors.html.
*default host=CHANGE_THIS.FreeBSD.org (指定使用哪一台cvs server)
*default base=/var/db (指定存放資料庫的位置,真正的位置在/var/db/sup/)
*default prefix=/usr (指定位置,預設值就可以了)
*default release=cvs tag=. (ports只有一種版本,就是current)
*default delete use-rel-suffix
ports-all (指定是更新ports tree)
src-all (指定是更新src tree)

我自己用的ports tree更新設定檔,指定使用cvsup3.tw.FreeBSD.org這台cvsup server來更新,預設更新所有的ports tree
# Defaults that apply to all the collections
#
# IMPORTANT: Change the next line to use one of the CVSup mirror sites
# listed at http://www.freebsd.org/doc/handbook/mirrors.html.
*default host=cvsup3.tw.FreeBSD.org
*default base=/var/db
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix

# If you seem to be limited by CPU rather than network or disk bandwidth, try
# commenting out the following line. (Normally, today's CPUs are fast enough
# that you want to run compression.)
*default compress

## Ports Collection.
#
# The easiest way to get the ports tree is to use the "ports-all"
# mega-collection. It includes all of the individual "ports-*"
# collections,
ports-all

我自己使用的src tree更新設定檔,也是使用cvsup3.tw.FreeBSD.org來更新,然後因為我安裝的系統是7.0,我也不打算每天讓電腦都在編譯新程式,所以只採用release版的security patch,所以只有指定*default release=cvs tag=RELENG_7_0這個參數
這個參數要注意的是tag=RELENG_7表示使用FreeBSD 7 stable這個src tree來更新,tag=.表示使用current,心臟很強的話就用這個
哪天7.1出來了,要升級到7.1的話就改成tag=RELENG_7_1這樣就可以了
# IMPORTANT: Change the next line to use one of the CVSup mirror sites
# listed at http://www.freebsd.org/doc/handbook/mirrors.html.
*default host=cvsup3.tw.FreeBSD.org
#*default host=cvsup.tw.FreeBSD.org
*default base=/var/db
*default prefix=/usr
# The following line is for 6-stable. If you want 5-stable, 4-stable,
# 3-stable, or 2.2-stable, change to "RELENG_5", "RELENG_4", "RELENG_3",
# or "RELENG_2_2" respectively.
*default release=cvs tag=RELENG_7_0
#*default release=cvs tag=RELENG_6
*default delete use-rel-suffix

# If you seem to be limited by CPU rather than network or disk bandwidth, try
# commenting out the following line. (Normally, today's CPUs are fast enough
# that you want to run compression.)
*default compress

## Main Source Tree.
#
# The easiest way to get the main source tree is to use the "src-all"
# mega-collection. It includes all of the individual "src-*" collections.
# Please note: If you want to track -STABLE, leave this uncommented.
src-all

這些都改好之後就用指令csup yourcvsupfile就可以更新了
csup會抓/var/db/sup/ports-all/ , /var/db/sup/src-all/ 這兩個目錄裡面的資料來跟cvs server上的cvs id做比對,然後判斷哪個檔案要下載新版本,哪個檔案要刪除,讓src tree , ports tree保持跟cvs server上的版本相同
ports tree的話是看/var/db/sup/ports-all/checkouts.cvs:.這個檔案裡面的資料來比對
src tree的話是看/var/db/sup/src-all/checkouts.cvs:RELENG_7_0
這裡可以看到 :後面會接著目前系統上的src tree , ports tree是對哪個版本作更新
檔案內容大概是這樣
F 5 1220288153
D src
C src/COPYRIGHT,v RELENG_7_0 . 2#871#110#12038331945#207473#444 1.8.4.1 2008.01.
c src/CVS-INFO,v RELENG_7_0 . 2#871#19#8562516724#55803#444
c src/HW.TROUBLE,v RELENG_7_0 . 2#871#19#8203481294#30043#444
C src/LOCKS,v RELENG_7_0 . 2#871#110#12126956594#28593#444 1.3 2006.01.13.06.51.
C src/MAINTAINERS,v RELENG_7_0 . 2#871#110#12127882325#589763#444 1.145 2007.05.
C src/Makefile,v RELENG_7_0 . 2#871#110#12198661956#3101063#444 1.341.2.1 2007.1
c src/Makefile.alpha,v RELENG_7_0 . 2#871#19#9033105495#346543#444

D src這個表示/usr/src/這個目錄
C /src/COPYRIGHT,這個表示/usr/src/COPYRIGHT這個檔案,還有他的版本,以及cvs id

src tree更新好之後一定要看的文件是/usr/src/UPDATING,裡面會說明更新了些甚麼,如果要真的升級的話需要做些甚麼事前準備,怎麼升級,這些都會在這個檔案裡面說明
如果是要上security patch,傳統上是這樣做
cd /usr/src/
csup yourcvsupfile
make buildworld
make buildkernel KERNCONF=kernelconffile
重新開機到single user模式
mount -a
cd /usr/src/
make installkernel KERNCONF=kernelconffile
make installworld
重新開機,確定能夠正常開機之後用uname -a檢查系統版本有沒有升級,如果是上7.0 release的security patch的話,會看到像是這樣的版本編號
FreeBSD freebsd.damon.tw 7.0-RELEASE-p3 FreeBSD 7.0-RELEASE-p3 #5: Mon Jul 14 14:21:23 CST 2008 root@freebsd.damon.tw:/usr/obj/usr/src/sys/GENERIC amd64
那個7.0-RELEASE-p3的p3就表示是第3個security patch

另一個更新workd , kernel的方法是用freebsd-update這個指令,可以直接抓binary格式的更新檔來安裝
設定檔在/etc/freebsd-update.conf,基本上設定檔都用預設值就可以了
要升級security patch的話下
freebsd-update fetch
freebsd-update install
一切順利的話,重新開機之後就是上好patch的版本了
要升級到下一版也可以,下
freebsd-update -r 7.1-RELEASE fetch
freebsd-update -r 7.1-RELEASE install
重開機之後就是新版了

另外如果是ports tree的話就是要先從ports tree裡面安裝portupgrade了
portupgrade是用來處理用ports安裝的軟體的升級問題的,這裡就沒有甚麼所謂的security patch版本的東西了,所有有安全性問題的版本,就是直接升級到沒有問題的那一版,所以可能會直接跳到最新的版本,當然有時候可能會有一些問題
cd /usr/ports/ports-mgmt/portupgrade-devel
make install clean
rehash
這樣就安裝好了
安裝好之後
cd /usr/ports/
make fetchindex
cd /var/db/pkg/
portupgrade -a
至於詳細的用法,可以參考man portupgrade裡面的說明

1 則留言:

  1. Thanks for your help, your article help me a lots.

    回覆刪除