Username: Password:

编译内核操作流程 ──为新手指南
来源: ChinaUnix博客  作者: 发布时间:2008-04-25 02:46:47


作者:北南南北
来自: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 --->
Sound card support 声卡的支持,这个是一定要选中的吧;
Advanced Linux Sound Architecture 对声卡支持的ALSA驱动的支持;
下面有OSS驱动,只是一部份。假如想用OSS的驱动更全的,能够去买;其他的就看如下的选吧;
Sequencer support
Sequencer dummy client
OSS Mixer API
OSS PCM (digital audio) API
  • OSS Sequencer API
    RTC Timer support
  • Verbose printk
    [ ] Debug
    大多是默认的就好,假如您不知道是做什么用的,或怎么用;
    然后我们再向下看有
    Generic devices ---> 进入里面
    Dummy (/dev/null) soundcard
    Virtual MIDI soundcard
    MOTU MidiTimePiece AV multiport MIDI
    UART16550 serial MIDI driver
    Generic MPU-401 UART driver
    ISA devices ---> 假如您用ISA声卡就在这里面选;
    PCI devices ---> 假如您用PCI声卡,就在这里面选,集成声卡也在这里;
    USB devices ---> 这是USB声卡内核支持选项;我有一个这样的声卡,但没有试过;
    PCMCIA devices ---> 这是PCMCIA声卡的选项,我还没有看过这样的声卡呢;假如您有,就在这里面动动手吧。
    因为我用的是Intel 集成的声卡,所以要在PCI中选择,我们在 中能够看到有两个和INTEL有关的;
    Intel/SiS/nVidia/AMD/ALi AC97 Controller 这个才是Intel AC97声卡的;
    Intel/SiS/nVidia/AMD MC97 Modem (EXPERIMENTAL) 这个是机器集成的INTEL猫的蜂鸣器的;
    因为我发现假如把猫的蜂鸣器的驱动也选上,可能造成两个冲突。所以只能选上面的那个;
    我们再回到 Open Sound System ---> 中看看,和我用的声卡是不是有关的?
    Open Sound System (DEPRECATED)
    Intel ICH (i8xx) audio support
    OSS sound modules
    Loopback MIDI device support
    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


  • 喜欢本文,那就收藏到:

      Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
    相关评论  我也要评论
    还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