深入講解介紹編譯Fedora內(nèi)核
在向大家詳細(xì)介紹編譯Fedora內(nèi)核之前,首先讓大家了解下Fedora,然后全面介紹編譯Fedora內(nèi)核,希望對(duì)大家有用。inux系統(tǒng)涉及的各種管理知識(shí)和技術(shù),如系統(tǒng)引導(dǎo)和關(guān)機(jī)、進(jìn)程控制、文件系統(tǒng)管理、用戶(hù)管理、設(shè)備管理、系統(tǒng)備份、軟件配置以及cron和系統(tǒng)曰志的管理使用等。每一個(gè)Linux發(fā)行版都有自己專(zhuān)門(mén)的工具去構(gòu)建自定義的內(nèi)核. 本文主要介紹在編譯Fedora內(nèi)核平臺(tái)上, 如何從www.kernel.org(也叫vanilla kernel)獲得最新且未改動(dòng)的內(nèi)核源代碼來(lái)構(gòu)建一個(gè)自定義的內(nèi)核, 這樣你可以使用自己的內(nèi)核而不是發(fā)行版的內(nèi)核, 另外也介紹了如何給內(nèi)核打補(bǔ)丁, 從而方便增加新的功能.
下面的工作我都在編譯Fedora內(nèi)核 Core 6上經(jīng)過(guò)了測(cè)試.
我想首先要說(shuō)的是文章中構(gòu)建自定義內(nèi)核的方式不是唯一的, 還有許多其它的方式, 這不過(guò)是我習(xí)慣的方式. 我不能保證使用后不會(huì)出現(xiàn)任何問(wèn)題.
預(yù)備工作
本文我將描述在編譯Fedora內(nèi)核上構(gòu)建自定義內(nèi)核的兩種方式. 第一種是Fedora方式, 最后你將能獲得一個(gè)內(nèi)核rpm包, 從而可以方便地與他人分享. 第二種是傳統(tǒng)方式, 適用于所有l(wèi)inux發(fā)行版, 不過(guò)最后你不會(huì)有一個(gè)rpm包.我推薦使用root用戶(hù)做下面所有的步驟. 然而, 有時(shí)也需要使用非超級(jí)用戶(hù)(比如用戶(hù)tom)來(lái)運(yùn)行一些命令, 所以你可能會(huì)使用visudo編輯器在/etc/sudoers文件中添加下面一行:
tom ALL=(ALL) ALL現(xiàn)在無(wú)論什么時(shí)候你需要用root權(quán)限運(yùn)行命令, 比如:
yum install fedora-rpmdevtools unifdef
你都可以用下面的命令來(lái)替代:sudo yum install fedora-rpmdevtools unifdef請(qǐng)記住: 如果以root用戶(hù)身份運(yùn)行所有命令, 你可以完全忘記sudo. 采用什么方式, 看你自己的習(xí)慣.
構(gòu)建rpm內(nèi)核包
這一小節(jié)介紹如何構(gòu)建內(nèi)核, 最終你可以得到一個(gè)rpm包, 這樣可以方便安裝或與他人分享.
1 創(chuàng)建你的rpmbuild目錄
按下面創(chuàng)建你的rpmbuild目錄:
cd ~
cp -a /usr/src/redhat/ rpmbuild
echo '%_topdir %(echo $HOME)/rpmbuild' >> .rpmmacros 然后安裝構(gòu)建rpm包需要的應(yīng)用軟件包
yum install fedora-rpmdevtools unifdef然后運(yùn)行
fedora-buildrpmtree
下載和安裝編譯Fedora內(nèi)核src.rpm包
接下來(lái)為我們的Fedora版本下載最新的編譯Fedora內(nèi)核src.rpm包. 針對(duì)Fedora Core 6, 你可以從接下來(lái)的網(wǎng)址獲得src.rpm包: http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/, 針對(duì)Fedora Core 5, 你可以從下面的網(wǎng)址獲得src.rpm包: http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/, 等等. 最新的Fedora Core 6內(nèi)核src.rpm包是kernel-2.6.18-1.2798.fc6.src.rpm, 所以我們現(xiàn)在下載和安裝它:cd /usr/src
wget http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpm
rpm -ivh kernel-2.6.18-1.2798.fc6.src.rpm
如果你看到這些警告:
warning: user brewbuilder does not exist - using root
warning: group brewbuilder does not exist - using root你可以忽略它們.
我們已經(jīng)成功安裝了最新的2.6.18.1編譯Fedora內(nèi)核源代碼包. 如果我們繼續(xù)構(gòu)建編譯Fedora內(nèi)核源代碼包的話(huà), 我們的內(nèi)核版本將是2.6.18.1.
給編譯Fedora內(nèi)核打補(bǔ)丁
我想安裝新編譯Fedora內(nèi)核2.6.18.2來(lái)替代2.6.18.1. 系統(tǒng)已經(jīng)安裝的src.rpm包是給2.6.18打過(guò)補(bǔ)丁的2.6.18.1. 而我們現(xiàn)在將使用打補(bǔ)丁的方式升級(jí)內(nèi)核到2.6.18.2
cd ~/rpmbuild/SOURCES/
wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.18.2.bz2
如果你想編譯Fedora內(nèi)核的名字結(jié)尾為2.6.19-rc5, 你也可以使用prepatch包http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2. 請(qǐng)注意這項(xiàng)工作僅對(duì)prepaches有效. 比如. 內(nèi)核補(bǔ)丁僅對(duì)最終發(fā)行的內(nèi)核版本有效, 比如2.6.19內(nèi)核. 你可以給2.6.18內(nèi)核源代碼打補(bǔ)丁, 但不能是2.6.18.1或2.6.18.2, 等. 這個(gè)規(guī)則在接下來(lái)的網(wǎng)頁(yè)中注明: http://kernel.org/patchtypes/pre.html prepatches等同于linux中的測(cè)試發(fā)行; 他們位于存檔的測(cè)試目錄中, 我們可以使用patch(1)工具對(duì)上一個(gè)完整發(fā)行版(版本號(hào)分三部分)打補(bǔ)丁(例如, 2.6.13-rc4 prepatch只可以給2.6.11內(nèi)核源代碼打補(bǔ)丁, 而不是2.6.11.10.)
現(xiàn)在我們必須修改kernel-2.6.spec文件, 讓它知道我們使用了新的編譯Fedora內(nèi)核補(bǔ)丁:
cd ~/rpmbuild/SPECS/
vi kernel-2.6.spec
搜尋下面行
Patch1: patch-2.6.18.1.bz2
替換為下面的內(nèi)容:
Patch1: patch-2.6.18.2.bz2
(或者其它你已下載的版本)然后運(yùn)行
rpmbuild -bp kernel-2.6.spec
(如果你想構(gòu)建其它平臺(tái)如i386, i586, i686或者x86_64的內(nèi)核, 你可以通過(guò)運(yùn)行下面的命令來(lái)實(shí)現(xiàn):
rpmbuild -bp --target=i686 kernel-2.6.spec
我沒(méi)有在上面例子中指定為i386, 你的系統(tǒng)可能是其它的平臺(tái)類(lèi)型, 請(qǐng)記得填寫(xiě)你的平臺(tái)類(lèi)型.)
現(xiàn)在我們進(jìn)入到關(guān)鍵的部分. src.rpm有很多fedora專(zhuān)門(mén)的補(bǔ)丁, 其中一些不能與我們的2.6.18.2補(bǔ)丁很好的工作, 所以如果你在rpmbuild輸出看到下面狀況:
echo 'Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):'
Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):
patch -p1 -s
Reversed (or previously applied) patch detected! Assume -R? [n]
Apply anyway? [n]
1 out of 1 hunk ignored -- saving rejects to file drivers/block/DAC960.c.rej
error: Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)
RPM build errors:
Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)
這時(shí)候你必須再次編輯kernel-2.6.spec文件, 注解掉patch #300一行:
vi kernel-2.6.spec
[...]
#Patch300: linux-2.6-ppc-dac960-ipr-clash.patch
[...]
#%patch300 -p1
[...]
然后再運(yùn)行rpmbuild命令, 比如:
rpmbuild -bp kernel-2.6.spec
注意: 你必須不斷重復(fù)上面過(guò)程直到不出現(xiàn)任何錯(cuò)誤.
指定編譯Fedora內(nèi)核識(shí)別碼
現(xiàn)在我們將指定一個(gè)字符串方便以后區(qū)別內(nèi)核版本. 因此我們需要做:
cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i386
vi Makefile在EXTRAVERSION一行, 你可以輸入一個(gè)編譯Fedora內(nèi)核識(shí)別碼. 我想最好是在字符串后附上內(nèi)核的版本號(hào), 這樣來(lái)操作:
EXTRAVERSION = -custom-2.6.18.2
配置編譯Fedora內(nèi)核
現(xiàn)在我們運(yùn)行make menuconfig然后我們看到內(nèi)核的配置菜單. 移動(dòng)綠色光標(biāo)到 Load an Alternate Configuration File 行后選擇.config文件做為配置文件: 然后瀏覽編譯Fedora內(nèi)核配置菜單, 選擇你需要的功能. 完成配置后, 選擇Exit, 回答下面的問(wèn)題(Do you wish to save your new kernel configuration? 你希望保存新的內(nèi)核配置嗎?), 選擇Yes:
構(gòu)建編譯Fedora內(nèi)核
現(xiàn)在我們簡(jiǎn)單運(yùn)行下面命令來(lái)構(gòu)建編譯Fedora內(nèi)核:make rpm然后你將在~/rpmbuild/SRPMS/目錄發(fā)現(xiàn)一個(gè)新的src.rpm包, 比如. ~/rpmbuild/SRPMS/kernel-2.6.18custom2.6.18.2-1.src.rpm, 內(nèi)核rpm包位于~/rpmbuild/RPMS/i386/ (或 ~/rpmbuild/RPMS/i586/, ~/rpmbuild/RPMS/i686/, 等. 看你的平臺(tái)類(lèi)型). 比如. ~/rpmbuild/RPMS/i386/kernel-2.6.18custom2.6.18.2-1.i386.rpm. 你看到內(nèi)核識(shí)別碼已添加到軟件包的名字中.
安裝新編譯Fedora內(nèi)核
現(xiàn)在去新的rpm內(nèi)核包存在的目錄(基于你的平臺(tái)類(lèi)型, 比如. ~/rpmbuild/RPMS/i386/)安裝rpm包:cd ~/rpmbuild/RPMS/i386rpm -ivh kernel-2.6.18custom2.6.18.2-1.i386.rpm(現(xiàn)在你甚至能夠拷貝到其它的Fedora系統(tǒng), 通過(guò)上面的方式安裝. 你將不再需要編譯Fedora內(nèi)核.)接下來(lái)我們?yōu)樾戮幾gFedora內(nèi)核創(chuàng)建一個(gè)ramdisk, 否則系統(tǒng)將不能引導(dǎo)新內(nèi)核:mkinitrd /boot/initrd-2.6.18-custom-2.6.18.2.img 2.6.18-custom-2.6.18.2
然后編輯/boot/grub/menu.lst文件, 看一下你系統(tǒng)上已經(jīng)存在(正在工作的)引導(dǎo)內(nèi)核信息, 拷貝其中的一個(gè)實(shí)例, 替換為你新的內(nèi)核和ramdisk:
vi /boot/grub/menu.lst
比如, 我的menu.lst, 在我添加新的編譯Fedora內(nèi)核信息前的情況:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-1.2798.fc6.img
修改后的情況:
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18-custom-2.6.18.2)
root (hd0,0)
kernel /vmlinuz-2.6.18-custom-2.6.18.2 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-custom-2.6.18.2.img
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-1.2798.fc6.img(你可以通過(guò)下面命令發(fā)現(xiàn)正確的vmlinuz和initrd文件:ls -l /boot)
現(xiàn)在重啟系統(tǒng):
shutdown -r now如果一切進(jìn)展順利, 你的新編譯Fedora內(nèi)核正常工作. 你還可以通過(guò)運(yùn)行下面命令來(lái)檢查新內(nèi)核是否運(yùn)行:
uname -r這將會(huì)顯示如:2.6.18-custom-2.6.18.2如果系統(tǒng)沒(méi)有起來(lái), 重啟一下, 你會(huì)看到:按任意鍵進(jìn)入GRUB菜單:選擇你以前的內(nèi)核啟動(dòng)系統(tǒng), 現(xiàn)在你能再次嘗試編譯新的工作內(nèi)核. 不要忘記從/boot/grub/menu.1st文件中移去不需要的引導(dǎo)內(nèi)核信息.
構(gòu)建編譯Fedora內(nèi)核的傳統(tǒng)方式
這個(gè)章節(jié)講述另一種適用于所有l(wèi)inux發(fā)行版的編譯Fedora內(nèi)核方式. 跟Fedora編譯方式不同的是, 結(jié)果不會(huì)有rpm內(nèi)核包.
下載編譯Fedora內(nèi)核源代碼
我們下載需要的內(nèi)核到/usr/src目錄(去www.kernel.org網(wǎng)站下載你需要的內(nèi)核版本, 比如. linux-2.6.18.2.tar.bz2(你可以從這里下載所有的2.6內(nèi)核: http://www.kernel.org/pub/linux/kernel/v2.6/). 然后下載到/usr/src目錄:cd /usr/srcwget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.2.tar.bz2
然后解壓內(nèi)核源代碼, 創(chuàng)建一個(gè)指向編譯Fedora內(nèi)核源代碼目錄的linux字符鏈接:
tar xjf linux-2.6.18.2.tar.bz2
ln -s linux-2.6.18.2 linux
cd /usr/src/linux
給編譯Fedora內(nèi)核源代碼打補(bǔ)丁(可選)
有時(shí)你的缺省內(nèi)核不支持新買(mǎi)的設(shè)備, 你需要安裝新的驅(qū)動(dòng). 或者你需要使用虛擬技術(shù)或其它高級(jí)的技術(shù), 而這些現(xiàn)有的內(nèi)核都不支持. 這樣情況下你需要給給內(nèi)核源代碼打補(bǔ)丁(當(dāng)然補(bǔ)丁已經(jīng)發(fā)布..)現(xiàn)在我們假設(shè)你已經(jīng)下載需要的補(bǔ)丁(以下例子我叫它patch.bz2)到/usr/src. 運(yùn)行下面的命令給內(nèi)核源代碼直接打上補(bǔ)丁(你的用戶(hù)必須位于/usr/src/linux目錄):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
第一個(gè)命令用于測(cè)試, 對(duì)內(nèi)核沒(méi)有任何影響. 如果沒(méi)有顯示錯(cuò)誤, 你可以運(yùn)行第二個(gè)命令給內(nèi)核打補(bǔ)丁. 如果第一個(gè)命令有誤, 請(qǐng)務(wù)繼續(xù)的操作!
你也能夠通過(guò)內(nèi)核的prepatches方式打補(bǔ)丁. 比如, 如果你需要一個(gè)功能, 而這個(gè)功能僅存在于2.6.19-rc5中, 正式完整的編譯Fedora內(nèi)核版本仍沒(méi)有發(fā)布, 而patch-2.6.19-rc5.biz2已經(jīng)發(fā)布. 你可以把這個(gè)補(bǔ)丁打到2.6.18的內(nèi)核源代碼中, 但請(qǐng)不要達(dá)到2.6.18.1或2.6.18.2, 等. 這個(gè)規(guī)則在接下來(lái)的網(wǎng)頁(yè)中注明: http://kernel.org/patchtypes/pre.htmlprepatches等同于linux中的測(cè)試發(fā)行; 他們位于存檔的測(cè)試目錄中, 我們可以使用patch(1)工具對(duì)上一個(gè)完整發(fā)行版(版本號(hào)分三部分)打補(bǔ)丁(例如, 2.6.13-rc4 prepatch只可以給2.6.11內(nèi)核源代碼打補(bǔ)丁, 而不是2.6.11.10.)
所以如果你想編譯2.6.19-rc5內(nèi)核, 你必須在步驟3.1下載2.6.18(http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2)替代2.6.18.2內(nèi)核源代碼!下面是如何給2.6.18打上2.6.19-rc5補(bǔ)丁:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc5.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc5.bz2 | patch -p1
配置編譯Fedora內(nèi)核
使用當(dāng)前工作內(nèi)核的配置文件做為新內(nèi)核配置文件的基礎(chǔ)是一個(gè)很好的主意. 因此我們拷貝已存的配置文件到/usr/src/linux:
make mrproper
cp /boot/config-`uname -r` ./.config
然后運(yùn)行make menuconfig然后我們看到內(nèi)核的配置菜單. 移動(dòng)綠色光標(biāo)到 Load an Alternate Configuration File 行后選擇.config文件做為配置文件:然后瀏覽內(nèi)核配置菜單, 選擇你需要的功能. 完成配置后, 選擇Exit, 回答下面的問(wèn)題(Do you wish to save your new kernel configuration? 你希望保存新的內(nèi)核配置嗎?), 選擇Yes:
構(gòu)建和安裝新的編譯Fedora內(nèi)核
構(gòu)建和安裝新的編譯Fedora內(nèi)核, 執(zhí)行下面的3個(gè)命令:
make all
make modules_install
make install
保持耐心, 內(nèi)核編譯需要一定時(shí)間, 主要看你的內(nèi)核配置和處理器速度. 最后一個(gè)命令將自動(dòng)創(chuàng)建一個(gè)ramdisk, 你將在/boot/grub/menu.lst用到.現(xiàn)在編輯/boot/grub/menu.lst. 把你的新的內(nèi)核信息放到列表的頂端, 確認(rèn)新的內(nèi)核已經(jīng)替代老的編譯Fedora內(nèi)核, default值需要設(shè)為0.
vi /boot/grub/menu.lst
我的menu.lst是這樣的:
# grub.conf generated by anaconda#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Fedora Core (2.6.18.2)
root (hd0,0)
kernel /vmlinuz-2.6.18.2 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18.2.img
title Fedora Core (2.6.18-1.2798.fc6)
root (hd0,0)
kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-1.2798.fc6.img
現(xiàn)在重新啟動(dòng)系統(tǒng):shutdown -r now如果一切進(jìn)展順利, 你的新編譯Fedora內(nèi)核正常工作. 你可以通過(guò)運(yùn)行下面命令來(lái)檢查你的新內(nèi)核是否運(yùn)行:
uname -r
這將會(huì)顯示如:
2.6.18.2如果系統(tǒng)沒(méi)有起來(lái), 重啟一下, 你會(huì)看到:按任意鍵進(jìn)入GRUB菜單:選擇你以前的內(nèi)核啟動(dòng)系統(tǒng), 現(xiàn)在你能再次嘗試編譯Fedora內(nèi)核. 不要忘記從/boot/grub/menu.1st文件中移去不需要的引導(dǎo)編譯Fedora內(nèi)核信息
【編輯推薦】