Linux 的核心編譯是一件很有趣但挑戰性又高的事,之前在補習班拿到有關RHEL3的核心編譯步驟,但套用在目前的版本,有些步驟需要修改,於是查了一些文件,終於測試出完整的步驟。
由於 Fedora 自 Core 3 起就不再將 kernel-source-<version>.i386.rpm 納入其中,於是我們只能從 kernel-<version>.src.rpm 取得 source 來重新編譯。
1.首先在編譯 kernel 之前,我們要先取得 kernel 的 SRPM,而 kernel-<version>.src.rpm 的取得方法有下列三種:
a) 從 FC5 原始套件中取得 kernel 的 SRPM(此以 FC5 為例)
http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/
下載:kernel-2.6.15-1.2054_FC5.src.rpm
b) 從 FC5 更新套件中取得最新的 kernel SRPM(此以 FC5 為例)
http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5/SRPMS/
下載:kernel-2.6.<最新版本>.src.rpm
c) 透過”yum”取得 kernel 的 SRPM(此為 FC5 官方文件)
# yum install fedora-rpmdevtools ← 安裝fedora-rpmdevtools套件
# fedora-buildrpmtree ← 在HOME 底下產生 rpmbuild/ 的目錄
# yum install yum-utils ← 安裝 yum-utils 套件
# yumdownloader --source kernel ← 下載 kernel 的 SRPM
註:此方法最後一道指令在FC5中下載失敗,無法取得 kernel 的 SRPM,在 FC4中下載正常。
a) 從 FC5 原始套件中取得 kernel 的 SRPM(此以 FC5 為例)
http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/
下載:kernel-2.6.15-1.2054_FC5.src.rpm
b) 從 FC5 更新套件中取得最新的 kernel SRPM(此以 FC5 為例)
http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5/SRPMS/
下載:kernel-2.6.<最新版本>.src.rpm
c) 透過”yum”取得 kernel 的 SRPM(此為 FC5 官方文件)
# yum install fedora-rpmdevtools ← 安裝fedora-rpmdevtools套件
# fedora-buildrpmtree ← 在HOME 底下產生 rpmbuild/ 的目錄
# yum install yum-utils ← 安裝 yum-utils 套件
# yumdownloader --source kernel ← 下載 kernel 的 SRPM
註:此方法最後一道指令在FC5中下載失敗,無法取得 kernel 的 SRPM,在 FC4中下載正常。
2.安裝下載後的 kernel-<version>.src.rpm
# rpm -ivh kernel-<version>.src.rpm
安裝完後的 source 存放路徑為 /usr/src/redhat/
註:若以 c) 步驟取得 SRPM 套件,並執行過 fedora-buildrpmtree,其安裝後存放路徑為<HOME>/rpmbuild/
# rpm -ivh kernel-<version>.src.rpm
安裝完後的 source 存放路徑為 /usr/src/redhat/
註:若以 c) 步驟取得 SRPM 套件,並執行過 fedora-buildrpmtree,其安裝後存放路徑為<HOME>/rpmbuild/
◎以下操作以方法 b) 及核心版本 2.6.16 為例,方法 a) 相同,方法 c) 僅路徑不相同。
3.使用下列指令產生 kernel source
# cd /usr/src/redhat/SPECS ← 方法 c) 為 <HOME>/rpmbuild/SPECS
# rpmbuild -bp --target $(uname -m) kernel-2.6.spec ← 中間有空白,複製到記事本可看得更清楚
# cd /usr/src/redhat/SPECS ← 方法 c) 為 <HOME>/rpmbuild/SPECS
# rpmbuild -bp --target $(uname -m) kernel-2.6.spec ← 中間有空白,複製到記事本可看得更清楚
4.自訂 kernel 版本名稱
# cd /usr/src/redhat/BUILD/kernel-2.6.16/linux-2.6.16 ← 方法 c) 為 <HOME>/rpmbuild/BUILD/kernel-2.6.16/linux-2.6.16
# vi Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 16
EXTRAVERSION = -5.2006.Gavin ← 筆者將 prep 修改為自己定義的格式
所產生的 kernel,其名稱將為「2.6.16-5.2006.Gavin」
# cd /usr/src/redhat/BUILD/kernel-2.6.16/linux-2.6.16 ← 方法 c) 為 <HOME>/rpmbuild/BUILD/kernel-2.6.16/linux-2.6.16
# vi Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 16
EXTRAVERSION = -5.2006.Gavin ← 筆者將 prep 修改為自己定義的格式
所產生的 kernel,其名稱將為「2.6.16-5.2006.Gavin」
◎以下操作目錄皆在 /usr/src/redhat/BUILD/kernel-2.6.16/linux-2.6.16。
5.清除之前編譯核心所遺留下的設定檔案(若第一次編譯可略過此步驟)
# make mrproper
# make mrproper
6.使用預設的 kernel 設定檔
# cp /boot/config-2.6.15-1.2054_FC5 .config ← 將前一版設定檔複製成 .config
RedHat 每一版本的 Linux,其 kernel 預設的設定檔皆放在 /boot 中,若自己對 kernel 中每一個項目都很熟悉的話,可不用複製;複製前一個 kernel 設定檔的好處是,我們可以依照 RedHat 原先預設的參數來修改,減少失敗率。
# cp /boot/config-2.6.15-1.2054_FC5 .config ← 將前一版設定檔複製成 .config
RedHat 每一版本的 Linux,其 kernel 預設的設定檔皆放在 /boot 中,若自己對 kernel 中每一個項目都很熟悉的話,可不用複製;複製前一個 kernel 設定檔的好處是,我們可以依照 RedHat 原先預設的參數來修改,減少失敗率。
7.讀取預設的 .config 並根據系統原有硬體環境修改 .config
# make oldconfig 一種讀取既有設定檔案(.config)的非互動式文字模式,且只會對之前不存在的新問題出現提示;若熟悉 kernel 中每一個項目要自己設定的話,可略過此步驟。
# make oldconfig 一種讀取既有設定檔案(.config)的非互動式文字模式,且只會對之前不存在的新問題出現提示;若熟悉 kernel 中每一個項目要自己設定的話,可略過此步驟。
8.修改 .config 設定檔(有下例3種方式,任選一種即可,若無需修改可略過此步驟)
a) # make config
一個互動式的文字模式,元件以線性格式呈現,且一次只能操作一個,不允許改變之前問題的答案。
b) # make menuconfig 文字介面的選單模式,較為簡便,可在純文字界面下執行編輯動作,如下圖。
a) # make config
一個互動式的文字模式,元件以線性格式呈現,且一次只能操作一個,不允許改變之前問題的答案。
b) # make menuconfig 文字介面的選單模式,較為簡便,可在純文字界面下執行編輯動作,如下圖。
c) # make xconfig
使用 X-Window 為主要環境的設定模式,如下圖。
使用 X-Window 為主要環境的設定模式,如下圖。
步驟7、8兩個步驟都可進行設定修改,或是任選一個步驟修改 kernel 參數,只要能達到自己所想要的目的即可。
9.清除上一版本編輯過程中所產生的檔案(若為第一次編輯可略過此步驟)
# make clean
# make clean
10.建立 kernel、產生 kernel 模組及安裝 kernel 模組
# make bzImage modules modules_install
此部份最為秏時,通常會超過半小時以上。
# make bzImage modules modules_install
此部份最為秏時,通常會超過半小時以上。
11.安裝編譯好的 kernel
# make install
# make install
12.檢查 /boot/grub/grub.conf,並將新版的 kernel 設定為預設開機 kernel
# vi /boot/grub/grub.conf
default=0 ← 改為0,代表 2.6.16-5.2006_Gavin 為預設開機
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.16-5.2006_Gavin)
..............................................................................
# vi /boot/grub/grub.conf
default=0 ← 改為0,代表 2.6.16-5.2006_Gavin 為預設開機
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.16-5.2006_Gavin)
..............................................................................
13.重新開機,並檢查 kernel 版本是否正確
# uname -r 2.6.16-5.2006_Gavin
# uname -r 2.6.16-5.2006_Gavin
沒有留言:
張貼留言