從編譯原始碼來更新 FreeBSD 比起用 Binary 更新有幾項優點,在編譯程式碼時可以自訂選項來充分運用特定硬體,部份基礎系統可以使用非預設的設定值編譯,或是在不需要或不想要的時候跳過編譯。使用編譯的程序來更新系統比起安裝 Binary 來更新會耗時許多,但能夠完整自訂一個量身定做版本的 FreeBSD。
這是從原始碼編譯來更新 FreeBSD 的標準步驟快速的參考,稍後的章節會更詳細的說明這個程序。
更新並編譯
#
svn update /usr/src
check /usr/src/UPDATING
#
cd /usr/src
#
make -j4
buildworld
#
make -j4
kernel
#
shutdown -r now
#
cd /usr/src
#
make installworld
#
mergemaster -Ui
#
shutdown -r now

取得最新版本的原始碼,請參考 節 23.5.3, “更新原始碼” 來了解更多取得與更新原始碼的資訊。 | |
檢查 | |
前往原始碼目錄。 | |
編譯世界 (World),即除了核心 (Kernel) 外的所有東西。 | |
編譯並安裝核心,此動作等同於 | |
重新啟動系統以使用新的核心。 | |
前往原始碼目錄。 | |
安裝世界。 | |
更新與合併在 | |
重新啟動系統以使用新編譯好的世界與核心。 |
FreeBSD 的原始碼位於 /usr/src/
,較建議透過 Subversion 版本控制系統來更新這份原始碼,要確認原始碼已在版本控制系統的管控下可:
#
svn info /usr/src
Path: /usr/src
Working Copy Root Path: /usr/src
...
此結果代表 /usr/src/
已在版本控制系統的管控下並且可以使用 svn(1) 來更新:
#
svn update /usr/src
若該目錄最近沒有更新過,可能會需要一些時間來完成更新動作。在更新完成之後,原始碼便為最新版本,並可開始依下一章節的說明來編譯程序。
若輸出結果顯示 '/usr/src' is not a working copy
代表有缺少檔案或原始碼是採用其他方式安裝,若是如此,便需重新取出 (checkout) 原始碼。
查看 FreeBSD 目前使用的版本可使用 uname(1):
#
uname -r
10.3-RELEASE
根據 表格 23.1, “FreeBSD 版本與檔案庫路徑”,要更新 10.3-RELEASE
需使用的原始碼檔案庫路徑為 base/releng/10.3
,在取出 (checkout) 原始碼時便要使用這個路徑:
#
mv /usr/src /usr/src.bak
#
svn checkout https://svn.freebsd.org/base/releng/10.3
/usr/src

