如何编译内核 - Fedora方式
版本1.0
作者:Falko Timme
每个发行版都有一些特定的工具来从源头构建定制内核。 本文是关于在Fedora系统上编译内核的。 它描述了如何使用www.kernel.org ( vanilla内核 )中最新的未修改的内核源构建定制内核,以使您独立于您的发行版提供的内核。 它还显示如果您需要不在其中的功能,如何修补内核源。
我已经在Fedora Core 6上测试过了。
我想先说说这不是建立这样一个系统的唯一途径。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!
1初步说明
在本文中,我将介绍构建Fedora系统内核的两种方法。 第一个是Fedora特定的,最后你将有一个内核rpm包,你可以安装或与他人共享。 第二种方式对于所有的Linux发行版都是一样的,但是最终没有使用rpm包。
我更喜欢以root
用户身份
执行所有步骤。 但是,可以以非特权用户(例如,用户tom
)运行大多数命令。 某些命令(如yum
或rpm)
仍然需要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 |
(你可以通过运行找到正确的vmlinuz
和initrd
文件
ls -l /boot
)
现在重新启动系统:
shutdown -r now
如果一切顺利,应该提出新的内核。 您可以通过运行来检查它是否真的正在使用新的内核
uname -r
这应该显示类似的东西
2.6.18-custom-2.6.18.2
如果系统没有启动,请重新启动它,当您看到这一点:
按任意键进入GRUB菜单:
选择您的旧内核并启动系统。 您现在可以再次尝试编译一个工作的内核。 不要忘记从/boot/grub/menu.lst
中删除不工作内核的节
。