如何编译内核 - Fedora方式

如何编译内核 - Fedora方式 每个发行版都有一些特定的工具来从源代码构建一个自定义内核。这篇文章是关于c ...

如何编译内核 - Fedora方式

版本1.0
作者:Falko Timme

每个发行版都有一些特定的工具来从源头构建定制内核。 本文是关于在Fedora系统上编译内核的。 它描述了如何使用www.kernel.orgvanilla内核 )中最新的未修改的内核源构建定制内核,以使您独立于您的发行版提供的内核。 它还显示如果您需要不在其中的功能,如何修补内核源。

我已经在Fedora Core 6上测试过了。

我想先说说这不是建立这样一个系统的唯一途径。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!

1初步说明

在本文中,我将介绍构建Fedora系统内核的两种方法。 第一个是Fedora特定的,最后你将有一个内核rpm包,你可以安装或与他人共享。 第二种方式对于所有的Linux发行版都是一样的,但是最终没有使用rpm包。

我更喜欢以root用户身份执行所有步骤。 但是,可以以非特权用户(例如,用户tom )运行大多数命令。 某些命令(如yumrpm)仍然需要root权限,因此您应该通过运行tomcat(或用户名或其他用户名)添加到/ etc / sudoers

visudo

添加这一行:

tom  ALL=(ALL) ALL

现在,当您运行需要root权限的命令时,例如

yum install fedora-rpmdevtools unifdef

命令会告诉你,你必须跑

sudo yum install fedora-rpmdevtools unifdef

代替。 记住:如果以root身份运行所有命令,您可以忘记sudo 。 这取决于你喜欢哪种方式。

2构建内核rpm包

本章介绍如何构建一个内核,最后使用可以安装并与其他人共享的rpm包。

2.1创建您的rpmbuild目录

创建您的rpmbuild目录如下:

cd ~
cp -a /usr/src/redhat/ rpmbuild
echo '%_topdir %(echo $HOME)/rpmbuild' >> .rpmmacros

然后安装所需的软件包来构建rpm软件包

yum install fedora-rpmdevtools unifdef

并运行

fedora-buildrpmtree

2.2下载并安装Fedora Kernel src.rpm

接下来我们为Fedora版本下载最新的内核src.rpm。 对于Fedora Core 6,src.rpm软件包位于http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/中 ,对于Fedora Core 5,它是http://下载.fedora.redhat.com / pub / fedora / linux / core / 5 / source / SRPMS /等等。

最新的Fedora Core 6内核src.rpm是kernel-2.6.18-1.2798.fc6.src.rpm ,所以我们现在下载并安装它:

cd /usr/src
wget http://download.fedora.redhat.com/pub/fedora/linux/core/6/source/SRPMS/kernel-2.6.18-1.2798.fc6.src.rpm
rpm -ivh kernel-2.6.18-1.2798.fc6.src.rpm

如果您看到这些警告:

warning: user brewbuilder does not exist - using root
warning: group brewbuilder does not exist - using root

你可以忽略它们。

我们刚刚安装了2.6.18内核的内核源以及许多Fedora补丁和内核2.6.18.1的补丁,所以如果我们继续从这个src.rpm构建一个内核,我们最终会得到内核2.6。 18.1

2.3补丁内核

而不是内核2.6.18.1我想安装内核2.6.18.2 。 我们安装的src.rpm内核2.6.18加上内核2.6.18.1的补丁。 我们现在将用内核2.6.18.2的补丁替换该补丁。

cd ~/rpmbuild/SOURCES/
wget http://www.kernel.org/pub/linux/kernel/v2.6/patch-2.6.18.2.bz2

你也可以使用http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc5.bz2 prepatch,如果你想结束内核2.6.19-rc5 。 请注意,这只适用于prepatches,即内核最终版本不可用的补丁,例如2.6.19内核。 您可以将该修补程序应用于2.6.18内核源代码,但不适用于2.6.18.1或2.6.18.2等内核。这一点在http://kernel.org/patchtypes/pre.html中有所解释

Prepatches相当于Linux的alpha版本; 他们住在档案馆的测试目录中。 应使用补丁(1)实用程序将其应用于以前完整版本的源代码,具有3部分版本号(例如,2.6.12-rc4 prepatch应该应用于2.6.11内核源,而不是,例如,2.6.11.10。)

现在我们必须修改kernel-2.6.spec文件,以便它知道我们的新内核补丁:

cd ~/rpmbuild/SPECS/

vi kernel-2.6.spec

搜索该行

Patch1: patch-2.6.18.1.bz2

并用以下替代:

Patch1: patch-2.6.18.2.bz2

(或任何您之前下载的补丁)。

然后跑

rpmbuild -bp kernel-2.6.spec

