編譯內核操作流程 ──為新手指南

作者:北南南北
來自:LinuxSir.Org
提要: 編譯內核主要是通過內核實現某些功能,比如iptables 需要內支持;所有的硬件的支持也是通過內核實現的;本文只是簡單的給初學者講一下編譯內核的流程;


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
正文
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


一、為什麼要編譯內核;

有時我們為了實現某些功能,比如對iptables的防火牆有些需要內核支持;還有實現一些硬件的支持等,這時我們需要重編內核;


二、內核源碼版本的選擇;

如果發行版本提供內核源碼,最好還是用發行版本提供的;比如Fedora 4.0 提供了很多版本的內核源碼;我們安裝好後,他自帶的配置文件大多能滿足我們的需要,對於新手來說,根據自帶的內核的配置文件.config ,我們也能學到一點如何配置內核。也沒有什麼難的,熟能生巧罷了;

如果從 kernel.org 下載最新穩定版本的內核也是可以的;


三、內核源碼安裝或解壓;

對於Fedora Core 4.0 來說,內核源碼是放在 /usr/src/kernels 目錄中;如果通過在線升級內核,也是放在這個目錄中;如果您的系統中的 /usr/src/kernels/ 中沒有內容,說明您沒有安裝內核的源碼包 kernel-devel 軟件包;

您可以通過軟件包管理器來補裝 ,請參考 《Fedora / Redhat 軟件包管理指南》

如果您用Fedora Core 4.0 ,我建議您在保留老內核的基礎上,在線下載最新版本的內核 kerenl-devel 和對應版本的 kernel 或者從 kernel.org 下載,有時可能新的kerenl 已經解決了您所面對的問題,這時就沒有必要編譯內核了;

如果您是通過在線安裝的內核源碼包 ,比如通過 apt+synaptic 或者yum 安裝的,內核源碼會被放到/usr/src/kernel 下的目錄中,您要進入相對應的目錄進行編譯;

在線更新軟件包,請參考 《Fedora / Redhat 軟件包管理指南》,推薦 apt+synaptic 工具;

如果您是是下載kernel 和kernel-devel 的rpm 包,可以通過來安裝;

[root@localhost beinan]# rpm -ivh kernel*.rpm

如果您是從kernel.org 下載的類似 linux-2.6.13.tar.bz2 或者 linux-2.6.13.tar.gz的,您要把下載下來的文件移到 /usr/src 目錄中解壓; 然後進入解壓的目錄中進行配置和編譯;

[root@localhost beinan]# mv linux-2.6.13.tar.bz2
[root@localhost beinan]# cd /usr/src/
[root@localhost src]# tar jxvf linux-2.6.12.3.tar.bz2

提示:本文以linux-2.6.12.3為例,其實通過發行版的升級版的 kernel-devel 和從kernel.org 下載下來的差不多,大同小異;不同的是通過在線升級的rpm格式的內核源碼包,有配置文件.config 可以參考;安裝到的目的地是/usr/src/kernel 對FC 4.0來說;如果您要高編譯和配置內核,


四、內核的配置;


1、進入目錄執行 make mrproper ,對於從 kernel.org 下載而來的tar.bz格式的源碼包;

[root@localhost src]# cd linux-2.6.12.3/
[root@localhost linux-2.6.12.3]#
[root@localhost src]# cd linux-2.6.12.3/
[root@localhost linux-2.6.12.3]# make mrproper
[root@localhost linux-2.6.12.3]# make menuconfig

對於Fedora Core 4.0 ,如果您是通過在線安裝的 kernel和kernel-devel 新版本的包,比如是2.6.12-1.1398_FC4-i686,你可以直進入 /usr/src/kernel/相應的目錄中直接執行 make menuconfig ;利用發行版本提供的 .config 來配置,這樣方便點。不要make mrproper ,否則.config 就沒有了;這也是為什麼要用發行版本提供的內核源碼升級包的原因;

其它配置和安裝大同小異;模仿總可以吧;


2.簡要的配置內核;

進入配置內核的配置模式後,我們可能一無所知,看下面;

內核配置有兩種方法,一種是直接置入內核 * ;另一種是編成模塊 M ;兩種方法各有優點;直接編入內核的,比如設備的啟動,不再需要加載模塊的這一過程了;而編譯成模塊,則需要加載設備的內核支持的模塊;但直接把所有的東 西都編入內核也不是可行的,內核體積會變大,系統負載也會過重。我們編內核時最好把極為重要的編入內核;其它的如果您不明白的,最好用默認。


1)移動鍵盤上下左右鍵,按Enter 進入一個目錄。把指針移動到Exit就退出當前目錄到上級目錄;

2)針對自己機器存在的問題進行修改,比如大內存的支持;

選擇自己機器的CPU;

移動鍵盤到 Processor type and features ---> ,然後按ENTER進入;
找到 Processor family (Pentium-Pro) ---> 按ENTER進入;

