Table of Contents

1.建立准备

2.配置内核

3.内核ABI

4.修改内核规范文件

5.构建新内核

6.安装新内核

相关文章


由RalphAngenendt创建。目前由AlanBartlett和AkemiYagi维护。

  • 你确定吗?CentOS旨在作为一个完整的环境运行。如果更换关键组件,则很可能会影响系统其余部分的工作方式。
  • 您绝对确定吗?严重的是,99.9%的用户不再需要重建自己的内核。您可能只需要构建一个内核模块,在这种情况下,请参阅构建您自己的内核模块。

  • 通过安装ELRepo项目中的内核模块之一,可以使用所需的功能吗?

  • 您需要的功能是否可以作为当前内核的单独模块使用?
  • 是你需要在内核CentOSPlus提供的功能,它可以在发现CentOSPlus库?

  • 最后一次警告 。。。如果您破坏了内核或系统,则必须保留它,并且,作为奖励,您必须保留所有片段以及与之相关的关于系统如何启动的哭声。

有两种方法为CentOS构建自定义内核。一种是使用CentOS来源的自定义选项构建内核,另一种是使用从Linux Kernel Archive获得的资源构建主线内核。

本教程将介绍CentOS源代码中的内核构建以及您自己的选择或修改。它是为CentOS-7编写的。

(如果您希望构建主线内核,请不要遵循“如何编译内核”。该站点不获认可,因为该站点详细说明了以root身份进行构建,这种方法不安全且存在缺陷。请参阅在CentOS下以非root身份构建Source RPM。有关详细的推理,构建主线内核的一个很好的参考是《Linux Shell in Nutshell》一书。)

这些操作仅供您个人使用。自定义内核不受开发团队的支持,因为它们无法控制您的构建环境,所选的选项等。如果您选择构建自己的内核,则您将负责继续维护该内核以进行安全更新,新发行版, $ DEITY的第二次出现以及可能需要进行此类维护的任何其他可能的情况。

注意:如果您想查看自定义内核的真实示例,请获取centosplus内核的srpm软件包之一。例如,你可以找到一个为CentOS-7在这里或在CentOS-6在这里。

1.建立准备


为了能够成功完成内核构建,您将需要安装以下软件包:

  • yum groupinstall“开发工具”

  • 百胜安装ncurses-devel

  • yum install qt3-devel(仅当您希望使用make xconfig代替make gconfigmake menuconfig时,才需要这样做。)

  • 百胜安装hmaccalc zlib-devel binutils-devel elfutils-libelf-devel

  • 完整的内核源代码树。您应该按照说明在第2节我需要的内核源代码

运行上述yum命令的Whist注意是否有任何排除引用。如果在yum配置文件中有任何引用内核和相关软件包的“排除”行,则也需要将其删除。应该理解,尽管CentOS项目不认可使用此类排除,但某些供应商不允许用户修改的内核在其支持的环境中运行。有关此主题的更多详细信息,请参见第3节,虚拟服务器CentOS Wiki损坏。请注意,最好对所有不希望丢失的内容进行最新的,经过测试的备份。

如果您要添加任何内核补丁,请立即将其复制到〜/ rpmbuild / SOURCES /目录。

2.配置内核


如果您不想修改分布式内核配置文件,则可以忽略本节(CentOS- 7),或者需要执行与最后一步等效的操作(CentOS- 6):
[user @ host] $ cp〜/ rpmbuild / BUILD / kernel-* / linux-* / configs / *〜/ rpmbuild / SOURCES /

将目录更改为〜/ rpmbuild / BUILD / kernel-* / linux-* /并将其作为.config复制到configs /目录中的当前配置文件,或者从/ boot /中当前运行的内核配置文件复制到该目录。目录。

请参阅以下示例:

[user@host]$ cd ~/rpmbuild/BUILD/kernel-*/linux-*/

要么-

[user@host]$ cp configs/kernel-3.10.0-`uname -m`.config .config

(对于CentOS- 6,将“ 3.10.0”替换为“ 2.6.32” 。)

- 要么 -

[user@host]$ cp /boot/config-`uname -r` .config

注意:uname -m或uname -r周围的字符是“反引号”,而不是撇号。

首先运行make oldconfig。现在,您应该运行make menuconfigmake gconfigmake xconfig来定制内核配置。完成后,请记住保存更改。

如果您已经安装了完整的内核源代码来构建内核模块,则应在此处停止。现在,请参阅“构建自己的内核模块”教程。

接下来,在将其复制回configs /目录之前,在配置文件的顶部添加一行,其中包含已注释掉的硬件平台等效项(等同于uname -i命令返回的输出)。对于64位体系结构,这将是x86_64。(对于CentOS- 6,对于32位体系结构,它也可以是i386。)它必须用#注释掉,并且必须是文件的第一行。请注意,哈希符号和硬件平台描述符之间必须有一个空格。

