OSWikiHK: 请协力 GPLv3 的中文翻译工作。

編譯 Linux 核心

OSWikiHK,自由中文開源知識庫

本文主要討論如何手動編譯 Linux 核心。如果想把 Linux 編譯成 Dpkg 套件(*.deb)rpm 套件 ,可以參看相關文章。

目录

為何要編譯核心

  • 支援新的硬體設備
  • 支援新的功能
  • 修正舊版本的一些問題或安全漏洞
  • 優化核心,降低系統資源需求

取得 Linux 核心源碼

要編譯 Linux,首先當然是要最得 Linux 的源碼(source code)。最新的 Linux 官方源碼是可以從Kernel.org或其映射站取得,而最新 2.6.x 版本一般放在 /pub/linux/kernel/v2.6/ 中。

當然,您亦可以使用distribution所提供的Linux源碼。

Fedora 編修過的核心

Fedora 的核心源碼被包在 kernel 源碼 RPM (*.src.rpm)中。Fedora Core 6 的核心源碼 RPM 被放在 http://download.fedora.redhat.com/pub/feodra/linux/core/6/source/SRPMS/ 。Core 5 則在 http://download.fedora.redhat.com/pub/feodra/linux/core/5/source/SRPMS/

下載後,可以用命令 "rpm -ivh kernel-*.src.rpm" 安裝。例如:

wget http://download.fedora.redhat.com/pub/feodra/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpm
rpm -ihv kernel-2.6.18-1.2798.fc6.src.rpm

安裝源碼 RPM,您可能會看到以下警告訊息:

warning: user brewbuilder does not exist - using root
warning: group brewbuilder does not exist - using root

您可以不理會它們。

核實 Linux 核心源碼 (可省略)

要確保您下載的 Linux 核心源碼沒有被人惡意植入有問題的程式碼,每個 tarball 都有一個 *.sign 記錄了相關程式碼的數碼簽署,可以讓您用 GNUPG 之類的軟件核實源碼的真偽。

先確定您擁有 Kernel.org 的數碼公鑰,您可以到 Kernel.org 或由金鑰伺服器 wwwkeys.pgp.net下載:

$ gpg --keyserver wwwkeys.pgp.net --recv-keys 0x517D0F0E
gpg: requesting key 517D0F0E from hkp server wwwkeys.pgp.net
gpg: key 517D0F0E: "Linux Kernel Archives Verification Key <ftpadmin@kernel.org>" 34 new signatures
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:         new signatures: 34
$

使用 GNUPG 核實源碼:

$ gpg --verify linux-2.6.26.tar.bz2.sign linux-2.6.26.tar.bz2
gpg: Signature made Thu 15 Dec 2005 02:13:27 PM HKT using DSA key ID 517D0F0E
gpg: Good signature from "Linux Kernel Archives Verification Key <ftpadmin@kernel.org>"

如果您得到以上結果,即表示您下載的源碼正確無誤。但如果您得到以下結果,您下載的源碼可能已被人更動過了。

Could not find a valid trust path to the key.  Let's see whether we
can assign some missing owner trust values.

No path leading to one of our keys found.
 
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.

預備編譯需要的工具

要編譯 Linux 核心,一般需要以下工具

  • GNU Tar (tar) - 解開源碼壓縮檔
  • GNU Zip (gzip) 或 BZip2 (bzip2)- 解開源碼壓縮檔(*.gz 或 *.bz2)
  • GNU C Compiler (gcc) - 編譯核心
  • GNU C++ Compiler (g++ 或 gcc-c++) - 編譯 make xconfig 使用的 Qt 視窗時需要
  • GNU Make - 管理編譯
  • NCurses (libncurses5-dev 或 ncurses-devel) - make menuconfig 時用作繪畫文字視窗的程式庫
  • Qt 3 (qt-devel 或 qt3-devel) - make xconfig 時用作 Qt 視窗的程式庫
  • GTK+ (gtk+-devel) - make gconfig 時用作 GTK+ 視窗的程式庫
  • Glade (libglade2-devel) - 要編譯 make gconfig 時的 GTK+ 視窗時需要

Debian 或 Ubuntu

apt-get update
apt-get install libncurses5-dev wget bzip2

Fedora 或 CentOS

打算使用文字視窗介面 (make menuconfig) 設定編譯選項的朋友可以打安裝所需的套件:

