购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.4 内核编译与定制

1.4.1 获得Linux内核与补丁

要编译Linux,首先当然是要获得Linux的内核源码。最新的Linux官方源码是可以从 www.kernel.org 或其映像站点取得,而最新3.x版本一般放在/pub/linux/kernel/v3.0/,其在官方网站上的目录索引如图1-3所示。

将下载的内核源代码放在Linux系统目录文件夹/usr/src/中。本书用以下命令下载最新3.19.3内核源码包。


cd  /usr/src/
sudo wget http:// www.kernel.org/pub/linux/kernel/v3.0/linux-3.19.3.tar.xz
  

下载Linux 3.19.3内核补丁,其在官方网站上的目录索引如图1-4所示。

图1-3 Linux内核网页目录索引

图1-4 Linux内核补丁网页目录索引

下载补丁的命令如下:


cd  /usr/src/
sudo wget http:// www.kernel.org/pub/linux/kernel/v3.0/patch-3.19.3.xz
  

1.4.2 准备编译需要的工具

要想顺利完成内核编译,首先要检查或安装必要的工具:

1)安装gcc、make等编译工具:


apt-get install build-essential

2)安装执行make menuconfig时必需的库文件:NCurses(libncurses5-dev或ncurses-devel),这是当make menuconfig时用作生成菜单窗口的程序库:


apt-get install libncurses-dev
apt-get install kernel-package

3)安装Linux系统生成kernel-image的一些配置文件和工具:


apt-get install fakeroot
apt-get install initramfs-tools, module-init-tools

4)在编译Linux内核时,一般还需要以下工具(这些工具是可选的):

·GNU C++Compiler(g++或gcc-c++):编译make xconfig使用的Qt窗口时需要。

·Qt 3(qt-devel或qt3-devel):make xconfig时用作Qt窗口的程序库。

·GTK+(gtk+-devel):make gconfig时用作GTK+窗口的程序库。

·Glade(libglade2-devel):要编译make gconfig时的GTK+窗口时需要。

在Ubuntu系统中,我们可以使用下面的命令来获得相关的软件包:


apt-get update
apt-get install libncurses5-dev wget bzip2

1.4.3 解压内核

如果下载了GNU Zip格式的Linux核心源代码压缩档(文件扩展名称为*.tar.gz),可以用指令“tar-xzvf linux-版本编号.tar.gz”解压,例如:


tar -xzvf  linux-3.19.3.tar.gz

如果下载了BZip2的Linux核心源代码压缩档(文件扩展名称为*.tar.bz2),可以用指令“tar-xjvf linux-版本编号.tar.bz2”解压,本文下载的是bz2的压缩包,如下所示:


tar -xjvf  linux-3.19.3.tar.bz2

我们下载的文件拓展名为*.tar.xz,可以用指令“tar-xvf linux-版本编号.tar.xz”解压,如下所示:


tar -xvf  linux-3.19.3.tar.xz

把源码包解压到/usr/src中,通过运行解压命令,发现/usr/src中多了一个linux-3.19.3文件夹,如图1-5所示。

图1-5 内核解压后的文件夹

1.4.4 给内核打补丁

这一步在内核的编译过程中是可选的,如果你对内核有特殊的要求,可以将自己写的补丁“打”到内核中。

对于本章中所下载的linux-3.19.3内核源代码包在PC上编译是不需要这一步骤的。如果读者有新的要求,可以写补丁包,如对当前的linux-3.19.3制作的补丁包(文件名为patch-3.19.3.xz),可以使用patch命令给Linux内核源代码打入补丁,输入命令如下:


cd linux-3.19.3
xzcat ../patch-3.18.3.xz | patch -p1

由于我们是在PC上进行的Linux内核API验证,这一步骤可省略。

1.4.5 设定编译选项

当编译Linux内核时,其中一个最重要的步骤就是如何定制新内核的配置选项,哪些是必选的,哪些要编译成可加载模块(Loadable Modules),进行动态加载,哪些不需要编译进新内核中。这些要根据使用的具体情况而定,定制的原则是:在满足功能需求的前提下,使新内核占用空间最少、耗费资源最少、运行速度最快。

在定制编译选项时,Linux系统提供了多个方法进行设定编译选项:

·config

·menuconfig

·xconfig

·gconfig