(如果要为特定架构构建内核,例如i386,i586,i686或x86_64,则可以这样做:

rpmbuild -bp --target=i686 kernel-2.6.spec

我没有在这个例子中指定它,并且在这里结束了一个i386内核。 您的系统可能会为不同的体系结构构建一个内核,而不是指定它,所以当您遵循本教程时,请记住这一点。)

现在是棘手的一部分。 src.rpm带有很多Fedora特定的补丁。 其中一些不能使用我们的2.6.18.2补丁,所以如果在rpmbuild输出中看到这样的东西:

+ echo 'Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):'
Patch #300 (linux-2.6-ppc-dac960-ipr-clash.patch):
+ patch -p1 -s
Reversed (or previously applied) patch detected! Assume -R? [n]
Apply anyway? [n]
1 out of 1 hunk ignored -- saving rejects to file drivers/block/DAC960.c.rej
error: Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)


RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.46287 (%prep)

您必须再次编辑kernel-2.6.spec并注释掉补丁#300:

vi kernel-2.6.spec

[...]
#Patch300: linux-2.6-ppc-dac960-ipr-clash.patch
[...]
#%patch300 -p1
[...]

然后再运行你的rpmbuild命令,例如

rpmbuild -bp kernel-2.6.spec

您必须一再重复,直到没有更多的补丁无法应用。

2.4指定内核识别字符串

现在我们应该指定一个字符串,让我们稍后可以识别我们的内核。 所以我们这样做:

cd ~/rpmbuild/BUILD/kernel-2.6.18/linux-2.6.18.i386
vi Makefile

EXTRAVERSION行中,可以将内核标识。 我认为将内核版本附加到该字符串是很好的,所以这样的事情是可以的:

EXTRAVERSION = -custom-2.6.18.2

2.5配置内核

现在我们跑了

make menuconfig

这将启动内核配置菜单。 转到加载备用配置文件 ,然后选择.config作为配置文件:

然后浏览内核配置菜单并进行选择。 完成后,选择退出 ,回答以下问题( 是否要保存新的内核配置? )与

2.6构建内核

现在我们通过简单的运行来构建我们的内核rpm包

make rpm

之后,您将在〜/ rpmbuild / SRPMS /目录中找到一个新的src.rpm软件包,例如〜/ rpmbuild / SRPMS / kernel-2.6.18custom2.6.18.2-1.src.rpm ,内核rpm包在〜 / rpmbuild / RPMS / i386 / (或〜/ rpmbuild / RPMS / i586 /,〜/ rpmbuild / RPMS / i686 /等等,取决于你的架构),例如〜/ rpmbuild / RPMS / i386 / kernel-2.6.18custom2。 6.18.2-1.i386.rpm 。 当您看到您的内核标识已添加到包名称中。

2.7安装新内核

现在去创建新内核rpm包的目录(取决于你的架构,例如〜/ rpmbuild / RPMS / i386 / ),然后安装rpm包:

cd ~/rpmbuild/RPMS/i386
rpm -ivh kernel-2.6.18custom2.6.18.2-1.i386.rpm

(您现在甚至可以将rpm包转移到其他Fedora系统,并以完全相同的方式安装它们,这意味着您不需要再次编译内核。)

接下来,我们为我们的新内核创建一个ramdisk,因为否则系统很可能不会启动我们的新内核:

mkinitrd /boot/initrd-2.6.18-custom-2.6.18.2.img 2.6.18-custom-2.6.18.2

然后编辑/boot/grub/menu.lst 。 看看你现有的(工作)内核节,并将其中的一个作为新节的示例,并替换内核和ramdisk,然后将节添加到所有其他节之上。

vi /boot/grub/menu.lst

例如,在添加新节之前,我的menu.lst看起来像这样:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu

title Fedora Core (2.6.18-1.2798.fc6)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-1.2798.fc6.img

这样以后呢

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
#          initrd /initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu

title Fedora Core (2.6.18-custom-2.6.18.2)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-custom-2.6.18.2 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-custom-2.6.18.2.img

title Fedora Core (2.6.18-1.2798.fc6)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-1.2798.fc6 ro root=/dev/VolGroup00/LogVol00
        initrd /initrd-2.6.18-1.2798.fc6.img

(你可以通过运行找到正确的vmlinuzinitrd文件

ls -l /boot

现在重新启动系统:

shutdown -r now

如果一切顺利,应该提出新的内核。 您可以通过运行来检查它是否真的正在使用新的内核

uname -r

这应该显示类似的东西

2.6.18-custom-2.6.18.2

如果系统没有启动,请重新启动它,当您看到这一点:

按任意键进入GRUB菜单:

选择您的旧内核并启动系统。 您现在可以再次尝试编译一个工作的内核。 不要忘记从/boot/grub/menu.lst中删除不工作内核的