2009年9月29日 星期二

cvsup 的原理

cvsup 的原理
轉載

cvsup就是透過比對server , client之間的source code cvs id table來判斷那些檔案需要更新,那些檔案需要修改
FreeBSD怎麼做到比對server , client之間的source code cvs id table?
對於每一台跑FreeBSD的機器而言,會保存一分source code , ports tree的source code cvs id table
這分檔案在那裡呢?

damon[/usr/sup]-damon->ls
ports-all src-all
damon[/usr/sup]-damon->pwd
/usr/sup
在/usr/sup/可以看到兩個目錄ports-all , src-all,這就是每一台cvsup client端所保持的source code cvs id table
而在做cvsup時,首先作的就是比對server , client端之間的source code cvs id table之間的差異而將client端的這分
更新到與server端的同步

在兩邊的source code cvs id table同步之後作的就是將server端較新的部份download到client端了,這時候會透過m3來比對
兩邊檔案的差異而區分成:server端有而client端沒有,server端有而client端比較舊,server端沒有而client端有,server
端與client端都有同樣的source code cvs id table等這幾種狀況

01.server端有而client端沒有:
這時候會將server端新增加的檔案都download回來

02.server端有而client端比較舊
這時候會將client端的檔案更新成與server端同步

03.server端沒有而client端有
這時會將client端的這個檔案刪除

04.server端與client端都有同樣的source code cvs id table
這時不作任何動作

了解了這些之後來看client端的source code cvs id table
damon[/usr/sup/src-all]-damon->cat checkouts.cvs:RELENG_4 | more
C src/COPYRIGHT,v RELENG_4 . 2#871#110#10484502194#88433#444 1.4 99.09.05.21.33.
47 2#871#19#9365672274#47353#644
c src/CVS-INFO,v RELENG_4 . 2#871#19#8562516724#55803#444
c src/HW.TROUBLE,v RELENG_4 . 2#871#19#8203481294#30043#444
c src/MAINTAINERS,v RELENG_4 . 2#871#110#10455268265#181873#444
C src/Makefile,v RELENG_4 . 2#871#110#10484502196#2600413#444 1.234.2.18 2002.07
.25.09.33.13 2#871#110#10275895934#84493#644
由這個表可以很明顯的看出為系統中每一個位於/usr/src/下的檔案作了一分紀錄表,透過比對這個表來做到更新source code tree
的功能,至於每一欄位代表些甚麼,我就不是很清楚了

同樣的再來看給ports tree用的那一分
damon[/usr/sup/ports-all]-damon->cat checkouts.cvs:. | more
F 5 1048597134
D ports
C ports/.cvsignore,v . . 2#871#110#10483097113#8553#444 1.2 97.07.14.21.35.25 2#
871#19#8689161252#193#644
C ports/INDEX,v . . 2#871#110#10485665008#438566043#444 1.372 2003.03.25.04.27.5
4 2#871#110#10485971827#35057713#644
C ports/INDEX-5,v . . 2#871#110#10483097218#108294543#444 1.6 2003.03.16.09.18.2
0 2#871#110#10478262267#36359673#644
C ports/LEGAL,v . . 2#871#110#10483097215#975483#444 1.274 2003.02.19.04.24.53 2
#871#110#10456286935#143603#644

這裡要注意的是,對不同的source code版本作source code更新會產生不同的source code cvs id table,這主要是因為
FreeBSD目前在source code的部份有4.X release , 4.X stable , 5.0 release , 5.0 current這四個主要的版本,
但卻只有一種版本的ports tree,ports tree永遠都是current