將舊的目錄移到其他地方,若沒有在這個目錄做過任何本地修改,可直接刪除這個目錄。 | |
將從 表格 23.1, “FreeBSD 版本與檔案庫路徑” 查到的路徑加到檔案庫 URL 之後。第三個參數用來存放本地系統原始碼的目標目錄。 |
編譯世界 (world) 即編譯整個作業系統除了核心 (Kernel),要先做這個動作以便提供最新的工具來編譯核心,接著便可編譯核心:
#
cd /usr/src
#
make buildworld
#
make buildkernel
編譯完的程式會寫入至 /usr/obj
。
以上這些均為基本的步驟,用來控制編譯的其他選項在以下章節會說明。
部份 FreeBSD 編譯系統版本會保留先前編譯的程式於暫存的物件目錄 /usr/obj
,避免重新編譯那些尚未更動過的程式碼可加速後續的編譯動作,若要強制重新編譯所有東西可在開始編譯前使用 cleanworld
:
#
make cleanworld
在多核處理器上增加編譯工作的數量可增加編譯速度,可使用 sysctl hw.ncpu
來查看有多少核心,不同處理器使用不同版本的 FreeBSD 編譯系統,所以唯一能了解不同工作數量對編譯速度影響的方式便是測試。在一開始可考慮選擇一個介於 1/2 到 2 倍核心數之間的數值,工作的數量可使用 -j
來指定。
若原始碼有更動,便須執行 buildworld
,完成之後,便可隨時執行 buildkernel
來編譯核心,若要只編譯核心可:
#
cd /usr/src
#
make buildkernel
標準的 FreeBSD 核心是以一個名為 GENERIC
的核心設定檔 (Kernel config file)為基礎,GENERIC
核心中內含了所有最常用的裝置驅動程式與選項,有時這個檔案對編譯自訂核心也非常有用,可根據其來加入或移除裝置驅動程式或選項來滿足特定需求。
例如,要開發一個 RAM 受到嚴重限制的小型嵌入式電腦,便可移除不需要的裝置驅動程式或選項來縮小核心。
核心設定檔位於 /usr/src/sys/
,其中使用的 arch
/conf/arch
即為 uname -m
輸出的結果,大部份的電腦為 amd64
,那其設定檔目錄則為 /usr/src/sys/
。amd64
/conf/
/usr/src
可以被刪除或重建,所以較建議將自訂核心設定檔放在另一個目錄,如 /root
,並將核心設定檔以連結放至 conf
目錄,若該目錄被刪除或覆寫,便可重新建立一個新的核心設定的連結。
自訂設定檔可由複製 GENERIC
設定檔來建立,在此範例,新的自訂核心要用在儲存伺服器,所以將其命名為 STORAGESERVER
:
#
cp /usr/src/sys/amd64/conf/GENERIC /root/STORAGESERVER
#
cd /usr/src/sys/amd64/conf
#
ln -s /root/STORAGESERVER .
接著編譯 /root/STORAGESERVER
,要加入或移除裝置或選項可見 config(5)。
自訂核心要在指令列設定 KERNCONF
為核心設定檔來編譯:
#
make buildkernel KERNCONF=STORAGESERVER
在完成 buildworld
與 buildkernel
兩個步驟之後,便可安裝新的核心與世界:
#
cd /usr/src
#
make installkernel
#
shutdown -r now
#
cd /usr/src
#
make installworld
#
shutdown -r now
若使用自訂核心,則同樣須設定 KERNCONF
來使用新的自訂核心:
#
cd /usr/src
#
make installkernel KERNCONF=STORAGESERVER
#
shutdown -r now
#
cd /usr/src
#
make installworld
#
shutdown -r now
還有最後一些的工作要做來完成更新,任何修改過的設定檔要與新版本的設定檔合併、移除找到的過時程式庫,然後重新啟動系統。
mergemaster(8) 可簡單的將修改過的系統設定檔與新版設定檔合併。
使用 -Ui
,mergemaster(8) 會自動更新那些未被使用者修改過的設定檔並安裝尚不存在的檔案:
#
mergemaster -Ui
若檔案需要手動合併,會有互動式介面可讓使用者選擇要保留那一邊的檔案,請參考 mergemaster(8) 取得更多資訊。
部份廢棄的檔案或目錄可以在更新之後保留,可使用以下指令找出這些檔案:
#
make check-old
並用以下指令刪除:
#
make delete-old
部份廢棄的程式庫也可以保留下來,可使用以下指令來偵測這些程式庫:
#
make check-old-libs
並使用以下指令刪除
#
make delete-old-libs
那些仍使用舊程式庫的程式將在刪除程式庫之後無法正常運作,而這些程式須要在刪除舊程式庫之後重新編譯或更換。
當確認所有舊檔案或目錄可安全的刪除時,要避免刪除每一個檔案時均需按下 y 與 Enter 鍵可在指令設定 BATCH_DELETE_OLD_FILES
,例如:
#
make BATCH_DELETE_OLD_FILES=yes delete-old-libs
本文及其他文件,可由此下載: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。
若有 FreeBSD 方面疑問,請先閱讀
FreeBSD 相關文件,如不能解決的話,再洽詢
<questions@FreeBSD.org>。
關於本文件的問題,請洽詢
<doc@FreeBSD.org>。