版本: 1.0LXLLinux联盟 作者: Falko Timme <ft [at] falkotimme [dot] com>LXLLinux联盟 翻译: Ken Zhao <cn.zhaoke.com>LXLLinux联盟 原文: http://www.howtoforge.com/kernel_compilation_fedoraLXLLinux联盟 中文: http://blog.zhaoke.com/5.htmlLXLLinux联盟 最后更新 11/10/2006LXLLinux联盟 中文最后更新 11/16/2006LXLLinux联盟 每一个Linux发行版都有自己专门的工具去构建自定义的内核. 本文主要介绍在Fedora平台上编译内核, 如何从www.kernel.org(也叫vanilla kernel)获得最新且未改动的内核源代码来构建一个自定义的内核, 这样你可以使用自己的内核而不是发行版的内核, 另外也介绍了如何给内核打补丁, 从而方便增加新的功能.LXLLinux联盟 下面的工作我都在Fedora Core 6上经过了测试.LXLLinux联盟 我想首先要说的是文章中构建自定义内核的方式不是唯一的, 还有许多其它的方式, 这不过是我习惯的方式. 我不能保证使用后不会出现任何问题.LXLLinux联盟 1. 预备工作LXLLinux联盟 本文我将描述在Fedora平台上构建自定义内核的两种方式. 第一种是Fedora方式, 最后你将能获得一个内核rpm包, 从而可以方便地与他人分享. 第二种是传统方式, 适用于所有linux发行版, 不过最后你不会有一个rpm包.LXLLinux联盟 我推荐使用root用户做下面所有的步骤. 然而, 有时也需要使用非超级用户(比如用户tom)来运行一些命令, 所以你可能会使用visudo编辑器在/etc/sudoers文件中添加下面一行:LXLLinux联盟 tom ALL=(ALL) ALLLXLLinux联盟 现在无论什么时候你需要用root权限运行命令, 比如:LXLLinux联盟 yum install fedora-rpmdevtools unifdef LXLLinux联盟 你都可以用下面的命令来替代:LXLLinux联盟 sudo yum install fedora-rpmdevtools unifdefLXLLinux联盟 请记住: 如果以root用户身份运行所有命令, 你可以完全忘记sudo. 采用什么方式, 看你自己的习惯.LXLLinux联盟 2. 构建rpm内核包LXLLinux联盟 这一小节介绍如何构建内核, 最终你可以得到一个rpm包, 这样可以方便安装或与他人分享.LXLLinux联盟 2.1 创建你的rpmbuild目录LXLLinux联盟 按下面创建你的rpmbuild目录:LXLLinux联盟 cd ~LXLLinux联盟 cp -a /usr/src/redhat/ rpmbuildLXLLinux联盟 echo '%_topdir %(echo $HOME)/rpmbuild' >> .rpmmacros LXLLinux联盟 然后安装构建rpm包需要的应用软件包LXLLinux联盟 yum install fedora-rpmdevtools unifdefLXLLinux联盟 然后运行LXLLinux联盟 fedora-buildrpmtreeLXLLinux联盟 2.2 下载和安装Fedora内核src.rpm包LXLLinux联盟 接下来为我们的Fedora版本下载最新的内核src.rpm包. 针对Fedora Core 6, 你可以从接下来的网址获得src.rpm包: http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/, 针对Fedora Core 5, 你可以从下面的网址获得src.rpm包: http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/, 等等. LXLLinux联盟 最新的Fedora Core 6内核src.rpm包是kernel-2.6.18-1.2798.fc6.src.rpm, 所以我们现在下载和安装它:LXLLinux联盟 cd /usr/srcLXLLinux联盟 wget http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpmLXLLinux联盟 rpm -ivh kernel-2.6.18-1.2798.fc6.src.rpmLXLLinux联盟 如果你看到这些警告:LXLLinux联盟 warning: user brewbuilder does not exist - using rootLXLLinux联盟 warning: group brewbuilder does not exist - using rootLXLLinux联盟 你可以忽略它们.LXLLinux联盟 我们已经成功安装了最新的2.6.18.1内核源代码包. 如果我们继续构建内核源代码包的话, 我们的内核版本将是2.6.18.1.LXLLinux联盟 2.3 给内核打补丁LXLLinux联盟 我想安装新内核2.6.18.2来替代2.6.18.1. 系统已经安装的src.rpm包是给2.6.18打过补丁的2.6.18.1. 而我们现在将使用打补丁的方式升级内核到2.6.18.2LXLLinux联盟 cd ~/rpmbuild/SOURCES/LXLLinux联盟 wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.18.2.bz2LXLLinux联盟 如果你想内核的名字结尾为2.6.19-rc5, 你也可以使用prepatch包http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2. 请注意这项工作仅对prepaches有效. 比如. 内核补丁仅对最终发行的内核版本有效, 比如2.6.19内核. 你可以给2.6.18内核源代码打补丁, 但不能是2.6.18.1或2.6.18.2, 等. 这个规则在接下来的网页中注明: http://kernel.org/patchtypes/pre.htmlLXLLinux联盟 prepatches等同于linux中的测试发行; 他们位于存档的测试目录中, 我们可以使用patch(1)工具对上一个完整发行版(版本号分三部分)打补丁(例如, 2.6.13-rc4 prepatch只可以给2.6.11内核源代码打补丁, 而不是2.6.11.10.)LXLLinux联盟 现在我们必须修改kernel-2.6.spec文件, 让它知道我们使用了新的内核补丁:LXLLinux联盟 cd ~/rpmbuild/SPECS/LXLLinux联盟 vi kernel-2.6.specLXLLinux联盟 搜寻下面行LXLLinux联盟 Patch1: patch-2.6.18.1.bz2LXLLinux联盟 替换为下面的内容:LXLLinux联盟 Patch1: patch-2.6.18.2.bz2LXLLinux联盟 (或者其它你已下载的版本)LXLLinux联盟 然后运行LXLLinux联盟 rpmbuild -bp kernel-2.6.specLXLLinux联盟 (如果你想构建其它平台如i386, i586, i686或者x86_64的内核, 你可以通过运行下面的命令来实现:LXLLinux联盟 rpmbuild -bp --target=i686 kernel-2.6.specLXLLinux联盟 我没有在上面例子中指定为i386, 你的系统可能是其它的平台类型, 请记得填写你的平台类型.)LXLLinux联盟 现在我们进入到关键的部分. src.rpm有很多fedora专门的补丁, 其中一些不能与我们的2.6.18.2补丁很好的工作, 所以如果你在rpmbuild输出看到下面状况:LXLLinux联盟 + echo 'Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):'LXLLinux联盟 Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):LXLLinux联盟 + patch -p1 -sLXLLinux联盟 Reversed (or previously applied) patch detected! Assume -R? [n]LXLLinux联盟 Apply anyway? [n]LXLLinux联盟 1 out of 1 hunk ignored -- saving rejects to file drivers/block/DAC960.c.rejLXLLinux联盟 error: Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)LXLLinux联盟 RPM build errors:LXLLinux联盟 Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)LXLLinux联盟 这时候你必须再次编辑kernel-2.6.spec文件, 注解掉patch #300一行:LXLLinux联盟 vi kernel-2.6.specLXLLinux联盟 [...]LXLLinux联盟 #Patch300: linux-2.6-ppc-dac960-ipr-clash.patchLXLLinux联盟 [...]LXLLinux联盟 #%patch300 -p1LXLLinux联盟 [...]LXLLinux联盟 然后再运行rpmbuild命令, 比如:LXLLinux联盟 rpmbuild -bp kernel-2.6.specLXLLinux联盟 注意: 你必须不断重复上面过程直到不出现任何错误.LXLLinux联盟
|