如何编译内核 - CentOS方式
版本1.0
作者:Falko Timme
每个发行版都有一些特定的工具来从源头构建定制内核。 本文是关于在CentOS系统上编译内核的。 它描述了如何使用www.kernel.org ( vanilla内核 )中最新的未修改的内核源构建定制内核,以使您独立于您的发行版提供的内核。 它还显示如果您需要不在其中的功能,如何修补内核源。
我已经在CentOS 4.4上进行了测试。
我想先说说这不是建立这样一个系统的唯一途径。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!
1初步说明
在本文中,我将介绍为CentOS系统构建内核的两种方法。 第一个将为您提供一个内核rpm包,您可以安装或与其他人共享。 第二种方式对于所有的Linux发行版都是一样的,但是最终没有使用rpm包。
2构建内核rpm包
本章介绍如何构建一个内核,最后使用可以安装并与其他人共享的rpm包。
2.1下载内核源码
首先我们将所需内核下载到/ usr / src
。 请访问www.kernel.org并选择要安装的内核,例如linux-2.6.18.3.tar.bz2
(您可以在这里找到所有2.6内核: http : //www.kernel.org/pub/linux/kernel /v2.6/ )。 然后,您可以将其下载到/ usr / src,
如下所示:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.3.tar.bz2
然后我们打开内核源代码并创建一个symlink linux
到内核源目录:
tar xjf linux-2.6.18.3.tar.bz2
ln -s linux-2.6.18.3 linux
cd /usr/src/linux
2.2修改/etc/modprobe.conf
现在我们必须注释掉/etc/modprobe.conf中的mptscsi模块,否则我们会得到如下错误:
No module mptscsi found for kernel 2.6.18.3-default, aborting.
当我们尝试为我们的新内核创建一个ramdisk。
vi /etc/modprobe.conf
alias eth0 pcnet32 alias scsi_hostadapter mptbase # alias scsi_hostadapter1 mptscsi alias scsi_hostadapter2 mptfc alias scsi_hostadapter3 mptspi alias scsi_hostadapter4 mptsas alias scsi_hostadapter5 mptscsih |
2.3将补丁应用于内核源(可选)
有时候,默认情况下,您需要新内核不支持的硬件驱动程序,或者您需要对虚拟化技术的支持或尚未将其提供给内核的其他一些尖端技术。 在所有这些情况下,您必须修补内核源(只要有可用的补丁可用...)。
现在我们假设你已经下载了/ usr / src
所需的补丁(在本例中称之为patch.bz2
)。 这是您将其应用于内核源(您仍然必须在/ usr / src / linux
目录中):
bzip2 -dc /usr/src/patch.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch.bz2 | patch -p1
第一个命令只是一个测试,它对您的来源没有任何影响。 如果没有显示错误,可以运行实际应用补丁的第二个命令。 如果第一个命令显示错误,请不要这样做!
如果您的补丁使用gzip( .gz
)而不是bzip2( .bz2
)进行压缩,则会按如下方式修补内核:
gunzip -c /usr/src/patch.gz | patch -p1 --dry-run
gunzip -c /usr/src/patch.gz | patch -p1
您还可以将内核预制应用于内核源。 例如,如果您需要仅在内核2.6.19-rc6中可用的功能,但尚未为此内核释放完整的源。 相反, 补丁2.6.19-rc6.bz2
可用。 您可以将该修补程序应用于2.6.18内核源代码,但不适用于2.6.18.1或2.6.18.2或2.6.18.3等内核源代码,这一点在http://kernel.org/patchtypes/pre.html上有所描述 :
Prepatches相当于Linux的alpha版本; 他们住在档案馆的测试目录中。 应使用补丁(1)实用程序将其应用于以前完整版本的源代码,具有3部分版本号(例如,2.6.12-rc4 prepatch应该应用于2.6.11内核源,而不是,例如,2.6.11.10。)
所以如果你想编译2.6.19-rc6内核,你必须下载2.6.18内核源码( http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18)。 tar.bz2 ),而不是内核2.6.18.3!
这是将2.6.19-rc6补丁应用于内核2.6.18的方法:
cd /usr/src
wget http://www.kernel.org/pub/linux/kernel/v2.6/testing/patch-2.6.19-rc6.bz2
cd /usr/src/linux
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1 --dry-run
bzip2 -dc /usr/src/patch-2.6.19-rc6.bz2 | patch -p1
2.4配置内核
使用当前工作内核的配置作为新内核的基础是个好主意。 因此,我们将现有配置复制到/ usr / src / linux中
:
make clean && make mrproper
cp /boot/config-`uname -r` ./.config
然后我们跑
make menuconfig
这将启动内核配置菜单。 转到加载备用配置文件
,并选择.config
(其中包含当前工作内核的配置)作为配置文件:
然后浏览内核配置菜单并进行选择。 确保在General Setup --->()
下指定内核版本标识字符串本地版本 - 附加到内核版本
。 我使用-default
,所以我们的内核rpm包将被命名为kernel-2.6.18.3default-1.i386.rpm
。 您可以将字符串留空或指定一个不同的字体,这有助于您识别内核(例如,自定义或任何您喜欢的内容)。
请注意:安装kernel-2.6.18.3default-1.i386.rpm
并决定编译另一个2.6.18.3内核rpm包后,使用不同的版本字符串(如-default1
, -default2
等)很重要。因为否则你不能安装你的新内核,因为rpm抱怨kernel-2.6.18.3default-1.i386.rpm
已经安装!
完成后,选择退出
,回答以下问题( 是否要保存新的内核配置?
)与是
:
2.5构建内核
要构建内核,只需执行以下命令:
make rpm
现在耐心等待,内核编译可能需要几个小时,具体取决于您的内核配置和处理器速度。
2.6安装新内核
成功的内核构建之后,已经创建了一个src.rpm
和一个rpm
包。 可以在/ usr / src / redhat / SRPMS /目录中
找到src.rpm
软件包,您可以通过运行
ls -l /usr/src/redhat/SRPMS/
在我的系统上,它被称为kernel-2.6.18.3default-1.src.rpm
。
rpm包可以在/ usr / src / redhat / RPMS / i386 /
, / usr / src / redhat / RPMS / i586 /
, / usr / src / redhat / RPMS / i686 /
, / usr / src / redhat / RPMS / x86_64 /
等,取决于你的架构。 在我的系统上,它位于/ usr / src / redhat / RPMS / i386 /
,并运行
ls -l /usr/src/redhat/RPMS/i386/
我发现它的名字是kernel-2.6.18.3default-1.i386.rpm
。
现在我们可以像这样安装我们的内核rpm包:
cd /usr/src/redhat/RPMS/i386/
rpm -ivh --nodeps kernel-2.6.18.3default-1.i386.rpm
请注意--nodeps
开关:如果您不使用它,您会看到如下错误:
error: Failed dependencies:
kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386
我发现忽略这种依赖关系在我的系统上没有任何问题。
您现在甚至可以将内核rpm包转移到其他CentOS系统,并以完全相同的方式安装它,这意味着您不必再次在内核中编译内核。
接下来,我们为我们的新内核创建一个ramdisk,因为否则系统很可能不会启动我们的新内核:
mkinitrd /boot/initrd-2.6.18.3-default.img 2.6.18.3-default
2.7配置GRUB引导加载程序
现在我们必须配置我们的GRUB引导加载程序,以便在重新启动系统时启动新的内核。
跑
ls -l /boot
了解您的新内核(通常以vmlinuz
开头,例如vmlinuz-2.6.18.3-default
)和ramdisk(通常以initrd
开头,例如initrd-2.6.18.3-default.img
)。
然后编辑/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 CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.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 CentOS (2.6.18.3-default) root (hd0,0) kernel /vmlinuz-2.6.18.3-default ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.18.3-default.img title CentOS (2.6.9-42.0.3.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.0.3.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.0.3.EL.img title CentOS-4 i386 (2.6.9-42.EL) root (hd0,0) kernel /vmlinuz-2.6.9-42.EL ro root=/dev/VolGroup00/LogVol00 initrd /initrd-2.6.9-42.EL.img |
现在重新启动系统:
shutdown -r now
如果一切顺利,应该提出新的内核。 您可以通过运行来检查它是否真的正在使用新的内核
uname -r
这应该显示类似的东西
2.6.18.3-default
如果系统没有启动,请重新启动它,当您看到这一点:
按任意键进入GRUB菜单:
选择您的旧内核并启动系统。 您现在可以再次尝试编译一个工作的内核。 不要忘记从/boot/grub/menu.lst
中删除不工作内核的节
。