将以下任一内容添加为.config文件的第一行:

#x86_64

或者,对于CentOS-6:

#i386

将.config文件复制回configs /目录。这基本上与先前的copy命令相反:

[user@host]$ cp .config configs/kernel-3.10.0-`uname -m`.config

注意:uname -m周围的字符是“反引号”,而不是撇号。

最后一步是将configs /目录的全部内容复制到〜/ rpmbuild / SOURCES /目录。

[user@host]$ cp configs/* ~/rpmbuild/SOURCES/

3.内核ABI


CentOS内核的一个功能是在产品的整个生命周期中都将保留其ABI,而拥有一致的ABI的优点是可以构建独立于内核版本的外部内核模块-因此,它们不需要将针对每个发布的新内核进行重建。这是kABI跟踪kmod软件包的基础 -例如,提供更新的设备驱动程序和其他文件系统支持。

为了保持这种ABI一致性,记录了原始内核的ABI并将其存储在文件中。在kABI检查步骤中,此文件用于所构建的每个新内核。如果以与已发布的ABI不一致的方式配置或修改了新内核,则构建将失败并显示一条消息,指出kABI损坏。然后,内核构建器将有两种选择:(a)重新配置新内核,使其与已发布的ABI一致,从而继续享受一致的ABI提供的好处,或(b)在调试期间禁用kABI检查。构建过程。在这两种选择中,前者是理想的,但偶尔地,后者是唯一的选择。

禁用内核ABI检查是在rpmbuild命令行上提供标志及其参数的简单过程:

--without kabichk

4.修改内核规范文件


现在应该修改内核规范文件。

本节中提到的行号仅与当前的CentOS内核规范文件有关。

[user@host]$ cd ~/rpmbuild/SPECS/
[user@host SPECS]$ cp kernel.spec kernel.spec.distro
[user@host SPECS]$ vi kernel.spec

在第8行,注释了buildid的定义。(对于CentOS- 6,在第18行。)

必须取消注释,并给它一个值,以避免与您当前安装的内核冲突。以类似于以下示例的方式更改行:

%define buildid .your_identifier

“%”和单词“ define”之间不应有空格。

如果有任何补丁要应用,则需要在两个地方引用它们。如果您没有要应用的任何修补程序,则只需继续阅读下面的行,即“修补程序部分的结尾”。

首先,找到一行读为“ #empty final patch,以方便测试内核补丁”。(对于CentOS- 6,请找到一行读取“#空的最终补丁文件以方便测试内核补丁”。)在该行之后添加以40000开头的声明,这样您的补丁就不会有发生冲突的危险。与RHEL / CentOS内核补丁空间。例如:

Patch40000: my-custom-kernel.patch

其次,找到一行“ ApplyOptionalPatch linux-kernel-test.patch”。在该行之前,添加一行以应用您的补丁。例如:

ApplyOptionalPatch my-custom-kernel.patch

修补程序部分的结尾。

仅对于CentOS- 6,找到一行,该行显示为“#将一些必要的文件从源目录拖放到buildroot中”。替换下一行:

cp $RPM_SOURCE_DIR/config-* .

with:

cp $RPM_SOURCE_DIR/kernel-*.config .

仅对于CentOS- 6,找到以下行并将其注释掉:

#make -f %{SOURCE20} VERSION=%{version} configs

5.构建新内核


开始构建:

[user@host SPECS]$ rpmbuild -bb --target=`uname -m` kernel.spec 2> build-err.log | tee build-out.log

注意:uname -m周围的字符是“反引号”,而不是撇号。

您可以使用--with和/或--without标志和关联的参数向rpmbuild命令添加一些有用的选项。要注意的主要选项是:

--with baseonly
--without up
--without debug
--without debuginfo
--without fips
--without kabichk

例如,要仅构建基本内核软件包,请使用:

--with baseonly --without debug --without debuginfo

6.安装新内核


构建完成后,您的自定义内核rpm文件会在用户的〜/的rpmbuild / RPMS /发现`UNAME -m` /目录。通过使用'yum'命令或'rpm'命令以root身份安装它们。

注意:uname -m或uname -r周围的字符是“反引号”,而不是撇号。

例如,成为根(见如何成为root)和CD的用户〜/的rpmbuild / RPMS / `UNAME -m` /目录。然后执行以下命令:

要安装所有kernel- *软件包,请运行:

[root@host]# yum localinstall kernel-*.rpm

或者,通过使用rpm命令:

[root@host]# rpm -ivh kernel-*.rpm

使用rpm命令安装kernel- *软件包时,应注意,必须使用rpm -ivh命令安装“ kernel”和“ kernel-devel” ,而不是对其进行更新。注意:如果您构建的内核版本早于当前安装的版本,则还必须在rpm命令中使用--oldpackage标志。

任何情况,请使用rpm -Uvh命令安装“内核”,因为这将更新(覆盖)当前安装的版本。因此,如果您的自定义内核有问题,您将无法恢复到以前的可用版本。

需要使用rpm -Uvh命令安装(更新)“ kernel”和“ kernel-devel”以外的软件包。请注意-i(安装)和-U(更新)之间标志的区别。

HowTos / Custom_Kernel(最后由FabianArrotin编辑2019-12-09 09:44:35)

相关文章


《Building Source RPM as non-root under CentOS*》http://www.owlriver.com/tips/non-root/

《Build Your Own Kernel Modules》https://wiki.centos.org/HowTos/BuildingKernelModules

构建一个自定义CentOS7内核相关推荐

  1. 【Android 】零基础到飞升 | 构建一个可复用的自定义BaseAdapter

    2.5.0 构建一个可复用的自定义BaseAdapter 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Ad ...

  2. 移植 lwip,在 windows 内核构建一个 TCPIP 协议栈

    移植 lwip,在 windows 内核构建一个 TCPIP 协议栈 亲,当你点开看这篇文章,就说明你知道我想要干什么事情,或者说,你知道在 Windows 的内核种绕开它的网络协议,再独立构建一个网 ...

  3. Android基础入门教程——2.4.7 构建一个可复用的自定义BaseAdapter

    Android基础入门教程--2.4.7 构建一个可复用的自定义BaseAdapter 标签(空格分隔): Android基础入门教程 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义Bas ...

  4. Android入门教程四十之构建一个可复用的自定义BaseAdapter

    如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Adapter控件,都需要自己另外写一个BaseAdapter类,这样显得 ...

  5. java的linux内核构建,构建一个Docker 的Java编译环境

    用Dockerfile 构建一个Java的编译环境 1.包括以下软件包 Ubuntu jdk maven svn 2.jdk.maven 需要手动下载,下载之后分别为 jdk-8u51-linux-x ...

  6. keepalived基础及使用DR模型构建一个real_server

    keepalived HA的解决方案的两大流派分为heartbeat.corosync和keepalived keepalived在诞生时被赋予的使命仅仅是为lvs的director的HA.生成ipv ...

  7. win10支持linux内核,Win10将允许您加载自定义Linux内核

    微软正在为Win10添加一个Linux内核,以支持Linux的Windows子系统.但是,猜测一下:你不必使用微软的Linux内核.您可以构建自己的自定义Linux内核供Windows使用. 此功能是 ...

  8. 如何构建一个消息推送平台

    01 背 景 B/S架构下很多业务场景下我们需要服务端主动推送消息到客户端,在html5之前一般使用长轮询(除此之外还有iframe流或者Flash Socket)的方式来实现,而长轮询的方式缺点很明 ...

  9. 构建一个react项目_您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩。...

    构建一个react项目 by Samer Buna 通过Samer Buna 您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩. (Do you want to learn more ...

最新文章

  1. 面试官给我挖坑:URI中的 “//” 有什么用?
  2. BufferedInputStream与BufferedOutputStream用法简介
  3. Android Studio编译NDK工程时,报ndk-build.cmd'' finished with non-zero exit value 2错误
  4. ios: coreData的NSManagedObject setvalue为null
  5. GNN笔记:图信号处理(Graph Signal Processing)
  6. 设计模式(Design Pattern)
  7. [导入]SunriseUpload.0.9.1的源码分析(七)
  8. Sqoop import导入表时报错java.lang.ClassNotFoundException: org.json.JSONObject
  9. python的flag是什么意思_网上老说的flag是什么意思
  10. JeecgBoot 单体升级微服务快速方案(十分钟搞定)
  11. winform中DataGridview数据绑定时格式化文本,如:将部分文字改成绿色,部分文字改成红色...
  12. 在网页中嵌入Base64编码文件
  13. android monkey测试步骤,android Monkey 测试技巧
  14. 艰难时局下电子发现蓬勃发展
  15. 萤石云摄像头Http接口云台控制开发
  16. EAS BOS:序时簿中获取选中行中某单元格的值方法
  17. 兵法三十六计是哪些?
  18. matlab的颜色映射colormap
  19. springboot整合rocketmq:一个消费者组怎么订阅多个topic
  20. 联调QuartersII + ModelSim(下载安装)

热门文章

  1. Vue自定义组件数组型双向绑定
  2. leetcode题解48-旋转图像
  3. BZOJ2243: [SDOI2011]染色
  4. JavaScript eval
  5. POJ3287(BFS水题)
  6. ActiveMQ简单介绍+简单实例
  7. Amazon电商数据分析——数据获取
  8. Nagios 监控系统架构
  9. java7新添加的一些特性--转
  10. 10-11-根据文章标题搜索文章