su -c 'yum install gcc ncurses-devel'

打算使用 QT GUI 介面 (make xconfig) 設定編譯選項的朋友可以打安裝所需的套件:

su -c 'yum install gcc gcc-c++ qt-devel'

Fedora 9 的使用者要改打:

su -c 'yum install gcc gcc-c++ qt3-devel'

打算使用 GTK+ 介面 (make gconfig) 設定編譯選項的朋友可以打安裝所需的套件:

su -c 'yum install gcc gtk+devel libglade2-devel'

解開核心源碼壓縮檔

解開 GNU Zip 了(*.tar.gz) 的壓縮檔

如果您是下載了 GNU Zip 了的 Linux 核心源碼壓縮檔 (檔案伸廷名稱為 *.tar.gz),可以用指令 "tar zxvf linux-版本編號.tar.gz"解壓:

tar zxvf linux-2.6.26.tar.gz

解開 BZip2 了(*.tar.bz2)的壓縮檔

如果您是下載了 BZip2 了的 Linux 核心源碼壓縮檔 (檔案伸廷名稱為 *.tar.bz2),可以用指令 "tar jxvf linux-版本編號.tar.bz2" 解壓:

tar jxvf linux-2.6.26.tar.bz2

建立連結

ln -s linux-2.6.26 /usr/src/linux

用 Patch 檔案

如果您有前一個版本的 Linux 核心源碼並下載了 GNU Zip 了的現在版本 patch 檔案 (檔名為patch-*.gz),可以使用工具 patch 把前一個版本的 Linux 核心源碼轉變成現在版本:

cd linux-2.6.18
gzip -cd ../patch-2.6.17.gz | patch -p1 --dry-run
gzip -cd ../patch-2.6.17.gz | patch -p1

如果您有前一個版本的 Linux 核心源碼並下載了 BZip2 了的現在版本 patch 檔案(檔名為 patch-*.bz2),可以使用工具 patch 把前一個版本的 Linux 核心源碼轉變成現在版本:

cd linux-2.6.18
bzip2 -cd ../patch-2.6.17.bz2 | patch -p1 --dry-run
bzip2 -cd ../patch-2.6.17.bz2 | patch -p1

設定編譯選項

編譯 Linux 核心其中一個最重要的步驟就是選擇您的新核心需要那些功能,那些功能要編輯成可載入模組(Loadable Modules),甚至那些功能不需要編入核心中。當然,越少功能可以令新核心大小越少,耗癈資源越少。Linux 提供了多個方法去讓您設定編譯選項

  • config
  • menuconfig
  • xconfig
  • gconfig
  • oldconfig

取得舊編譯選項或 distribution 官方編譯選項

cp /boot/config-`uname -r` .config


make config - 文字模式

make menuconfig - 文字選單模式

make xconfig - 圖像模式 (Qt/Tcl)

Enlarge
Enlarge
Enlarge
Enlarge
Enlarge

make gconfig - 圖像模式 (GTK+)

make gconfig - Split View
Enlarge
make gconfig - Split View
make gconfig - Single View
Enlarge
make gconfig - Single View
make gconfig - Full View
Enlarge
make gconfig - Full View

make oldconfig - 只選擇新編譯選項

設定編譯選項提示

