[Power by FreeBSD]
顏國雄 2001/11 初
系統升級 make world
2004/07/15 修改 

FreeBSD 一直持續的在發展,如果想要和最新的版本同步,FreeBSD 有一套很簡單的機置讓我們輕鬆地把系統所需的程式原始碼抓回來,經過編譯及安裝後就可以將系統整個更新,需要的只是磁碟空間和等待的時間而已。

更新成最新版一定會最好嗎?!我覺得系統跑得穩和安全應該是比較重要,最好在更新完原始碼 (/usr/src) 後先注意更版的說明,並且先在測試的機器上測試一陣子後再決定是否要將所有 Servers 更新。相關的更版說明文件可以參考:

  • /usr/src/UPDATING
  • http://people.freebsd.org/~bmah/relnotes/

當我們在 /usr/src 中執行完 make world ,並且順利安裝完後,會更新 /bin , /sbin , /stand , /boot 和 /usr ( /usr/local 下的除外 ) ,簡單的說:就是當初我們用光碟剛裝好的那些東西。

以目前的 4.x版 (Stable) 來說,在開始進行之前要先確認一下:/usr/src 和 /usr/obj 兩個目錄所在的 partition 至少有 800 MB 以上的剩餘空間,不然就得將 /usr/src , /usr/obj 以 soft link 的方法連結到空間比較大的地方。

1 更新系統的步驟