先對cvsup有了基本的了解之後,接下來才能了解為甚麼需要作cvsup
01.系統中某個部份發現有安全性的問題,只有在安全性的問題發生的時候才會對5.0 release , 4.7 release這類的版本作檔案的更新
02.更新為stable的版本,基本上stable的版本是每天都在更新的,而且會比release的版本多一些新功能,而當新功能經過一段時間的測
試之後就會推出新的release版本
03.更新ports tree,因為ports tree基本上也是每天都在更新的,而且各種軟體每天都有新的版本會推出,所以也需要更新ports tree
以時候一些ports tree有問題的地方也需要透過cvsup取得新的版本的檔案來修正問題

接下來解讀一下cvsupfile中的一些重要的設定項目,一般而言直接抓cvsupX.tw.freebsd.org上面已經做好的cvsupfile就可以了
fetch cvsup.tw.freebsd.org/pub/CVSup/cvsupfile-stable
mv cvsupfile-stable /usr/src/
fetch cvsup.tw.freebsd.org/pub/CVSup/cvsupfile-ports
mv cvsupfile-ports /usr/ports/
一般來說只需要這兩個檔案就夠了,看一下這兩個檔案中的設定,重要的部份只有兩個,使用那一台主機,抓取那一個版本的source code
or ports tree,其他的選項稍微了解一下就好
*default host=cvsup3.tw.freebsd.org.
這個選項是指定使用那一台主機,在台灣的話cvsup.tw.freebsd.org是在交大,如果這台很忙碌或速度慢的時候1-5看那一台比較快就用那
一台
*default release=cvs tag=RELENG_4
這個選項是指定抓取那一個版本的source code更新
都是用release的話就用tag=RELENG_4_X
都是用stable的話就用tag=RELENG_4
都是用5.0 release的話就用tag=RELENG_5_0
都是用5.0 current的話就用tag=.
需要注意的是ports永遠只有current也就是使用tag=.

個人建議還是把ports , source code所使用的cvsupfile分開
所需要注意的是給ports使用的是ports-all
所需要注意的是給source code使用的是src-all

了解了這些之後需要的就是實際作系統更新的動作了
首先安裝cvsup的工具cvsup-without-gui
cd /usr/ports/net/cvsup-without-gui/
make install clean
rehash
來完成安裝

更新source code tree
cd /usr/src/
cvsup cvsupfile-stable

更新ports tree
cd /usr/ports/
cvsup cvsupfile-ports

重新編譯整個系統
cd /usr/src/
make buildworld;make buildkernel KERNCONF=XXXX;make installkernel KERNCONF=XXXX;make installworld;mergemaster
在編譯的同時,需要注意的是,事先備份/etc/底下的所有設定檔,並將kernel security level關掉或是調整成0,上面這些都完成之後在重
新開機,怎麼修改kernel設定檔,這邊就不說了
mergemaster是將新的設定檔安裝起來的指令,一定要執行,能夠本人到機器前面處理的話盡量不要用遠端處理系統升級,升級期間會有甚麼
問題很難說
重新開機之後一切無誤的話將kernel security level重新打開

系統內建的東西可以藉由上面的程序來升級,利用ports安裝的其他程式可以藉由/usr/ports/sysutils/portupgrade/來升級
需要注意的地方是portupgrade也是有分版本的,要安裝之前一定要先更新ports tree在安裝portsupgrade
如果之前利用ports安裝軟體時有加入特殊參數的話可以在/usr/local/etc/pkgtools.conf中設定每項軟體的安裝參數
內容大概類似這樣
MAKE_ARGS = {
'databases/mysql323-*' => 'WITH_CHARSET=big5 SKIP_INSTALL_DB=yes',
'databases/phpmyadmin' => 'MYADMDIR=www/data/phpMyAdmin',
'www/apache13' => 'WITH_APACHE_SUEXEC=yes',
'www/mod_php4' => 'BATCH=yes PHP4_OPTIONS='+"'"+'\"GD1\" \"zlib\" \"IMAP\" \"MySQL\"'+"'",
'net/samba' => 'BATCH=yes SAMBA_OPTIONS='+"'"+'\"syslog\"'+"'",
}

沒有留言:

張貼留言