23.5. 從原始碼更新 FreeBSD
前一頁 | 章 23. 更新與升級 FreeBSD | 下一頁

## 23.5. 從原始碼更新 FreeBSD

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

### 23.5.1. 快速開始

這是從原始碼編譯來更新 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, “更新原始碼” 來了解更多取得與更新原始碼的資訊。
  | 檢查 `/usr/src/UPDATING` 看是否有任後在原始碼編譯之前或之後需要手動操作的步驟。
  | 前往原始碼目錄。
  | 編譯世界 (World)，即除了核心 (Kernel) 外的所有東西。
  | 編譯並安裝核心，此動作等同於 `make buildkernel installkernel`。
  | 重新啟動系統以使用新的核心。
  | 前往原始碼目錄。
  | 安裝世界。
  | 更新與合併在 `/etc/` 中的設定檔案。
  | 重新啟動系統以使用新編譯好的世界與核心。

### 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`-RELEASE` | `base/releng/``X.Y` | 發佈版本加上關鍵的安全性與錯誤修正，較建議大多數使用者使用這個分支。
``X.Y`-STABLE` | `base/stable/``X` | 發佈版本加上所有在該分支上其他開發中的程式，STABLE 代表不會更改應用程式 Binary 介面 (Applications Binary Interface, ABI)，所以在先前版本所編譯的軟體仍可以正常運作，舉例來說，被編譯在 FreeBSD 10.1 可執行的軟體在編譯完 FreeBSD 10-STABLE 之後仍可以執行。 STABLE 分支偶爾也會有錯誤或無法相容的問題會影響使用者，雖然這些問題通常會很快的被修正。
``X`-CURRENT` | `base/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
    # svn checkout https://svn.freebsd.org/base/releng/10.3 /usr/src

| 將舊的目錄移到其他地方，若沒有在這個目錄做過任何本地修改，可直接刪除這個目錄。
| 將從 表格 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. 安裝編譯好的程式

在完成 `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

### 23.5.6. 完成更新

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

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

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

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

    # mergemaster -Ui

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

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

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

    # 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

#### 23.5.6.3. 更新後重新啟動

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

    # shutdown -r now

前一頁 | 上一層 | 下一頁
23.4. 追蹤開發分支 | 起始頁 | 23.6. 多部機器追蹤

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

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