一般要留意的選項

  • Processor type and features
    • Symmetric multi-processing support (SMP) - 如果你的電腦有多過一個微處理器或多核心(Dual/Quad Core),請開啟這選項。
    • Processor family - 選擇適合你的微處理器家族,你可以看看檔案/proc/cpuinfo查閱你現時的微處理器型號。
      • 386 (M386) - Intel 80386系列及AMD, Cyrix的兼容微處理器。
      • 486 (M486) - Intel 80486系列及AMD, Cyrix, IBM的兼容微處理器。
      • 586/K5/5x86/6x86/6x86MX (M586) - 非Intel的586/686微處理器,包括AMD K5、Cyrix 5x86, 6x86及6x86MX。
      • Pentium-Classic (M586TSC) - 原始Intel Pentium
      • Pentium-MMX (M586MMX) - 支援MMX圖形及多媒體擴充指令的Intel Pentium
      • Pentium-Pro (M686) - Intel Pentium Pro
      • Pentium-II/Celeron(pre-Coppermine) (MPENTIUMII) - Intel Pentium II 及 pre-Coppermine Celeron
      • Pentium-III/Celeron(Coppermine)/Pentium-III Xeon (MPENTIUMIII) - Intel Pentium III、Coppermine Celeron 及Intel Pentium-III Xeon
      • Pentium M (MPENTIUMM) - Intel Pentium III Mobile (不是 Pentium 4 Mobile)
      • Pentium-4/Celeron(P4-Based)/Pentium-4 M/Xeon (MPENTIUM4) - Intel Pentium 4,包括 Celeron 、 Xeon及Mobile
      • K6/K6-II/K6-III (MK6) - AMD K6系列
      • Athlon/Duron/K7 (MK7) - AMD Athlon K7系列
      • Opteron/Athlon64/Hammer/K8 (MK8) - AMD Opteron 或 Athlon64 Hammer系列
      • Crusoe (MCRUSOE) - Transmeta Crusoe
      • Efficeon (MEFFICEON) - Transmeta Efficeon
      • Winchip-C6 (MWINCHIPC6) - IDT Winchip C6
      • Winchip-2 (MWINCHIP2) - IDT Winchip-2
      • Winchip-2A/Winchip-3 (MWINCHIP3D) - IDT Winchip-2A或3
      • GeodeGX1 (MGEODEGX1) - Geode GX1 (Cyrix MediaGX)
      • GeodeGX/LX (MGEODE_LX) - AMD Geode GX 或 LX
      • CyrixIII/VIA-C3 (MCYRIXIII) - Cyrix III 或 C3
      • VIA C3 (Nehemiah) (MVIAC3_2) - VIC C3 "Nehemiah"
    • Maximum number of CPUs (2-255) - 填入你電腦的CPU數量。例如Duo Core填「2」。CPU最大數量每多一就會令Linux核心大約八千左右位元組。
    • High Memory Support - 如果你的電腦不會擁有1GB或以上的記憶體,請選off。如記憶體大小界符1GB和4GB之間,選4GB。如果多於4GB,請選64GB。
  • Device Drivers -> ATA/ATAPI/MFM/RLL support -> Include IDE/ATA-2 DISK support (BLK_DEV_IDEDISK) - 建議開啟。不開啟這選項,你就使用不到IDE硬盤,連開動Linux都不能。(當然,用SCSI硬盤的朋友可以不開啟這選項。)
  • Device Drive -> Block Devices -> Low Performance USB Block Driver (BLK_DEV_UB) - 建議關閉。不要開啟這選項或編譯成為模組。這選項會開啟效能較低的USB驅動器(ub)。[1] [2] (2.6.9 或以後)

如果你使用 nVidia 顯示咭,請關閉下列選項:

  • Graphics Support -> nVidia Riva support (FB_RIVA)
  • Kernel Hacking -> Use 4Kb for kernel stacks instead of 8Kb (4KSTACKS)
  • Processor Type and Features -> Local APIC support on uniprocessors (X86_UP_APIC)

設定桌面電腦(Desktop)要留意的選項

  • Preemption Model
    • Preemption (Low-Latency Desktop) (PREEMPT) - 開啟這選項可以令多媒體播放更流暢,是桌面電腦必用的選項。
    • Preempt The Big Kernel Lock (PREEMPT_BKL) - 建議開啟。
    • Timer frequency (CONFIG_HZ_250 或者 CONFIG_HZ_1000) - 對桌面電腦來說,選250Hz而可以令多媒體播放很流暢,但如果你對這方便要求高,可以考慮使用1000Hz,但留意電量較高。
  • Block Layer -> IO Schedulers - 建議使用CFQ I/O排程器。這是決定使用硬碟存取排程器。在桌面平代方面,CFQ的表現較平均。

設定筆記簿型電腦(Laptop/Notebook)要留意的選項

  • 留意上面設定桌面電腦(Desktop)要留意的選項
    • Timer frequency (CONFIG_HZ_250) - 對筆記簿型電腦來說,選250Hz而可以令多媒體播放很流暢,而1000Hz會令電池壽命大大縮短。

