How-To:Linux 重編系統核心

 

操作環境:

  • Fedora 17

 

Linux kernel 是整個 Linux 作業系統的核心,內含最底層的系統功能與驅動程式支援。基本上對 Linux 的終端使用者而言,核心編譯並不是一個必要的工程,除非使用者真的有需要藉由重新編譯來新增、移除核心功能以解決一些問題,否則大部分的使用者會嘗試去編譯核心純粹是基於技術知識上的練習。

 

無論是解決問題還是純粹練習,以 DR 在討論版上觀察到的現象來說,核心編譯的操作程序最常遭遇的狀況是:從 kernel.org 下載一個版本來用,然後不清楚在設定時到底該勾選哪些選項才能讓核心順利運作,最後編譯出一個不能用的核心……而這事實上是可以避免的。

 

其實除非真的有需要使用最新的核心版本,不然與其從 kernel.org 下載原始碼,比較好的作法會是使用發行版自己修改過的核心原始碼,很多設定都是直接套用好的,只要原本發行版的核心基本運作沒有問題,就表示相同的核心原始碼預設編譯出來也會是可以運作的。如此一來使用者在設定時不用逐一檢查每個選項,只要改動自己想改的部份就可以了。

 

請注意,本文所使用的發行版為 Fedora,以 SRPM 的方式示範核心下載、編譯與安裝流程。因此本文的操作流程可以部份或全部套用在其它同樣以 RPM 作為套件管理工具的發行版,例如 RHELCentOS 和 openSUSE 等。但對於其它非 RPM 的發行版,例如 DebianUbuntu 等,本文就只有概念上的參考價值,因為操作指令是不相同的。

 

另外,如果想要進行的是外部模組(external kernel modules)編譯而不是核心自己的內部模組(internal kernel modules)編譯,那麼並不需要參考以下的流程,因為外部模組編譯並不需要完整的核心原始碼,只要核心的標頭檔和 Makefile 就好,以 Fedora 來說,這些檔案可以經由安裝 kernel-devel 套件來取得。

 

1. 前置作業

先使用 yum 安裝以下套件:

  • sudo yum install hmaccalc xmlto asciidoc elfutils-devel perl-ExtUtils-Embed
 

以上是 DR 在操作時還需要再安裝的套件,如果系統在安裝時沒有勾選開發工具群組,那麼要補裝的套件可能會更多(例如 GCC 編譯器等)。

 

2. 下載並安裝核心原始碼

使用 yumdownloader 下載:

  • yumdownloader --source kernel

 

yumdownloader 預設會下載套件庫中最新的核心原始碼。下載完成後便執行安裝:

  • rpm -ivh kernel-3.3.4-5.fc17.src.rpm

 

原始碼會被安裝到使用者目錄下的 rpmbuild 目錄,接著進行解壓縮與套用更新檔的動作:

  • rpmbuild -bp rpmbuild/SPECS/kernel.spec

 

如果仍缺少所需的套件,則執行 rpmbuild 指令時將會出現錯誤訊息,屆時請依訊息內容再使用 yum 安裝所需套件。此外請注意:前述下載並安裝核心原始碼的動作都不需要 root 權限。

 

3. 核心設定與編譯

  • cd rpmbuild/BUILD/kernel-3.3.fc17/linux-3.3.4-5.fc17.x86_64/
  • make menuconfig

 

進入設定選單後就可以進行核心選項的勾選,為了方便分辨自行編譯的版本,建議至 General setup 設定 Local version 的名稱(可自訂)。完成後便進行編譯並打包成 RPM:

  • make rpm

 

4. 安裝與移除

只要用日常 RPM 的操作方式即可:

  • sudo rpm -ivh rpmbuild/RPMS/x86_64/kernel-3.3.4_dr-1.x86_64.rpm
  • sudo rpm -e kernel-3.3.4_dr-1.x86_64

 

5. 外部模組的提醒

如果系統有使用到非核心內建的外部驅動程式,請記得這些驅動程式也要重新編譯成相對應的版本才能使用,這部份的可行作法很多(例如同樣使用 SRPM 處理),在此就不加贅述。

 

6. 其它參考資料