進入後我們發現有好多CPU的型號可選;一般的情況下要根據
bash-3.00# cat /proc/cpuinfo 輸出的信息來選,比如我們的是Celeron (P4)一代的,應該選如下的,當然默認的 486也是可以正常運行的,既然我們重編一次內核,就得選中對應型號的,也許性能有所提高呢;

Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon)

對大內存支持;如果內存是1G或者1G以上,但小於4G的,就要選4G支持;如果超過4G的,要選64G的支持;
High Memory Support (4GB) --->
(X) 4GB
( ) 64GB

還有比如聲卡等硬件,需要我們一步一步的查看;如果有不明之處,就要按 [shift]+?的組合鍵來查看說明。一般的情況下,2.6.x的內核會根據機器的情況自動配出一個文件,只需要我們來查看一下,把重要的地方改改就行了;

再舉個例子:比如我現在所用的聲卡是intel ac97的,我應該怎麼配置呢?

首先要知道自己的聲卡的芯片組,我們要通過lspci -v 來查看;

[root@localhost beinan]#lspci -v

只查看聲卡的,應該用如下的方法:
[root@localhost beinan]# lspci -v |grep audio
00:1f.5 Multimedia audio controller: Intel Corp. 82801DB (ICH4) AC'97 Audio Controller (rev 03)

通過上面的輸出,我們知道這台機器用的是intel AC97聲卡;所以我們要特別注意AC97的配置;

找到 Device Drivers ---> Sound --->
<M> Sound card support 聲卡的支持,這個是一定要選中的吧;
<M> Advanced Linux Sound Architecture 對聲卡支持的ALSA驅動的支持;
下面有OSS驅動,只是一部份。如果想用OSS的驅動更全的,可以去買;其它的就看如下的選吧;
<M> Sequencer support
<M> Sequencer dummy client
<M> OSS Mixer API
<M> OSS PCM (digital audio) API[*] OSS Sequencer API
<M> RTC Timer support[*] Verbose printk
[ ] Debug

大多是默認的就好,如果您不知道是做什麼用的,或者怎麼用;

然後我們再向下看有

Generic devices ---> 進入裡面
<M> Dummy (/dev/null) soundcard
<M> Virtual MIDI soundcard
<M> MOTU MidiTimePiece AV multiport MIDI
<M> UART16550 serial MIDI driver
<M> Generic MPU-401 UART driver
ISA devices ---> 如果您用ISA聲卡就在這裡面選;
PCI devices ---> 如果您用PCI聲卡,就在這裡面選,集成聲卡也在這裡;
USB devices ---> 這是USB聲卡內核支持選項;我有一個這樣的聲卡,但沒有試過;
PCMCIA devices ---> 這是PCMCIA聲卡的選項,我還沒有看過這樣的聲卡呢;如果您有,就在這裡面動動手吧。

因為我用的是Intel 集成的聲卡,所以要在PCI中選擇,我們在 中可以看到有兩個與INTEL有關的;
<M> Intel/SiS/nVidia/AMD/ALi AC97 Controller 這個才是Intel AC97聲卡的;
< > Intel/SiS/nVidia/AMD MC97 Modem (EXPERIMENTAL) 這個是機器集成的INTEL貓的蜂鳴器的;

因為我發現如果把貓的蜂鳴器的驅動也選上,可能造成兩個衝突。所以只能選上面的那個;

我們再回到 Open Sound System ---> 中看看,與我用的聲卡是不是有關的?

<M> Open Sound System (DEPRECATED)
<M> Intel ICH (i8xx) audio support
<M> OSS sound modules
<M> Loopback MIDI device support
<M> Microsoft Sound System support

我們也可以看到Open Sound System中也有好多的聲卡驅動,大家根據前面的lspci -v 來選擇吧。


3)對於操作系統所採用的文件系統的支持要編入內核,最好不要編成模塊;(重要)

比如我的Fedora core 4.0 所採用的文件系統用的是ext3 ,所以我要把它直接編入內核;好處是不受模塊丟失或者損壞而不能啟動系統;而有時您把系統所採用的文件系統編譯成模塊,出現VFS錯誤,也有這方面的事, 可能是您沒有把ext3加入到相應的加載模塊的配置文件中,所以我們為了減少麻煩,把風險降到最低,還是要直接置入內模的好;

File systems --->
<*> Ext3 journalling file system support
[*] Ext3 extended attributes
[*] Ext3 POSIX Access Control Lists
[*] Ext3 Security Labels

如果您還有其它的硬盤分區要讀取,比如是reiserfs、ext2、fat、fat32、ntfs等,這樣的可以編成模塊來支持;

再舉一例:如果您的的操作系統用的是reiserfs的文件系統,當然就要把reiserfs的直接編入內核,其它的可以編成模塊來支持了;


4)對於硬盤及RAID的支持,要直接編入內核;

