CVSup 系統更新與升級FreeBSD 4.2-RELEASE CVSup 升級為 FreeBSD 4.6-STABLE
--------------------------------------------------------------------------------
寫在前面
CVSup 是 FreeBSD 系統更新的方法之一。
FreeBSD 安裝完成就做 CVSup ,立即將系統升級更新至最新版本,
然後再安裝其他的應用軟體。
每一位玩 FreeBSD 的人,都應該要玩一下 CVSup 。
定時做,每一週、或是每兩週做一次。
遇有發布重大安全性漏洞時,更應該做 CVSup ,以修補漏洞。
做 CVSup 時,硬碟狀況、剩餘空間的多寡很重要。
做 CVSup 時,在某一環節出現 error 時,通常只要再「從頭」做一次即可。
FreeBSD 的更新非常迅速,以 freebsd.csie.nctu.edu.tw 為例,
於每天 1,5,9,13,17,21 點進行 CVSup 更新動作。
以前沒嘗試過,總認為做 CVSup 是很困難,現在自己學會了,
才發現整個程序其實很簡單,只是每一個程序都比較花時間而已。硬體等級越好,
所需的時間就越短。P-II約3.5小時,P-IV約1.5小時。
將 CVSup 的程序做成批次檔,晚上睡覺前「敲下去」,隔天早上起床後就做好了。
而硬體等級高的,晚飯前敲下去,吃過水果後,大概就好了。
以下操作的網路環境是:HiNet-ADSL 384/56 ,並且會註明每一階段所耗費的時間,
以及更新升級前後的 HD 空間狀況。
--------------------------------------------------------------------------------
備份系統檔案
這兩個檔案一定要備份:
/etc/master.passwd
/etc/group
其他的資料就看個人的需要啦,將 /etc 整個備份下來也好。
--------------------------------------------------------------------------------
檢查HD狀況並修復錯誤
fsck -y
如果 HD 有錯誤訊息,而且無法以 fsck 修復,嗯!我就不知道怎麼辦?重灌嗎!
--------------------------------------------------------------------------------
檢查HD剩餘容量
df -m
依個人的操作經驗, / 要有 50MB 、 /usr 要有 1G 以上的空間,比較妥當。
--------------------------------------------------------------------------------
建立相關的 gid,uid
pw groupadd -n sshd -g 22
pw groupadd -n smmsp -g 25
pw groupadd -n mailnull -g 26
pw useradd -n sshd -g sshd -u 22 -m -d /var/empty -s /sbin/nologin -c "Secure Shell Daemon"
pw useradd -n smmsp -g smmsp -u 25 -m -d /var/spool/clientmqueue -s /sbin/nologin -c "Sendmail Submission User"
pw useradd -n mailnull -g mailnull -u 26 -m -d /var/spool/mqueue -s /sbin/nologin -c "Sendmail Default User"
4.6 的系統中分別有 sshd smmsp mailnull 的 uid,gid ,要先手動建立。
若未先行建立之,更新時可能會有 error 。
記得將 master.passwd group 兩個檔案備份起來。
--------------------------------------------------------------------------------
安裝 CVSup 的工具程式
使用 packages pkg_add -v ftp://freebsd.csie.nctu.edu.tw/pub/CVSup/cvsup-without-gui-16.1f.tgz
pkg_add -v ftp://ftp.tw.freebsd.org/pub/i386/packages/packages-4-stable/All/cvsup-without-gui-16.1f.tgz
建議您一定要親至 CVSup 的站台去看看有沒有更新版本的升級工具軟體。
任選一個站台來源來安裝即可。
使用 PORTS cd /usr/ports/net/cvsup-without-gui ; make install clean distclean
--------------------------------------------------------------------------------
抓取 CVSup 設定檔
cd /usr/src
fetch ftp://freebsd.csie.nctu.edu.tw/pub/CVSup/cvsupfile-stable
sync;sync;sync
--------------------------------------------------------------------------------
更新 Source 的檔案
/usr/local/bin/cvsup /usr/src/cvsupfile-stable
Connected to cvsup.tw.freebsd.org.
Updating collection src-all/cvs
Checkout src/sys/i386/conf/GENERIC
Finished successfully
( 01:10:00 )
--------------------------------------------------------------------------------
編譯所有的系統程式
make buildworld
--------------------------------------------------------------
>>> Rebuilding the temporary build tree
--------------------------------------------------------------
rm -rf /usr/obj/usr/src/i386
mkdir -p /usr/obj/usr/src/i386/usr/bin
mkdir -p /usr/obj/usr/src/i386/usr/lib/compat/aout
mkdir -p /usr/obj/usr/src/i386/usr/games
mkdir -p /usr/obj/usr/src/i386/usr/libdata/ldscripts
mkdir -p /usr/obj/usr/src/i386/usr/libexec/elf
.
.(省略)
.
gzip -cn /usr/src/usr.sbin/i4b/man/iwic.4 > iwic.4.gz
===> usr.sbin/boot0cfg
cc -O -pipe -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wno-uninitialized -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow -c /usr/src/usr.sbin/boot0cfg/boot0cfg.c
cc -O -pipe -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wno-uninitialized -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wshadow -o boot0cfg boot0cfg.o
gzip -cn /usr/src/usr.sbin/boot0cfg/boot0cfg.8 > boot0cfg.8.gz
===> etc
===> etc/sendmail
rm -f freebsd.cf
(cd /usr/src/etc/sendmail && m4 -D_CF_DIR_=/usr/src/etc/sendmail/../../contrib/sendmail/cf/ /usr/src/etc/sendmail/../../contrib/sendmail/cf/m4/cf.m4 freebsd.mc) > freebsd.cf
chmod 444 freebsd.cf
( 01:50:00 )
--------------------------------------------------------------------------------
編譯新的核心
make buildkernel KERNCONF=GENERIC
--------------------------------------------------------------
>>> Kernel build for GENERIC started on Wed Aug 21 20:36:05 CST 2002
--------------------------------------------------------------
===> GENERIC
mkdir -p /usr/obj/usr/src/sys
cd /usr/src/sys/i386/conf; PATH=/usr/obj/usr/src/i386/usr/sbin:/usr/obj/usr/src/i386/usr/bin:/usr/obj/usr/src
/i386/usr/games:/sbin:/bin:/usr/sbin:/usr/bin config -d /usr/obj/usr/src/sys/GENERIC GENERIC
Don't forget to do a ``make depend''
Kernel build directory is /usr/obj/usr/src/sys/GENERIC
.
.(省略)
.
cc -O -pipe -D_KERNEL -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -fformat-extensions -ansi -DKLD_MODULE -nostdinc -I- -I. -I@ -I@/../include -mpreferred-stack-boundary=2 -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -fformat-extensions -ansi -c setdef1.c
ld -Bshareable -o if_xe.ko setdef0.o if_xe.kld setdef1.o
--------------------------------------------------------------
>>> Kernel build for GENERIC completed on Wed Aug 21 20:52:25 CST 2002
--------------------------------------------------------------
( 00:15:00 )
此時已經抓回最新的 GENERIC ,如果你曾修改過核心,你應當知道此時最好再確認一遍。
那個「GENERIC」就是核心檔,你的如果有不同,要改一改。
--------------------------------------------------------------------------------
安裝新的核心
make installkernel KERNCONF=GENERIC
cd /usr/obj/usr/src/sys/GENERIC; MAKEOBJDIRPREFIX=/usr/obj MACHINE_ARCH=i386 MACHINE=i386 OBJFORMAT_PATH=/
usr/obj/usr/src/i386/usr/libexec PERL5LIB=/usr/obj/usr/src/i386/usr/libdata/perl/5.00503 GROFF_BIN_PATH=/usr
/obj/usr/src/i386/usr/bin GROFF_FONT_PATH=/usr/obj/usr/src/i386/usr/share/groff_font GROFF_TMAC_PATH=/usr/ob
j/usr/src/i386/usr/share/tmac make KERNEL=kernel install
chflags noschg /kernel
mv /kernel /kernel.old
install -m 555 -o root -g wheel -fschg kernel /kernel
if [ -d /modules -a -n "`ls /modules`" ]; then mkdir -p /modules.old; cp -p /modules/* /modules.old; fi;
cd /usr/src/sys/modules ; env MAKEOBJDIRPREFIX=/usr/obj/usr/src/sys/GENERIC/modules MACHINE=i386 make install
===> accf_data
install -o root -g wheel -m 555 accf_data.ko /modules
===> accf_http
install -o root -g wheel -m 555 accf_http.ko /modules
===> agp
install -o root -g wheel -m 555 agp.ko /modules
.
.(省略)
.
install -o root -g wheel -m 555 svr4.ko /modules
install -o root -g wheel -m 444 svr4.8.gz /usr/share/man/man8
install -o root -g wheel -m 555 /usr/src/sys/modules/svr4/svr4.sh /usr/sbin/svr4
===> vesa
install -o root -g wheel -m 555 vesa.ko /modules
===> wi
install -o root -g wheel -m 555 if_wi.ko /modules
===> xe
install -o root -g wheel -m 555 if_xe.ko /modules
( 00:01:00 )
--------------------------------------------------------------------------------
安裝新的系統程式
make installworld
mkdir -p /tmp/install.53705
for prog in [ awk cat chflags chmod chown date echo egrep find grep ln make makewhatis mtree mv perl pwd_mkdb
rm sed sh sysctl test true uname wc zic; do cp `which $prog` /tmp/install.53705; done
cd /usr/src; MAKEOBJDIRPREFIX=/usr/obj MACHINE_ARCH=i386 MACHINE=i386 OBJFORMAT_PATH=/usr/obj/usr/src/i386/
usr/libexec PERL5LIB=/usr/obj/usr/src/i386/usr/libdata/perl/5.00503 GROFF_BIN_PATH=/usr/obj/usr/src/i386/usr
/bin GROFF_FONT_PATH=/usr/obj/usr/src/i386/usr/share/groff_font GROFF_TMAC_PATH=/usr/obj/usr/src/i386/usr/sh
are/tmac PATH=/usr/obj/usr/src/i386/usr/sbin:/usr/obj/usr/src/i386/usr/bin:/usr/obj/usr/src/i386/usr/games:/t
mp/install.53705 make -f Makefile.inc1 reinstall
--------------------------------------------------------------
>>> Making hierarchy
--------------------------------------------------------------
cd /usr/src; make -f Makefile.inc1 hierarchy
cd /usr/src/etc; make distrib-dirs
.
.(省略)
.
===> etc
===> etc/sendmail
--------------------------------------------------------------
>>> Rebuilding man page indices
--------------------------------------------------------------
cd /usr/src/share/man; make makedb
makewhatis /usr/share/man
makewhatis /usr/share/perl/man
rm -rf /tmp/install.53705
( 00:10:00 )
--------------------------------------------------------------------------------
更新系統設定檔
mergemaster
mergemaster是將方才取回的更新檔案與現有的設定檔做比對,
讓操作者一一決定是否安裝新版的設定檔。
其中有一項是 ./dev/MAKEDEV ,我比較ㄙㄨㄟ,每次裝、每次掛。所以,我就不裝他了。
不過,如果是4.6-RELEASE升級為4.6-STABLE者,則可正常安裝。
除了 master.passwd group aliases 三個檔案延用舊資料外,其他的部份幾乎都裝新的。
如果有個「萬一」,將先前備份的 /etc/master.passwd 及 /etc/group 拷貝回來,
可重建帳號資料:pwd_mkdb -p -d /etc /etc/master.passwd
不要急著重新開機(reboot),此時應再開啟新的登入視窗(login),
如果能成功的login,才可以reboot。
--------------------------------------------------------------------------------
重新開機
sync ; sync ; sync ; reboot
--------------------------------------------------------------------------------
檢查系統版本
uname -a
除了用 uname -a 檢查外,至 4.6.2-RELEASE 為止的 sendmail 是 8.12.3 版,
只要成功升級至 4.6-STABLE 的 sendmail 是 8.12.5 版,只要telnet localhost 25
即可知道。 另外,以非 root 的身份用 mail 指令直接寄信看看。
--------------------------------------------------------------------------------
更新前後 HD 的狀況全部切出一塊 4094MB 來安裝 FreeBSD (Minimal)
初安裝完成的 HD 狀況
df -m
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 125 32 83 28% /
/dev/ad0s1f 251 0 231 0% /tmp
/dev/ad0s1g 2911 78 2600 3% /usr
/dev/ad0s1e 251 0 231 0% /var
procfs 0 0 0 100% /proc
安裝前後 /usr 磁碟空間的比較
CVSup(/bin , /sbin , /stand , /boot 和 /usr )
/dev/ad0s1g 2911 986 1692 37% /usr
再安裝應用軟體
gd2
/dev/ad0s1g 2911 1052 1626 39% /usr
mysql
/dev/ad0s1g 2911 1215 1462 45% /usr
imap
/dev/ad0s1g 2911 1083 1594 40% /usr
apache
/dev/ad0s1g 2911 1103 1575 41% /usr
fastcgi
/dev/ad0s1g 2911 1103 1575 41% /usr
gzip
/dev/ad0s1g 2911 1103 1575 41% /usr
php
/dev/ad0s1g 2911 1120 1558 42% /usr
再裝其他的軟體(wget,sudo,bash2,ncftp3,qpopper,pident)
/dev/ad0s1g 2911 1122 1555 42% /usr
全部安裝完成,最後的 HD 狀況
df -m
Filesystem 1M-blocks Used Avail Capacity Mounted on
/dev/ad0s1a 125 41 73 36% /
/dev/ad0s1f 251 0 231 0% /tmp
/dev/ad0s1g 2911 1116 1562 42% /usr
/dev/ad0s1e 251 0 230 0% /var
procfs 0 0 0 100% /proc
--------------------------------------------------------------------------------
天有不測風雲
4.6-RELEASE釋出之後,做CVSup都很順利。
2002-08-09 這一天晚上做CVSup,mergemaster時有要求是否安裝./dev/MAKEDEV,
而我沒有將它安裝。reboot之後就ping不到主機。
隔天(2002-08-10)特地抽空至主機前一探究竟,發現開機之後停在一個「15秒之後自動reboot」的訊息上。
解套步驟:
使用舊的 kernel 開機:
重新開機(reset)後
Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [kernel] in 10 seconds...
出現上述倒數的訊息時按下空白鍵,出現提示符號後輸入下列兩道指令
unload
boot kernel.old
成功地開機之後,將 CVSup 再從頭到尾徹徹底底做一次。
這一次mergemaster時有安裝./dev/MAKEDEV。
這一回的升級失敗,感覺上是 kernel 的問題。
這一次重新開機就成功了。
--------------------------------------------------------------------------------
相關連結與資源:
http://freebsd.sinica.edu.tw/handbook/synching.html
http://freebsd.sinica.edu.tw/handbook/makeworld.html
http://freebsd.sinica.edu.tw/completed/168.shtml.htm
http://ohaha.ks.edu.tw/upgrade.htm
http://www.lsps.tp.edu.tw/~gsyan/freebsd2001/
http://www.fanqiang.com/a1/b2/20020306/060200121_b.html
--------------------------------------------------------------------------------
本篇文章摘錄自
http://freebsd.lab.mlc.edu.tw/CVSup.htm
躧