設定伺服器(Server)要留意的選項

  • Preemption Model
    • Preemptible Kernel (PREEMPT) - 建議關閉。開啟這選項可以令多媒體播放更流暢,但如果你是用來作伺服器之用,這選項可能會降低系統效能,請把此選項關掉。
    • No Forced Preemption (Server) (PREEMPT_NONE) - 建議選用。
    • Preempt The Big Kernel Lock (PREEMPT_BKL) - 建議關閉。
    • Timer frequency (CONFIG_HZ_100) - 建議使用100Hz。
  • Block Layer
    • Support for Large Block Devices (LBD) - 如要存取超過2TB大小的儲存設備(如硬碟、RAID或硬碟映像檔等),就需要開啟選項。
    • Support for Large Single Files (LSF) - 如要處理超過2TB大小的檔案,就需要開啟選項。
    • IO Schedulers - 決定使用硬碟存取排程器。如果你的伺服器是用來跑資料庫(Database),請使用deadline排程器。

編譯核心

  • 打 "make dep" 建立相依性表。(編譯 Linux 2.6.x 或以上的版本可以略過)
  • 打 "make bzImage" 編譯核心。
  • 打 "make modules" 編譯核心模組。

安裝新核心

搬動有關檔案

  • 打 "make modules_install" 將核心模組安裝至目錄 /lib/modules 中。
  • 您會在目錄 arch/i386/boot 中找到個叫 bzImage 或 zImage 的檔案,那就是您編譯出來的新核心了。為方便管理,您需要把它移動至目錄 /boot中,並改名為 "vmlinuz-核心版本"。為保存編譯選項方便日後參考,您也應該把 .config 複製至 /boot 及改名為 "config-核心版本"。例如(假設核心版本為 2.6.26):
# cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.26
# cp .config /boot/config-2.6.26

設定啟動程式

設定 GRUB

設定 GRUB 前請先輸入命令 df 查出目錄 / 和 /boot 所在的分割區名稱,例如:

$ df
檔案系統           1K-區段      已用     可用     已用% 掛載點
/dev/sda5         14535584   7275752  6527272  53% /
udev               1033204        60  1033144   1% /dev
devshm             1033204       184  1033020   1% /dev/shm
/dev/sda2            43256     24819    18437  57% /boot

如上例中,目錄 / 的分割區名稱就是 /dev/sda5。

修改 GRUB 的設定檔 /boot/grub/menu.lst 加上啟動新 Linux 核心的項目,以下是 Ubuntu/Debian 的例子:

## ## End Default Options ##

title           New Linux (2.6.26)
root            (hd0,4)
kernel          /boot/vmlinuz-2.6.26 root=UUID=a3b3df6a-a4b7-4395-8278-45c23e45ca53 ro quiet splash locale=zh_TW
quiet

title		Ubuntu 8.04, kernel 2.6.24-19-generic
root		(hd0,7)
kernel		/boot/vmlinuz-2.6.24-19-generic  root=UUID=a3b3df6a-a4b7-4395-8278-45c23e45ca53 ro quiet splash locale=zh_TW
initrd		/boot/initrd.img-2.6.24-19-generic
quiet

以下是 Fedora/CentOS 的例子:

splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title New Linux (2.6.26)
      root (hd0,0)
      kernel /vmlinuz-2.6.26 ro root=/dev/VolGroup00/LogVol100 rhgb quiet

title Fedora (2.6.26.10-86.fc9.i686)
      root (hd0,0)
      kernel /vmlinuz-2.6.25.10-86.fc9.i686 ro root=/dev/VolGroup00/LogVol100 rhgb quiet
      initrd /initrd-2.6.25.10-86.fc9.i686.img

簡單來說,把現有的項目設定複製一次,改一改標題 (title) 和核心名稱 (kernel) 就可以了。

設定 lilo

  • 設定好設定檔案 /etc/lilo.conf
boot=/dev/hda
root=/dev/hda5
install=/boot/boot.b
map=/boot/map
vga=normal
delay=100
image=/boot/vmlinuz-2.6.26
    label=Linux
    read-only
image=/boot/vmlinuz-2.6.8
    label=LinuxOld
    read-only
other=/dev/hda1
    label=WinXP
    table=/dev/hda
  • 打 "lilo"

失敗後的處理方法

完成

完成後,記謹為這次編譯的設定作備份,以便日後檢閱及升級之用。

cp -i .config /boot/config-`uname -r`

相關頁面

相關連結

Personal tools
廣告橫額