比如ATA、SATA、SCSI及RAID的支持直接內核支持;有時編完內核後,啟動時不能識別硬盤和RAID,大多事情出在這裡;Slackware中 在這方面有的是模塊支持,我們可以把它由模塊M改成內核*來支持; 如果您不明白,就按默認進行;SATA的硬盤的支持除了選中SATA的支持、IDE設備的支持以外,還要選中SCSI的支持;

5)對於咱們所沒有的設備,可以在內核中不選,熟能生巧罷了;

比如我沒有ISDN設備 ,所以就把ISDN去掉;

ISDN subsystem --->
< > Linux telephony support

如果您沒有1394的設備 ,當然可以把1394的支持也去掉;等等。。。。。。。

如果您有USB的設備,要把USB方面好好看看;比如大家常用的移動硬盤;USB貓等,還有掃描儀等;

內核配置就說這麼多吧,太多了,我也說不清楚,水平有限啊;

配置好後先要保存

Save Configuration to an Alternate File

出來一個

Enter a filename to which this configuration ,should be saved as an alternate. Leave blank to abort.
.config

按回車就行了,這樣就保存住了;

然後退出 Exit ,這時也會出現保存 ;

如果你想把.config保存起來,可以再複製一份到安全一點的目錄,以備後用;

五、編譯內核;

[root@localhost linux-2.6.12.3]# make
[root@localhost linux-2.6.12.3]# make modules_install

這樣就編譯好了,並把模塊也安裝在了 /lib/modules目錄中了,請看:

[root@localhost linux-2.6.12.3]# ls /lib/modules/
2.6.11-1.1369_FC4 2.6.12.3


六、安裝內核及配置grub或lilo ;


1、複製bzImage等相關文件,並創建initrd文件;

[root@localhost linux-2.6.12.3]# cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.12.3
[root@localhost linux-2.6.12.3]# cp System.map /boot/System.map-2.6.12.3
[root@localhost linux-2.6.12.3]# cd /boot
[root@localhost linux-2.6.12.3]# /sbin/mkinitrd initrd-2.6.12.3.img 2.6.12.3

我們把 編譯出來的bzImage,拷入到/boot目錄,拷貝成 vmlinuz-2.6.12.3;
並且用 mkinitrd 來創建imitrd-xxx.img 文件,其中xxx為內核的版本號,是通過 查看 /lib/modules來版本來對應的,我們是編譯出來的是 2.6.12.3,所以就運行上面的命令創建,創建的出來的是initrd-2.6.12.3.img ;不創建這個文件,有時是啟動不起來的,比如提示VFS錯誤等;


2、查看系統引導管理器grub或者lilo的配置文件。

如果想要讓新內核能讓系統引導管理器grub和lilo的菜單上能看得到,必須改 grub.conf或者lilo.conf,但我們必須保留老內核的在grub和lilo的啟動菜單,畢竟我們編內核不能百分百的成功,對不對??安全第一吧;

我只說grub的,我沒有lilo,也不會用。所以咱們還是GRUB吧,FC 4 系統引導管理器是 GRUB,所以我們談談GRUB的設置;

查看 /etc/grub.conf;

比如我的grub.conf的內容是這樣的;

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,7)
# kernel /boot/vmlinuz-version ro root=/dev/hda8
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=5
#splashimage=(hd0,7)/boot/grub/splash.xpm.gz
#hiddenmenu
title Fedora Core (2.6.11-1.1369_FC4)
        root (hd0,7)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.11-1.1369_FC4.img
title WinXP
        rootnoverify (hd0,0)
        chainloader +1

我們要把老內核的啟動保留下來,以防不測,我們只加入新的內核的啟動;所以我加上這樣一段;

title Fedora Core (2.6.12.3)
root (hd0,7)
kernel /boot/vmlinuz-2.6.12.3 ro root=LABEL=/ rhgb quiet
initrd /boot/initrd-2.6.12.3.img

咱們再來看一下改過後的配置文件;

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,7)
# kernel /boot/vmlinuz-version ro root=/dev/hda8
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=5
#splashimage=(hd0,7)/boot/grub/splash.xpm.gz
#hiddenmenu
title Fedora Core (2.6.12.3)
        root (hd0,7)
        kernel /boot/vmlinuz-2.6.12.3 ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.12.3.img
title Fedora Core (2.6.11-1.1369_FC4)
        root (hd0,7)
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro root=LABEL=/ rhgb quiet
        initrd /boot/initrd-2.6.11-1.1369_FC4.img
title WinXP
        rootnoverify (hd0,0)
        chainloader +1

然後重新啟動機器,如果出現VFS錯誤,可能就是我寫重要的那個地方出了錯誤;

注意:如果重新啟用內核後,原來安裝的顯示卡驅動,比如 NVIDIA和ATI的驅動還要重新安裝;

後記:

為寫聲卡及其其它硬件設備的安裝教程做準備,重寫此文檔;並更正一些錯誤;

附錄:

1、《內核管理概述》
2、 《Fedora / Redhat 軟件包管理指南》
3、內核主站:http://kernel.org

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Bluelove1968 的頭像
    Bluelove1968

    藍色情懷

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()