自己编译Ubuntu内核
为什么要自己编译Ubuntu内核呢?
Ubuntu的缺省内核安装包的发布版一般会有i386和amd64两个版本,分别对应32位和64位系统。为了保持最大的兼容性,这两个版本的gcc编译参数分别march 386和Pentium4。
但目前大部分的服务器都更换为Core2架构的CPU,支持SSE4以上的指令集,Ubuntu发布的安装包并没有针对Core2 CPU进行优化,浪费了CPU的性能。
因此我们可以从Ubuntu官方的git下载最新发布的源代码,调整优化参数,编译出根据自己CPU优化的版本。
本文其实是参考Peter van der Does的How to compile a Ubuntu Lucid kernel这篇文章编写的,我自己亲自操作过,并且写成了中文。
首先,要安装好一大堆Ubuntu的工具:
apt-get install fakeroot build-essential apt-get install crash kexec-tools makedumpfile kernel-wedge apt-get build-dep linux apt-get install git -core libncurses5 libncurses5-dev apt-get install libelf-dev asciidoc binutils-dev |
然后创建一个目录(例如/data/kernel-core2),通过git获取最新的Ubuntu内核源代码:
cd /data/kernel-core2 git clone git : //kernel .ubuntu.com /ubuntu/ubuntu-maverick . git source |
我这里选择的是Ubuntu当前的发行版本Maverick,你也可以在http://kernel.ubuntu.com/git上选择你喜欢的版本来编译,例如更新的Natty,或者稳定的Hardy。
git会拿到几百兆内核源代码,这些代码放在了我们刚才指定的source目录中。
Ubuntu的源代码每天都有专人更新维护,所以每次下载的时候,其内核小版本都可能会有所改变,我们进去目录检查一下当前最新的版本是啥:
cd source less debian.master /changelog |
通常在第一行,你会看到类似这样的字样:
linux (2.6.35-25.44) maverick-proposed; urgency=low |
那么当前最新版本就是这个了,我们先在本地建立一个新的叫做core2的git分支。
git checkout Ubuntu-2.6.35-25.44 -b core2 |
接下来,我们要建立自己的kernel make config文件,这里要以Ubuntu原来的config文件为基础创建。
原来的config文件都存放在debian.master/config文件中,我们根据实际不同情况进行选择。
- 32位的config存放在i386目录中;
- 32位系统但内存大于4G,要选择config.flavour.generic-pae这个文件,否则3.8G以上的内存将访问不到;
- 64位的config存放在amd64目录中;
- 64位的系统可以根据需要,Desktop选择config.flavour.generic,Server选择config.flavour.server,其Preemption Model等一些选项会有所不同。
下面以64位server为例举例:
cp debian.master /config/amd64/config .flavour.server debian.master /config/amd64/config .flavour.core2 fakeroot debian /rules clean debian /rules updateconfigs |
config文件一定要以config.flavour开头,否则不会被认出。
这样,我们的config文件就准备好了。我们可以开始修改它的编译参数:
debian/rules editconfigs |
输入这条命令后,console会逐个config文件你Y/N,当看到刚刚新建的core2文件时,就可以Y了:
Do you want to edit config: amd64/config.flavour.core2? [Y/n] Y |
然后,进入标准的Linux Kernel make menuconfig的菜单。我们就可以选择自己的优化参数了,特别是下面这组:
Processor type and features ---> Processor family (Generic-x86-64) ---> |
当前有的选项包括Pentium4、Athlon64、Core2和Atom,根据你的CPU进行选择。
然后你还可以顺便把和你系统无关的东西关掉,例如去掉针对AMD CPU的优化,去掉Server系统可能没有的无线网卡等硬件。这么做,可以缩小内核的尺寸。
做完这些选择,退出时选择保存文件,我们的修改就被保存在config.flavour.core2文件中了。
现在,将我们的config文件备份,一会儿要用到。
cp debian.master /config/amd64/config .flavour.core2 ../ |
在正式开始编译前,需要清理git tree:
git reset --hard git clean -xdf |
下面,可以开始准备编译了(下面的操作记得换成你的版本):
cp debian.master /abi/2 .6.35-25.43 /amd64/server debian.master /abi/2 .6.35-25.43 /amd64/core2 cp debian.master /abi/2 .6.35-25.43 /amd64/server .modules debian.master /abi/2 .6.35-25.43 /amd64/core .modules cp debian.master /control .d /vars .server debian.master /control .d /vars .core2 |
把我们刚才备份的config文件放回来:
cp .. /config .flavour.core2 debian.master /config/amd64/ |
修改下面这些文件:
文件:debian.master/etc/getabis
getall amd64 generic server virtual |
修改为:
getall amd64 generic server virtual core2 |
如果你在编译32位内核,请修改i386那一行。
文件:debian.master/rules.d/amd64.mk (如果是32位为i386.mk)
flavours = generic server virtual |
修改为:
flavours = generic server virtual core2 |
文件:debian.master/control.d/vars.core2
前面几行修改为:
arch="amd64" supported="Core2" target="Geared toward 64 bit Intel Core2 server systems." desc="x86_64" |
然后我们在本地commit git:
git add . git commit -a -m "Core2 modifications" |
下面,我们终于可以开始编译内核了,编译之前,应该先做一次make clean。
fakeroot debian /rules clean |
编译好的deb打包文件,会存放在source目录上一层,我们这次的例子就是/data/kernel-core2/。
生成independent包:
skipabi= true skipmodule= true fakeroot debian /rules binary-indep |
这个命令会生成以下几个文件:
linux-source-2.6.35_2.6.35-25.44_all.deb linux-doc_2.6.35-25.44_all.deb linux-tools-common_2.6.35-25.44_all.deb linux-headers-2.6.35-25_2.6.35-25.44_all.deb |
生成内核文件:
skipabi= true skipmodule= true fakeroot debian /rules binary-core2 |
这个命令会生成下面两个文件:
linux-image-2.6.35-25-core2_2.6.35-25.44_amd64.deb linux-headers-2.6.35-25-core2_2.6.35-25.44_amd64.deb |
现在deb包已经生成出来了,理论上你可以把这些包安装到任何debian和ubuntu的版本上面运行。
安装命令是:
dpkg -i linux-headers-2.6.35-25-core2_2.6.35-25.44_amd64.deb linux-headers-2.6.35-25_2.6.35-25.44_all.deb linux-image-2.6.35-25-core2_2.6.35-25.44_amd64.deb |
安装后,修改grub的启动参数,通常在/boot/grub/grub.cfg或这/boot/grub/menu.lst。
重启,看看你的/proc/version是不是已经变成了新的内核版本。然后运行一下benchmark程序吧。
我自己的经验是,浮点运算能力提高最大!