一般,我們要更新 FreeBSD 的系統時可能要經過底下的幾個過程:

  • 取得最新的原始碼 ( CVSup / CVS / CTM )
  • 編譯所有的系統程式 ( make buildworld )
  • 編譯新的系統核心 ( make buildkernel
  • 安裝新的系統核心 ( make installkernel )
  • 安裝新的系統程式 ( make installworld )
  • 更新系統設定檔 ( mergemaster )

2 取得最新的原始碼

FreeBSD 提供 CVSup,CVS,CTM 三種方式來透過網路更新整個系統的原始碼,如果網路的頻寬夠的話可以使用 cvsup 來更新,反之,如果是使用低速的網路則建議使用 CTM 的方式,下面我們來看看如何以 cvsup 來取得最新的原始碼。

2-1 首次更新

當我們透過 cvsup 來更新原始碼時它會去比對有哪些檔案該更新,然後再由所指定的 CVSup 主機抓回新檔案放入指定的目錄中,透過這種方式可以讓我們的 source tree 和 FreeBSD 開發小組的 source 達到同步。因此,當我們第一次更新時如果能有一個起始版本的 source 就可以不用每一個檔案都上網抓,首先利用光碟將 src 目錄的系統原始碼先安裝到 /usr/src 中,接著當然要安裝 cvsup 這個工具囉!

2-1-1 以光碟安裝 source

第一次使用 cvsup 更新 /usr/src 時,我們可以利用安裝光碟,先將現有的完整 source 解開放到 /usr/src 中,先將安裝光碟置入光碟機中,然後執行底下的指令來安裝:


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

註:如果喜歡用 /stand/sysinstall 則是選 Configure → Distributions → src → All。

2-1-2 安裝 cvsup 工具

安裝 cvsup client 端的工具最簡單的方法當然是透過網路以 packages 的方式安裝,所以我們可以執行以下指令來安裝 cvsup-without-gui:


# pkg_add -v ftp://ftp.tku.edu.tw/OS/FreeBSD/packages/packages-stable/Latest/cvsup-without-gui.tgz

2-2 修改 cvsup 的設定

當我們在執行 cvsup 時,後面會接一個 cvsup 的設定檔 (supfile),利用這個檔案,我們可以控制:

  • 要更新的版本 (tag)。
  • 去哪台 cvsup 主機下載檔案 (host)。
  • 存放在我們系統中的什麼地方 (prefix)。
  • 更新狀態記錄檔放在哪裡 (base)。
  • 抓哪些原始碼。

在 /usr/share/examples/cvsup 中有幾個範本檔,一般使用者常用的是下面三個:

  • stable-supfile (更新 stable 版的 /usr/src)。
  • ports-supfile (更新 /usr/ports)。
  • standard-supfile (更新 current 版的 /usr/src)。

而修改 cvsup 設定的方法則有兩種方式,我們可以依個人喜好選擇一種即可。

2-2-1 方法一

本方式是將 FreeBSD 所提供的範本另外存檔以後,將所需修改的設定直接改掉,要使用 cvsup 更新時,就執行 cvsup supfile (下面的例子應該執行 cvsup /usr/local/etc/stable-supfile) 來更新,底下是修改設定檔的步驟:


# cp /usr/share/examples/cvsup/stable-supfile /usr/local/etc
# ee /usr/local/etc/stable-supfile

然後,修改 CVSup 的服務主機網址,先找到下面這行

*default host=CHANGE_THIS.FreeBSD.org

將它改為:


*default host=cvsup.tw.FreeBSD.org

cvsup.tw.FreeBSD.org 位於交大資工,如果將 cvsup 後面再加上數字可以找到其它 mirrors,例如: cvsup8.tw.FreeBSD.org 在淡江大學,cvsup13.tw.freebsd.org 則在 freebsd.giga.net.tw,設定時以網路最近的為原則,可以由 FreeBSD 的 handbook 中找到主機清單:

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/cvsup.html#CVSUP-MIRRORS

如果需要修改想要同步的 FreeBSD 版本則再修改下面這行中 tag 的部份:


*default release=cvs tag=RELENG_4

tag=RELENG_4 是更新為 FreeBSD 4.x 的最新版,也就是目前的 FreeBSD-STABLE

至於有哪些 TAG 可用我們可以參考 FreeBSD handbook 中的附錄:

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/cvs-tags.html

如果都修改好了,就按 Esc Enter Enter 存檔。

 

2-2-2 方法二

本方式是修改 /etc/make.conf ,在裡面指定要使用的 cvsup 主機及要使用的 cvsupfile 範本......,要進行更新時則是進入放 source 的目錄 (/usr/src) ,然後執行 make update。注意:如果有需要修改 supfile 中的版本 tag ,或是想修改要抓取的 source 內容,則必須使用方法一,修改並使用自訂的 supfile。

下面是想在 /usr/src 中直接執行 make update 來更新 source,要進行的修改:


ee /etc/make.conf

然後在裡面加入:


KERNCONF=MYBSD
SUP_UPDATE= yes
SUP= /usr/local/bin/cvsup
SUPHOST= cvsup.tw.FreeBSD.org
SUPFILE= /usr/share/examples/cvsup/stable-supfile

說明:

  • KERNCONF:用來指定預設要編譯的核心設定檔名稱,如果設了 KERNCONF=MYBSD ,以後執行 make buildkernel 和 make buildkernel KERNCONF=MYBSD 是一樣的意思。
  • SUP_UPDATE:這個參數如果設為 yes 我們才可以用 make update 來自動呼叫 cvsup 更新。
  • SUP:指定 cvsup 的程式路徑。
  • SUPHOST:指定 cvsup 的主機網址。
  • SUPFILE:指定使用哪一個 supfile 範本。
    如果要更新的是 /usr/ports 中的 ports tree ,想用 make update 來更新,則可加入下面這行:
    PORTSSUPFILE= /usr/src/share/examples/cvsup/ports-supfile

都修改好了就按 Esc Enter Enter 存檔,存好檔後就可切換到 source 的目錄中執行 make update 來取得新的原始碼囉!

 

2-3 抓取原始碼

2-3-1 方法一:直接執行 cvsup 更新 source

如果前面修改設定的部份是採用方法一,我們就執行以下指令來更新程式碼:


# /usr/local/bin/cvsup /usr/local/etc/stable-supfile

執行後應該會有類似下面的畫面:


cvsup /usr/local/etc/stable-supfile
Connected to cvsup.tw.FreeBSD.org
Updating collection src-all/cvs
Checkout src/bin/chio/chio.1
Checkout src/bin/chio/chio.c
......略

2-3-2 方法二:以 make update 來更新 source

如果設定檔的修改是採用方法二,在 /etc/make.conf 中指定 supfile 並設定了 SUP_UPDATE= yes ,我們就執行以下指令來更新:


# cd /usr/src
# make update

執行完,應該會有類似下面的的畫面:


--------------------------------------------------------------
>>> Running /usr/local/bin/cvsup
--------------------------------------------------------------
Parsing supfile "/usr/share/examples/cvsup/stable-supfile"
Connecting to cvsup.tw.FreeBSD.org
Connected to cvsup.tw.FreeBSD.org
Server software version: SNAP_16_1h
Negotiating file attribute support
Exchanging collection information
Establishing passive-mode data connection
Running
Updating collection src-all/cvs
Checkout src/COPYRIGHT
......略

接下來就,嘿∼嘿∼去喝茶休息一下!!

小秘訣:在有防火牆的環境中,必須開放 TCP Port 5999 才可以和 CVSup 主機通訊。

 

3 編譯及安裝

有了完整的原始碼以後,我們就可以準備進行最花時間的編譯和安裝的部份了,如果 source tree 中的檔案都沒有問題,硬體本身也沒問題,我們只要依序執行底下的指令來進行整個系統程式的編譯。

3-1 系統對時

首先,為了避免因為系統時間不準而造成執行 make 時失敗,我們先以 ntpdate 進行網路對時(也可以自行用 date 人工對時):


# ntpdate -s watch.stdtime.gov.tw

3-2 程式編譯

再來就是進行系統程式的編譯及核心的編譯:


# cd /usr/src
# make buildworld
# make buildkernel KERNCONF=MYBSD

make buildworld 會將一些在編譯新核心時所需用到的工具先編譯好,所以,buildworld 和 buildkernel 的順序是不能調換的哦!!

3-3 安裝新核心

如果都順利完成了,我們要先安裝新的核心 (假設自訂的 kernel 設定檔叫 MYBSD ):


# make installkernel KERNCONF=MYBSD

新核心安裝完後,一般會建議先重新啟動,測試一下新核心是否可以使用,所以先執行:


# reboot

3-4 更新系統

如果重新開機後,在新核心中可以維持系統的基本運作 (top , netstat ...... 等指令可能會無法使用),我們就可準備安裝系統中其它東西了,執行:


# make installworld

3-5 更新系統設定

最後一階段主要是要將 /etc 目錄中的檔案做更新 (部份不在 /etc ),請先確定有事先將 /etc 整個備份起來以防萬一哦!我們執行下面的指令進行更新:


# mergemaster

執行上面的指令,mergemaster 會先將新的檔案暫存在 /var/tmp/temproot,接著針對新舊檔案做一分析,例如,/dev/MAKEDEV.local 會有類似下面的畫面


======================================================================

*** Displaying differences between ./dev/MAKEDEV.local and installed version:

--- /dev/MAKEDEV.local Mon Mar 31 08:18:12 2003
+++ ./dev/MAKEDEV.local Fri Jul 16 14:16:09 2004
@@ -31,7 +31,7 @@
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
-# $FreeBSD$
+# $FreeBSD: src/etc/MAKEDEV.local,v 1.3 1999/08/27 23:23:40 peter Exp $
# @(#)MAKEDEV.local 5.1 (Berkeley) 3/22/91
#


Use 'd' to delete the temporary ./dev/MAKEDEV.local
Use 'i' to install the temporary ./dev/MAKEDEV.local
Use 'm' to merge the temporary and installed versions
Use 'v' to view the diff results again

Default is to leave the temporary file to deal with by hand

How should I deal with this? [Leave it for later]


中間有加減符號的部份就是新舊不同的地方,其餘則是一樣的部份,我們可以輸入『 d , i , m , v 』來表示所要採取的動作:

  • d:代表要保留舊的檔案,刪除 source 所提供的那份。
  • i:表示要安裝新的檔案,把舊的覆寫掉。千萬別用這項把 /etc/master.passwd , /etc/group 給換掉了!
  • m:要用合併的方式處理檔案,選擇這項,它會將新舊不同的設定同時顯示在畫面,然後詢問我們要採用左側 (l) 的舊設定,還是要右側 (r) 的新設定。合併完畢再用 i 來安裝成果。
  • v:再看一次新舊差異比較的結果。

到底要採用哪個處理動作要看我們是否有針對檔案改過設定,底下列出較沒爭議的部份:

  • 按 i 安裝新設定者:
    • /dev/*
    • /etc/default/*
    • /etc/gnats/* (如果沒改過這部份)
    • /etc/isdn/* (如果沒改過這部份)
    • /etc/mtree/*
    • /etc/namedb/named.root
    • /etc/periodic/*
    • /etc/ssh/* (如果沒改過這部份)
    • /etc/ssl/* (如果沒改過這部份)
    • /etc/uucp/* (如果沒改過這部份)
    • /etc/protocols
    • /etc/rc*
    • /etc/services
    • /etc/netstart
  • 按 d 刪除者
    • /etc/hosts
    • /etc/hosts.allow
    • /etc/host.conf
    • /etc/hosts.equiv
    • /etc/hosts.lpd
    • /etc/inetd.conf
    • /etc/login.access
    • /etc/login.conf
    • /etc/motd
  • 按 m 合併者
    • /etc/group
    • /etc/master.passwd

如果都處理完,最後會出現幾個問題:

  • Do you wish to delete what is left of /var/tmp/temproot? [no] y

    按 y ,刪除暫存檔。

  • *** You installed a new /dev/MAKEDEV script, so make sure that you run
    'cd /dev && /bin/sh MAKEDEV all' to rebuild your devices

    Would you like to run it now? y or n [n] y

    按 y ,執行 /dev/MAKEDEV

  • *** You installed a new aliases file, so make sure that you run
    '/usr/bin/newaliases' to rebuild your aliases database

    Would you like to run it now? y or n [n] y

    按 y 將 aliases 文字檔轉成資料庫格式。

如果都處理完畢,我們就可準備重新啟動,測試新系統能不能正常運作。如果系統有很大的改變,就要檢查安裝在 /usr/local 中的程式是否需要更新。

 

4 FAQ

4-1 make world 完的東西如何以 NFS 分享給其它機器升級

Server 端:

1.新增或修改 /etc/exports ,裡面加上下面這行


/usr/src   /usr/obj   -ro

2.編寫啟動 nfs 服務的 script

如果想在開機時就啟動 nfs 服務,我們可以在 /etc/rc.conf 中加入一行:


nfs_server_enable="YES"
nfsd_enable="YES"
mountd_enable="YES"

這樣即可由系統在開機時自動啟動 nfs 服務的相關 daemons,不然可以自行編寫下面的啟動服務指令稿,在需要時手動打開服務:


# ee /root/nfs.sh

然後在裡面放入以下的內容:


#!/bin/sh -
if  [  -r  /etc/exports  ] ;  then
  echo -n ' portmap'
  portmap
  echo -n ' mountd'
  mountd -n
  echo -n ' nfsd'
  nfsd -u -t -n 1
  echo -n ' rpc.statd'
  rpc.statd
fi

3.啟動 NFS 服務

如果是修改 /etc/rc.conf 中的 nfs_server_enable="YES" ,系統在開機時會自動啟動 nfs 服務。如果是用前一步驟自己寫的 /root/nfs.sh,我們可以執行:


# sh /root/nfs.sh

4.測試:

執行 showmount -e localhost 應該會看到類似下面的內容


Exports list on localhost:
/usr/src Everyone
/usr/obj Everyone

預備升級的 Client 端

在預備升級的 client 端我們可以執行下面的指令將 nfs server (假設叫 xxx) 提供的 /usr/src 及 /usr/obj mount 到本機的 /usr/src 和 /usr/obj:


# mount   -t   nfs   xxx:/usr/src   /usr/src
# mount   -t   nfs   xxx:/usr/obj   /usr/obj

再來就是進行系統昇級的步驟囉:


cd /usr/src
make   installworld
make   installkernel   KERNCONF=MYBSD
mergemaster

都 OK. 了就將使用完畢的 /usr/src , /usr/obj 卸載:


# cd /
# umount /usr/src
# umount /usr/obj

註:xxx 是 server 的 host name 或是 IP

4-2 make world 的時間要滿久的,如何加快速度

1.編譯系統核心記得加入下面兩選項

options SOFTUPDATES
options UFS_DIRHASH

 還要記得將 /usr/src , /usr/obj 所在的 partition 啟動 softupdate

2.進入 single mode 做編譯可以加快一點,不過效果不顯著啦!

4-3 透過 cvsup 更新 ports tree

1.安裝好 cvsup-withou-gui 的 package。

2.如果 /usr/ports 中沒有東西,以安裝光碟先建立起始版本的 ports tree,在光碟機中置入安裝光碟後,執行:


# mount /cdrom
# mkdir -p /usr/ports
# cd /cdrom/ports
# sh install.sh
# cd /
# umount /cdrom

3.在 /etc/make.conf 放入底下的內容


SUP_UPDATE= yes
SUP= /usr/local/bin/cvsup
SUPHOST= cvsup.tw.FreeBSD.org
PORTSSUPFILE= /usr/share/examples/cvsup/ports-supfile

4.進行更新 ports tree ,執行:


# cd /usr/ports
# make update

4-4 由安全通告得知 FreeBSD 有修補部份漏洞,如何只針對漏洞更新?

假設目前使用的是 FreeBSD 4.9 Release,如果我們在進行 cvsup 時的版本 tag=RELENG_4 ,系統會抓回 FreeBSD 4.x 的最新 source,如果版本差異太大可能連帶要處理不少程式的更新,我們可以用tag=RELENG_4_9 ,這樣只會動到有修正的一些小地方,不至於動到系統架構,這種更新就是所謂的 Security Updates。

4-5 如何由 4.x 昇級為 5.x

首先,我們可以用 /usr/share/examples/cvsup/standard-supfile 為範本,透過 cvsup 取得 FreeBSD 5.x (Current) 的 source,在 /usr/src/UPDATING 中即有說明,大概的流程為:

  • 取得 FreeBSD 5.x 的 source。
  • cd /usr/src
  • make buildworld
  • make buildkernel
  • cp /usr/src/sys/i386/conf/GENERIC.hints /boot/device.hints
  • make installkernel
  • cd /usr/src/sys/boot ; make STRIP="" install
  • reboot (以 single user 模式進入)
  • sh /usr/src/etc/rc.d/preseedrandom
  • mergemaster -p (將新舊密碼檔及群組合併)
  • rm -r /usr/include/g++
  • make installworld
  • mergemaster -i
  • reboot

 


 基礎: 書籤 - 簡介 - 安裝 - Slices - Unix基礎 - 基本指令 - 首次登入 - 目錄架構
 系統: 核心編譯 - 系統升級 - Packages - Ports - PicoBSD - Quota
 網路: 服務管理 - WWW - FTP - MAIL - DNS - Samba - NFS - DHCP - webmin - IMP - OpenWebmail
 其它: Backup - UPS - 系統安全 - ipfw&natd - 撥接服務 - 計時制ADSL - 雜記 - FAQ

北市文山區力行國小顏國雄