![Linux内核API完全参考手册(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/429/841429/b_841429.jpg)
1.4 内核编译与定制
1.4.1 获得Linux内核与补丁
要编译Linux,首先当然是要获得Linux的内核源码。最新的Linux官方源码是可以从www.kernel.org或其映像站点取得,而最新3.x版本一般放在/pub/linux/kernel/v3.0/,其在官方网站上的目录索引如图1-3所示。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0015_0001.jpg?sign=1739284029-OgR5m3ldHZkFIKceHKdNoo2PdTuOeZz7-0-5ebd6ba791b58b032d8342d15022b440)
图1-3 Linux内核网页目录索引
将下载的内核源代码放在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所示。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0015_0002.jpg?sign=1739284029-Vk0tg9xuxvUZeUhASSfjaW2icRtkPuGy-0-e487e3180759115accca0b5500c29093)
图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 menuconf ig时必需的库文件:NCurses(libncurses5-dev或ncurses-devel),这是当make menuconf ig时用作生成菜单窗口的程序库:
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 xconf ig使用的Qt窗口时需要。
❑Qt 3 (qt-devel或qt3-devel):make xconf ig时用作Qt窗口的程序库。
❑GTK+ (gtk+-devel):make gconf ig时用作GTK+ 窗口的程序库。
❑Glade (libglade2-devel):要编译make gconf ig时的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所示。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0016_0001.jpg?sign=1739284029-kNyxTUoewPO3pfqj39B3o0FaXZLvDfqE-0-1271e23d09086a2fb800f3f430d6fe09)
图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 conf ig终端问答文字格式的编译选项,make menuconf ig菜单选项格式的配置界面,如图1-6所示,在这里可以通过键盘来设置各个选项。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0017_0001.jpg?sign=1739284029-1RbHuuyDkHW2jxJ4hht9WAhHrP4EPyJf-0-e30712215e4f0588b1132e7d258dbce5)
图1-6 make menuconf ig编译选项界面
make xconf ig为基于QT/Tcl的图形配置界面,如图1-7所示;make gconf ig为基于GTK+的图形配置界面,如图1-8所示。以上两个基于图形界面的编译选项可通过鼠标操作编译选项,操作比较方便。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0018_0001.jpg?sign=1739284029-MQsqfHjGzTNy5gxVohLOWUMwqzB5I6BJ-0-b30326e8e806fd6a13c477b6389a3f80)
图1-7 make xconf ig编译选项界面
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0018_0002.jpg?sign=1739284029-FGYGo8Vb2RpXNuOUV2IMdJZiLX8o9845-0-b0fd43231a3a67b639c7173fc471bc68)
图1-8 make gconf ig编译选项界面
make oldconf ig命令只选择新编译选项。一般情况下,当编译Linux内核时,执行make menuconf ig弹出对话框,可以对内核的编译选项进行新的设定,并生成一个.conf ig文件,make的时候就是根据.conf ig的设定值进行编译内核。如果再重新执行make menuconf ig,内核编译选项又重新回到了以前的默认值。当我们设定了内核编译选项之后,执行make oldconf ig命令就可以保存前面设定好的内核编译配置选项。当下次再执行make menuconf ig命令时,出现的设定就是前一次的设定内容。
注意
如果是在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所示。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0019_0001.jpg?sign=1739284029-RtsBZDoVB39OwvJL7GmuLbXwEnJIKYy0-0-37139bb8c83fe95b6448e50bbd0ed8da)
图1-9 make编译内核过程
经过上面的编译内核的步骤,会在目录arch/x86/boot目录下生成名为“bzImage”的文件,如图1-10所示,这就是编译出来的新内核。为方便管理,需要把它移动至目录/boot中,并改名为“vmlinuz-核心版本”。为保存编译选项方便日后参考,同时也要把.conf ig复制至/boot及改名为“conf ig-核心版本”。我们可以通过输入命令make install来完成这些步骤:
make install
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0020_0001.jpg?sign=1739284029-HYDb6Kat7Lq3pDxwvl385LJ4S8m4MLxm-0-71cbed77ef12673a182053e37fe58ae4)
图1-10 生成bzImage
接下来执行命令:
make modules
进行编译模块,如图1-11所示。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0020_0002.jpg?sign=1739284029-mHKfLykyenKesjxQKjgMAVjdNrSTLGEL-0-187dfaefe4bfd58d65f7508f1e688885)
图1-11 编译模块
最后执行命令:
make modules_install
make modules_install是将内核模块安装到/lib/modules中,其执行过程如图1-12所示。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0021_0001.jpg?sign=1739284029-s7evZsLOa2UNovtpoZoPjshrvp06aILc-0-82bb25d0199b27d552d5b050904b7b29)
图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.4.8 设置grub
在/boot/grub文件夹中的menu.list中添加项,具体请参考menu.lst原来的grub引导项,如图1-13所示,其中黑色部分是添加内容,其中第166行:
UUID=a46c7f7a-3ab7-4fbe-b6ba-0b8f1a21297c
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0021_0002.jpg?sign=1739284029-9ijk6ixvYGaNmNTRsCk4GeMV4YKlLTSi-0-ad53b32a9ad21aca2c2a284812b60549)
图1-13 添加grub引导项
这一串数据根据不同的机器可能不同。
1.4.9 启动选项
重新启动系统后,进入启动选项目录,如图1-14所示,其中“Ubuntu, Linux 3.19.0”就是新加入的启动选项。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0022_0001.jpg?sign=1739284029-aQa5389oF9i6FbF5w1T6vxyqMnn5W0Ns-0-bf477d4ce08b896601f69cdefdb80729)
图1-14 运行新内核之前启动选项目录
图1-15为运行新内核启动之后uname显示的内核版本,可以看出新内核已经正常工作了。
![](https://epubservercos.yuewen.com/9BFB8E/6718796004473701/epubprivate/OEBPS/Images/figure_0022_0002.jpg?sign=1739284029-3aDlc7w13UgpiG9yt65RvmdWaDRDyKSw-0-9c6b41e6061496efba252d81459bdaef)
图1-15 运行新内核之后