·oldconfig

也可以通过以下命令来取得旧编译选项(注意,如果是初学者编译Linux内核,可以与旧的编译选项进行对比选择):


cp /boot/config-`uname -r` .config

配置make config终端问答文字格式的编译选项,make menuconfig菜单选项格式的配置界面,如图1-6所示,在这里可以通过键盘来设置各个选项。

图1-6 make menuconfig编译选项界面

make xconfig为基于QT/Tcl的图形配置界面,如图1-7所示;make gconfig为基于GTK+的图形配置界面,如图1-8所示。以上两个基于图形界面的编译选项可通过鼠标操作编译选项,操作比较方便。

图1-7 make xconfig编译选项界面

图1-8 make gconfig编译选项界面

make oldconfig命令只选择新编译选项。一般情况下,当编译Linux内核时,执行make menuconfig弹出对话框,可以对内核的编译选项进行新的设定,并生成一个.config文件,make的时候就是根据.config的设定值进行编译内核。如果再重新执行make menuconfig,内核编译选项又重新回到了以前的默认值。当我们设定了内核编译选项之后,执行make oldconfig命令就可以保存前面设定好的内核编译配置选项。当下次再执行make menuconfig命令时,出现的设定就是前一次的设定内容。

注意 如果是在PC下,没有特殊的要求,初学者编译内核时可以先选择“默认”的编译选项,如果出现问题,可以对照旧的编译配置文件,逐步查找并解决问题。

1.4.6 编译与安装内核

首先用make mrproper命令清除所有旧的配置和旧的编译目标等文件:


cd /usr/src/linux-3.19.3
make mrproper

接着执行命令make来编译内核,在默认情况下,make是一个顺序执行的工具。它按次序调用底层编译器来编译C/C++源文件。在某些情况下,有的源文件不需要以其他源文件为基础即可编译,这时可以使用-j选项调用make来完成并行编译操作。make指令格式如下:


make -jn

n代表同时编译的进程,可以加快编译速度,n由用户计算机的配置与性能决定,当前的典型值为10。make编译内核过程如图1-9所示。

图1-9 make编译内核过程

经过上面的编译内核的步骤,会在目录arch/x86/boot目录下生成名为“bzImage”的文件,如图1-10所示,这就是编译出来的新内核。为方便管理,需要把它移动至目录/boot中,并改名为“vmlinuz-核心版本”。为保存编译选项方便日后参考,同时也要把.config复制至/boot及改名为“config-核心版本”。我们可以通过输入命令make install来完成这些步骤:


make install

图1-10 生成bzImage

接下来执行命令:


make modules

进行编译模块,如图1-11所示。

图1-11 编译模块

最后执行命令:


make modules_install

make modules_install是将内核模块安装到/lib/modules中,其执行过程如图1-12所示。

1.4.7 创建initramfs

为了在initramfs中添加指定kernel的驱动模块,内核模块3.19.3需要创建initramfs的kernel版本号,如果是给当前kernel制作initramfs,可以使用uname-r查看当前的版本号。mkinitramfs会把/lib/modules/${kernel_version}/目录下的一些启动时需要使用的模块添加到initramfs中。本实例中通过执行以下命令来实现:


mkinitramfs -o /boot/initrd.img-3.19.0  /lib/modules/3.19.0

图1-12 内核模块的安装过程

1.4.8 设置grub

在/boot/grub文件夹中的menu.list中添加项,具体请参考menu.lst原来的grub引导项,如图1-13所示,其中黑色部分是添加内容,其中第166行:


UUID=a46c7f7a-3ab7-4fbe-b6ba-0b8f1a21297c

这一串数据根据不同的机器可能不同。

图1-13 添加grub引导项

1.4.9 启动选项

重新启动系统后,进入启动选项目录,如图1-14所示,其中“Ubuntu,Linux 3.19.0”就是新加入的启动选项。

图1-14 运行新内核之前启动选项目录

图1-15为运行新内核启动之后uname显示的内核版本,可以看出新内核已经正常工作了。

图1-15 运行新内核之后 P8GyD8GlY0iFg1ns06tQ7I6+oi7ytTBJu+PIlnI0c4F3IiZAguRBhBEmZq6KTJnt

点击中间区域
呼出菜单
上一章
目录
下一章
×