zoukankan      html  css  js  c++  java
  • 内核管理 之 编译内核操作流程 ──为新手指南

    作者:北南南北
    来自: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

  • 相关阅读:
    Spring@Profile注解
    day 32 子进程的开启 及其用法
    day 31 udp 协议SOCK_DGRAM
    day 30 客户端获取cmd 命令的步骤
    day 29 socket 理论
    day 29 socket 初级版
    有关 组合 继承
    day 27 多态 接口 类方法 静态方法 hashlib 摘要算法模块
    新式类和经典类的区别
    day 28 hasattr getattr serattr delattr 和带__内置__ 类的内置方法
  • 原文地址:https://www.cnblogs.com/licheng/p/1047331.html
Copyright © 2011-2022 走看看