23.5. 從原始碼更新 FreeBSD

從編譯原始碼來更新 FreeBSD 比起用 Binary 更新有幾項優點,在編譯程式碼時可以自訂選項來充分運用特定硬體,部份基礎系統可以使用非預設的設定值編譯,或是在不需要或不想要的時候跳過編譯。使用編譯的程序來更新系統比起安裝 Binary 來更新會耗時許多,但能夠完整自訂一個量身定做版本的 FreeBSD。

23.5.1. 快速開始

這是從原始碼編譯來更新 FreeBSD 的標準步驟快速的參考,稍後的章節會更詳細的說明這個程序。

  • 更新並編譯

    # svn update /usr/src  1
    check /usr/src/UPDATING  2
    # cd /usr/src          3
    # make -j4 buildworld  4
    # make -j4 kernel      5
    # shutdown -r now      6
    # cd /usr/src          7
    # make installworld    8
    # mergemaster -Ui      9
    # shutdown -r now      10

    1

    取得最新版本的原始碼,請參考 節 23.5.3, “更新原始碼” 來了解更多取得與更新原始碼的資訊。

    2

    檢查 /usr/src/UPDATING 看是否有任後在原始碼編譯之前或之後需要手動操作的步驟。

    3

    前往原始碼目錄。

    4

    編譯世界 (World),即除了核心 (Kernel) 外的所有東西。

    5

    編譯並安裝核心,此動作等同於 make buildkernel installkernel

    6

    重新啟動系統以使用新的核心。

    7

    前往原始碼目錄。

    8

    安裝世界。

    9

    更新與合併在 /etc/ 中的設定檔案。

    10

    重新啟動系統以使用新編譯好的世界與核心。

23.5.2. 準備原始碼更新

閱讀 /usr/src/UPDATING,從原始碼編譯之前與之後任何需要手動操作步驟會在此檔案中說明。

23.5.3. 更新原始碼

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) 原始碼。

表格 23.1. FreeBSD 版本與檔案庫路徑
uname -r 的輸出結果檔案庫路徑說明
X.Y-RELEASEbase/releng/X.Y發佈版本加上關鍵的安全性與錯誤修正,較建議大多數使用者使用這個分支。
X.Y-STABLEbase/stable/X

發佈版本加上所有在該分支上其他開發中的程式,STABLE 代表不會更改應用程式 Binary 介面 (Applications Binary Interface, ABI),所以在先前版本所編譯的軟體仍可以正常運作,舉例來說,被編譯在 FreeBSD 10.1 可執行的軟體在編譯完 FreeBSD 10-STABLE 之後仍可以執行。

STABLE 分支偶爾也會有錯誤或無法相容的問題會影響使用者,雖然這些問題通常會很快的被修正。

X-CURRENTbase/head/最新未發佈的 FreeBSD 開發版本,CURRENT 分支可能會有重大錯誤或不相容的問題,只建議進階的使用者使用。

查看 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  1
# svn checkout https://svn.freebsd.org/base/releng/10.3 /usr/src  2

1

將舊的目錄移到其他地方,若沒有在這個目錄做過任何本地修改,可直接刪除這個目錄。

2

將從 表格 23.1, “FreeBSD 版本與檔案庫路徑” 查到的路徑加到檔案庫 URL 之後。第三個參數用來存放本地系統原始碼的目標目錄。

23.5.4. 從原始碼編譯

編譯世界 (world) 即編譯整個作業系統除了核心 (Kernel),要先做這個動作以便提供最新的工具來編譯核心,接著便可編譯核心:

# cd /usr/src
# make buildworld
# make buildkernel

編譯完的程式會寫入至 /usr/obj

以上這些均為基本的步驟,用來控制編譯的其他選項在以下章節會說明。

23.5.4.1. 執行清除編譯

部份 FreeBSD 編譯系統版本會保留先前編譯的程式於暫存的物件目錄 /usr/obj,避免重新編譯那些尚未更動過的程式碼可加速後續的編譯動作,若要強制重新編譯所有東西可在開始編譯前使用 cleanworld

# make cleanworld

23.5.4.2. 設定工作數量

在多核處理器上增加編譯工作的數量可增加編譯速度,可使用 sysctl hw.ncpu 來查看有多少核心,不同處理器使用不同版本的 FreeBSD 編譯系統,所以唯一能了解不同工作數量對編譯速度影響的方式便是測試。在一開始可考慮選擇一個介於 1/2 到 2 倍核心數之間的數值,工作的數量可使用 -j 來指定。

範例 23.1. 增加編譯工作數

使用四個工作來編譯世界與核心:

# make -j4 buildworld buildkernel

23.5.4.3. 只編譯核心

若原始碼有更動,便須執行 buildworld,完成之後,便可隨時執行 buildkernel 來編譯核心,若要只編譯核心可:

# cd /usr/src
# make buildkernel

23.5.4.4. 編譯自訂核心

標準的 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

23.5.5. 安裝編譯好的程式

在完成 buildworldbuildkernel 兩個步驟之後,便可安裝新的核心與世界:

# 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

23.5.6. 完成更新

還有最後一些的工作要做來完成更新,任何修改過的設定檔要與新版本的設定檔合併、移除找到的過時程式庫,然後重新啟動系統。

23.5.6.1. 使用 mergemaster(8) 合併設定檔案

mergemaster(8) 可簡單的將修改過的系統設定檔與新版設定檔合併。

使用 -Uimergemaster(8) 會自動更新那些未被使用者修改過的設定檔並安裝尚不存在的檔案:

# mergemaster -Ui

若檔案需要手動合併,會有互動式介面可讓使用者選擇要保留那一邊的檔案,請參考 mergemaster(8) 取得更多資訊。

23.5.6.2. 檢查過時的檔案與程式庫

部份廢棄的檔案或目錄可以在更新之後保留,可使用以下指令找出這些檔案:

# make check-old

並用以下指令刪除:

# make delete-old

部份廢棄的程式庫也可以保留下來,可使用以下指令來偵測這些程式庫:

# make check-old-libs

並使用以下指令刪除

# make delete-old-libs

那些仍使用舊程式庫的程式將在刪除程式庫之後無法正常運作,而這些程式須要在刪除舊程式庫之後重新編譯或更換。

提示:

當確認所有舊檔案或目錄可安全的刪除時,要避免刪除每一個檔案時均需按下 yEnter 鍵可在指令設定 BATCH_DELETE_OLD_FILES,例如:

# make BATCH_DELETE_OLD_FILES=yes delete-old-libs

23.5.6.3. 更新後重新啟動

更新之後的最後一個步驟便是重新啟動電腦,來讓所有的變更生效:

# shutdown -r now

本文及其他文件,可由此下載: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢 <questions@FreeBSD.org>。

關於本文件的問題,請洽詢 <doc@FreeBSD.org>。