[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

我需要建立一個自設的內核

英文版本由 RalphAngenendt 建立。現在由 AlanBartlettAkemiYagi 維護。

為 CentOS 建立自設的內核有兩個方法:第一個是利用加了自設選項的 CentOS 源代碼;另一個是利用來自 Linux Kernel Archive的主流內核源代碼。

這份教學文檔教授如何利用你自己的選項或改動,配合 CentOS 的源代碼來建立一個內核。它主要是針對 CentOS-7 而寫成。

(如果你希望建立一個主流的內核,切勿依照 How To Compile A Kernel 內的指引。這個網站不被認可,因為它不安全地教導以 root 建立內核,方法本身就有毛病。詳細理由請參閱 Building Source RPM as non-root under CentOS。建立主流內核的一個良好參考指南是 Linux Kernel in a Nutshell 這本書。)

這些行動都只供你個人使用。開發小組並不支援自設的內核,因為他們無法控制你的編譯環境、選取項目等。如果你選擇建立自設的內核,當有安全性更新、新發行、或任何須要進行維護的情況出現,你要獨力肩負起這個責任。


ArtWork/WikiDesign/icon-admonition-info.png

註:如果想看一個自設內核的實例,請下載 centosplus 內核的 srpm 套件。譬如說,你可在 這裡 找到屬於 CentOS-7 的套件 。

1. 編譯前的準備

要成功地建立一個內核,你須要安裝下列套件:

當上述 yum 指令執行時,請留意有否套件被排除。假若 yum 設定檔內存有任何內核及相關套件的 exclude 項目,它們亦必須被刪除。縱使 CentOS 計劃普遍不鼓勵採用這類 exclude 規限,某些發行商不允許用戶自行修改的內核在他們的環境上運行。有關這個主題的詳盡資料,請參閱 不健全的虛擬伺服器這篇 CentOS wiki 文章的第三節。請注意,為不想損失的內容建立最新及已測試的備份永遠是個明智的做法。

如果你想加入任何內核的修正,請於現在複製它們到你的 ~/rpmbuild/SOURCES/ 目錄內。

2. 設定內核

ArtWork/WikiDesign/icon-admonition-info.png

如果你不打算修改發行內核的設定檔,你可以忽略這部份(CentOS-7)。

請進到 ~/rpmbuild/BUILD/kernel-*/linux-*/ 目錄,然後選擇複製 configs/ 目錄內的設定檔或 /boot/ 目錄內的現有內核設定檔,並命名為 .config

請參考下面的範例:

[user@host]$ cd ~/rpmbuild/BUILD/kernel-*/linux-*/

你可選用 —

[user@host]$ cp configs/kernel-3.10.0-`uname -m`.config .config

— 或 —

[user@host]$ cp /boot/config-`uname -r` .config

註:包圍 uname-muname-r 的字符是反引號,不是引號。

首先執行 make oldconfig。現在你應該執行 make menuconfigmake gconfigmake xconfig 來自訂內核的設定。當你完成後,請記得儲存你的改動。

ArtWork/WikiDesign/icon-admonition-info.png

如果你安裝了整個內核的源代碼來建立一個內核模塊,你應該在這裡停手。請你現在便參考「建立你自己的內核模塊」教學文檔。

接著,在你將設定檔複製回 configs/ 目錄前,請先將註釋了的硬件平台(相等於 uname -i 指令的輸出)的一行加在設定檔的頂部。在 64 位元架構上這是 x86_64。這個字串必須以 # 符號來註釋,而且必需是檔案的頭一行。請留意 # 符號與硬件平台的描述中間必須有一個空格。

請在 .config 檔案的頂部加入以下一行:

# x86_64

現在將 .config 檔複製回 configs/ 目錄內。這基本上與先前的複製指令剛剛相反:

[user@host]$ cp .config configs/kernel-3.10.0-`uname -m`.config

註:包圍 uname-m 的字符是反引號,不是引號。

最後一步就是將 configs/ 目錄內的所有內容複製到 ~/rpmbuild/SOURCES/ 目錄內。

[user@host]$ cp configs/* ~/rpmbuild/SOURCES

3. 內核的 ABI

CentOS 內核的其中一個特色就是它的應用程式二進制介面(ABI)會在整個產品生效期內保持一樣。ABI 維持不變的好處,就是外置的內核模塊在建立時不必與內核版本掛鈎 —— 因此它們不必在新內核發行時被重新建立。這是追踪 ABI 內核模塊套件的基礎 —— 它們可以提供更新的驅動程式及其它檔案系統等支援。

為了維繫 ABI 的一致性,原先的內核的 ABI 會被記錄及儲存在一個檔案內。這個檔案會在建立每個新內核時用來檢查 kABI。如果新的內核被設定或修改至一個地步令它的 ABI 與先前的有差別,編譯將會失敗,並且會有信息表示 kABI 的一致性已被破壞。這時,內核建立者有兩個選擇:(一)重新設定新的內核,讓它的 ABI 與原有的能互相吻合,因而可繼續享受一致 ABI 所提供的好處;(二)在建立的過程中停止檢查 kABI。在這兩個選擇之間,前者較為可取,但有時後者是唯一可行的方法。

要停止檢查內核的 ABI,你只須在 rpmbuild 指令行上加入一個選項及它的參數:

--without kabichk

4. 更改內核的 spec 檔案

ArtWork/WikiDesign/icon-admonition-info.png

這個部份所提及的行數只對應現有 CentOS 內核的 spec 檔案。

現在請更改內核的 spec 檔案。

[user@host]$ cd ~/rpmbuild/SPECS
[user@host SPECS]$ cp kernel.spec kernel.spec.distro
[user@host SPECS]$ vi kernel.spec

在第 8 行,buildid 的定義本來是一個註釋。

它必須被取消註釋及賦予一個數值,好避免與你現時安裝了的內核互相抵觸。這將這行更改如下列樣子般:

%define buildid .your_identifier

ArtWork/WikiDesign/icon-admonition-info.png

"%" 與 "define" 這個字之間不可以有空格。

假若你有任何修正,你必須在兩個地方提及它們。如果你沒有任何修正,請跳至「修正部份到此為止」後面那一行。

首先,找尋含有 # empty final patch to facilitate testing of kernel patches 的那一行。緊接著該行,請以 40000 這數目開始加入你的申報,以免你的修正與 RHEL/CentOS 的內核修正產生衝突。例如:

Patch40000: my-custom-kernel.patch

接著,找尋含有 ApplyOptionalPatch linux-kernel-test.patch 的那一行。在該行之上加入一行來應用你的修正。例如:

ApplyOptionalPatch my-custom-kernel.patch

修正部份到此為止。

請把此行:

cp $RPM_SOURCE_DIR/config-* .

改為

cp $RPM_SOURCE_DIR/kernel-*.config .

5. 編譯新內核

開始編譯:

[user@host SPECS]$ rpmbuild -bb --target=`uname -m` kernel.spec 2> build-err.log | tee build-out.log

註:包圍 uname-m 的字符是反引號,不是引號。

你可以透過 --with 及/或 --without 這些選項及相關的引數在 rpmbuild 指令內加入一些有用的選項。值得留意的主要選項包括:

--with baseonly
--without up
--without debug
--without debuginfo
--without kabichk

舉個例說,單要建立基本內核套件,請使用:

--with baseonly --without debug --without debuginfo

6. 安裝新內核

當編譯完成後,你的自設內核的 rpm 檔案可以在用戶的 ~/rpmbuild/RPMS/`uname -m`/ 目錄內找到。請以 root 身份,利用 yum 指令或 rpm 指令作行安裝。

註:包圍 uname-muname-r 的字符是反引號,不是引號。

譬如說,以 root 的身份(見 如何成為 root 用戶)進入 ~user/rpmbuild/RPMS/`uname -m`/ 目錄。然後執行以下指令:

若要安裝所有 kernel-* 套件,執行:

[root@host]# yum localinstall kernel-*.rpm

你亦可採用 rpm 指令:

[root@host]# rpm -ivh kernel-*.rpm

6.1. 利用 yum 指令

要安裝所有 kernel-* 套件,請以 root 身份執行 yum localinstall kernel-*.rpm 這個指令。

6.2. 利用 rpm 指令

當你利用 rpm 指令來安裝 kernel-* 套件時,請留意 kernel 及 kernel-devel 必須透過 rpm -ivh 這個指令來安裝,而不是更新。註:如果你建立了一個內核比現時安裝的版本還要舊,你還須要在 rpm 指令裡使用 --oldpackage 這個選項。

無論如何,切勿使用 rpm -Uvh 這個指令來安裝你的 kernel 套件,因為這樣做會更新(取替)你現時安裝了的版本。假如你自設的內核有問題,你將會無法返回原先能正常運作的版本。

kernel 及 kernel-devel 以外的套件都必須利用 rpm -Uvh 這個指令來安裝(更新)。請留意 -i(安裝)及 -U(更新)這兩個選項之間分別。

Translation of revision 203


2023-09-11 07:23