第2章 配置与编译内核

来源:互联网 发布:淘宝摩托车配件 编辑:程序博客网 时间:2024/05/22 02:26

配置内核


几种配置方式


1. make config


基于文本的最为传统的也是最为枯燥的一种配置方式,但是它可以适应任何情况。这种方式会为每一个内核支持的特性向用户提问。如果用户回答“y”,

则把该特性编译进内核;回答“m”,则该特性作为模块进行编译;回答“n”,则表示不对该特性提供支持。


2.make oldconfig


make oldconfig与make config类似,但是它的作用是在现有内核设置文件基础上建立一个新的设置文件,只会向用户提问有关新内核特性的问题。


3.make menuconfig


基于终端的一种配置方式,提供了文本模式的图形用户界面,用户可以通过移动光标来浏览内核所支持的各种特性。使用这种配置方式时,系统中必须

已经安装有ncurses库,否则会显示“Unable to find the Ncurses libraries.”的错误提示。


4.make xconfig


基于X Windows的一种配置方式,提供了漂亮的配置窗口,不过只有能够在X Server上使用root用户运行X应用程序时,才可以使用。它依赖于QT,如果

系统中没有安装QT库,则会出“Unable to find the QT installation.”的错误提示。


5.make gconfig


与make xconfig类似,不同的是make gconfig依赖于GTK库。


6.make defconfig


按照默认的配置文件arch/i386/defconfig对内核进行配置,生成的.config可以用作初始配置,然后在使用make menuconfig进行定制化配置。


7.make allyesconfig


尽可能多地使用“y”设置内核选项值,生成的配置中包括了全部的内核特性。


8.make allmoconfig


尽可能多地使用“m”设置内核选项值来生成配置文件。


.config文件


不论采用哪种方式配置内核,最终的目的都是为了生成.config文件,.config文件位于内核源码树的顶层目录。


1.找一个旧的.config文件作参考

内核配置选项众多,即使使用漂亮的窗口界面去配置,也是相当的麻烦,所以我们最好找一个旧的.config文件作为参考,在这个.config文件的基础上

执行make menuconfig等配置命令进行调整,生成新的.config文件。

当然,寻找这个作为参考的.config文件时是需要有的放矢的,一般来说,可以有如下几种途径。

使用make defconfig得到参考.config文件,它其实利用了arch/i386/defconfig文件。

利用系统中/lib/modules/<kernel-version>/build目录下的.config文件。

使用当前系统的配置文件,一般位于/boot目录中。

到网上搜索下载别人配置好的.config文件。

使用某个发行版提供的.config文件。


2.直接修改.config文件

如果只是对内核所支持的特性进行微调,则可以直接修改现有的.config文件而不需要使用前面所述的配置方式。.config文件中每个配置选项的值只能

取“y”和“m”两者之一,如果这个特性不再支持,将其对应的选项注释掉即可。


3.备份、重用.config文件

通常我们需要将生成的.config文件备份,以备后用。


编译内核


准备工作


1.需要了解的基础知识

首先我们需要了解系统中与编译过程有关的目录及文件

/boot/vmlinuz-<version>:用于启动的压缩内核镜像

/boot/system.map-<version>:存储内核符号表

/boot/initrd.img-<version>:一个镜像文件,类似ramdisk,它将一些驱动程序和命令工具打包到img里,然后在开机的时候在内存里开辟一段区域,

释放到那里运行。

它的作用是,在没有mount根分区(/)以前,系统要执行一些操作,此时就把initrd释放到内存里,作一个虚拟的/,然后执行其根目录下的脚本,运行

insmod等命令加载模块。

/boot/grub/menu.lst:GRUB的配置文件(不同的发行版中它可能位于不同位置)。

/lib/modules:该目录包含了内核模块(包括系统自带的和自己编译的)及其他文件,不同的子目录由内核版本号来区分。

/lib/modules/<kernel-version>/build/:存放编译新模块所需的文件,包括了Makefile、.config、modules.symVers(模块符号信息)以及内核头文件等。

/lib/modules/<kernel-version>/kernel/:存放模块的ko文件。

/lib/modules/<kernel-version>/modules.alias:模块别名定义,模块加载工具使用它来加载相应的模块。

/lib/modules/<kernel-version>/modules.dep:定义了模块间的依赖关系。

/lib/modules/<kernel-version>/modules.symbols:标识符号属于哪个模块


2.下载内核源码压缩包

需要注意下载保bz2格式的压缩包时,需要安装bzip2工具进行解压。


3.获取相关补丁

如果需要的某些特性并没有被现有内核支持,则需要去获取相关的补丁。


4.构建编译环境

编译内核需要用到一系列的工具,在编译之前,我们需要确保它们已经被安装。


5.备份

当修改内核时,我们必须准备一个能够启动的备用内核。


如何为内核打补丁


什么是补丁


一个补丁就是一个文本文档,有diff工具创建,它存放了两个不同版本的源代码之间的差异。为了正确地应用一个补丁,我们需要知道这个补丁

文件是以哪个版本为基础产生出来的,以及它将把目前的源代码变化到什么新的版本,简单地说,就是需要清楚产生这个补丁文件的两个源码

版本的情况。


如何打补丁和卸载补丁


patch工具可以用于打补丁和卸载补丁。内核的补丁是相对于保存内核源码的父目录而生成的,这就意味着,补丁文件中的文件路径包含了内核

源码存放目录的名字。但是很可能我们本地系统上的内核源码存放目录和补丁中不匹配,为了解决这个问题,我们需要切换到自己的源码目录,

并且在执行patch命令的时候加上“-pl”参数,这样就会去掉补丁文件中路径的第一个分量。

为了卸载一个以前打上的补丁,需要使用“-R”参数。


编译步骤


(1)下载源码并解压

(2)如果需要的话,下载补丁

(3)进入刚刚解压的内核源码目录

(4)如果需要的话,为内核打补丁

(5)配置内核

(6)编译内核

(7)安装内核模块

(8)安装内核

make install主要完成了3个工作。

复制生成的内核映像到/boot目录。在内核编译完成后,源码树目录arch/i386/boot/中会生成一个bzImage文件,该文件被复制到/boot目录并重命名

为vmlinuz-2.6.23.

生成initrd-<kernel-version>.img文件

配置引导程序

(9)重启进入新内核


编译小技巧


(1)屏蔽编译信息

(2)加速编译过程

可以使用“-j<n>”参数,其中n=2*CPU的个数,对于一般的单CPU系统,通常用是使用“-j2”参数,为编译过程分配两个任务,这样在进行磁盘I/O操作

时候,CPU就不会空闲了。

(3)使用verbose模式,将每一步执行的命令都打印出来,并重定向到一个文件中去,这样以后可以方便地查找模块之间的依赖关系。

(4)使用ccache提高编译速度。使用ccache时,需要更改源码树根目录下面的Makefile文件,在CC和HOSTCC变量的定义前添加ccache。

0 0