构建一个自定义CentOS7内核
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 gconfig或make 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 menuconfig,make gconfig或make 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内核相关推荐
- 【Android 】零基础到飞升 | 构建一个可复用的自定义BaseAdapter
2.5.0 构建一个可复用的自定义BaseAdapter 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Ad ...
- 移植 lwip,在 windows 内核构建一个 TCPIP 协议栈
移植 lwip,在 windows 内核构建一个 TCPIP 协议栈 亲,当你点开看这篇文章,就说明你知道我想要干什么事情,或者说,你知道在 Windows 的内核种绕开它的网络协议,再独立构建一个网 ...
- Android基础入门教程——2.4.7 构建一个可复用的自定义BaseAdapter
Android基础入门教程--2.4.7 构建一个可复用的自定义BaseAdapter 标签(空格分隔): Android基础入门教程 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义Bas ...
- Android入门教程四十之构建一个可复用的自定义BaseAdapter
如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Adapter控件,都需要自己另外写一个BaseAdapter类,这样显得 ...
- java的linux内核构建,构建一个Docker 的Java编译环境
用Dockerfile 构建一个Java的编译环境 1.包括以下软件包 Ubuntu jdk maven svn 2.jdk.maven 需要手动下载,下载之后分别为 jdk-8u51-linux-x ...
- keepalived基础及使用DR模型构建一个real_server
keepalived HA的解决方案的两大流派分为heartbeat.corosync和keepalived keepalived在诞生时被赋予的使命仅仅是为lvs的director的HA.生成ipv ...
- win10支持linux内核,Win10将允许您加载自定义Linux内核
微软正在为Win10添加一个Linux内核,以支持Linux的Windows子系统.但是,猜测一下:你不必使用微软的Linux内核.您可以构建自己的自定义Linux内核供Windows使用. 此功能是 ...
- 如何构建一个消息推送平台
01 背 景 B/S架构下很多业务场景下我们需要服务端主动推送消息到客户端,在html5之前一般使用长轮询(除此之外还有iframe流或者Flash Socket)的方式来实现,而长轮询的方式缺点很明 ...
- 构建一个react项目_您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩。...
构建一个react项目 by Samer Buna 通过Samer Buna 您想要了解更多有关React的内容吗? 让我们构建一个游戏,然后玩. (Do you want to learn more ...
最新文章
- 面试官给我挖坑:URI中的 “//” 有什么用?
- BufferedInputStream与BufferedOutputStream用法简介
- Android Studio编译NDK工程时,报ndk-build.cmd'' finished with non-zero exit value 2错误
- ios: coreData的NSManagedObject setvalue为null
- GNN笔记:图信号处理(Graph Signal Processing)
- 设计模式(Design Pattern)
- [导入]SunriseUpload.0.9.1的源码分析(七)
- Sqoop import导入表时报错java.lang.ClassNotFoundException: org.json.JSONObject
- python的flag是什么意思_网上老说的flag是什么意思
- JeecgBoot 单体升级微服务快速方案(十分钟搞定)
- winform中DataGridview数据绑定时格式化文本,如:将部分文字改成绿色,部分文字改成红色...
- 在网页中嵌入Base64编码文件
- android monkey测试步骤,android Monkey 测试技巧
- 艰难时局下电子发现蓬勃发展
- 萤石云摄像头Http接口云台控制开发
- EAS BOS:序时簿中获取选中行中某单元格的值方法
- 兵法三十六计是哪些?
- matlab的颜色映射colormap
- springboot整合rocketmq:一个消费者组怎么订阅多个topic
- 联调QuartersII + ModelSim(下载安装)