1 编译linux内核原因
一般情况下,我们是不需要重新去编译linux内核的,但如果你发现你需要修改内核的某个部分或者说你需要的某个模块并没有编译进内核,那里你可以通过重新编译内核来满足你的需求,比如当我们需要用bcache时,但默认bcache是没有编译进内核的,我们可以通过修改编译配置文件,将bcache编译进内核,以下的编译操作均是在Centos7.3平台上进行的演示。

2 编译前准备工作
2.1 编译用户身份选择
官方是强调编译linux内核是强烈不建议以root身份来进行编译的,因为这样有可能在编译过程中改掉当前编译系统的重要配置而影响当前系统,而应该建议使用普通用户的身份来编译内核,这样该普通用户如果在编译过程中要修改系统重要的配置文件也会因为没有权限而报错。

2.2 构建编译所需环境
(1)rpm编译目录创建

[user@host]$ mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
[user@host]$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros

(2)编译所需的一些依赖包安装

[root@host]# yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto -y
[root@host]# yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel java-devel -y
[root@host]# yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel -y
[root@host]# yum install make gcc bc openssl-devel -y
[root@host]# yum groupinstall "Development Tools" -y

3 获取源码并进行编译

这里分两种,一种是获取src.rpm源文件来重新编译成rpm,一种是获取源码文件来编译成rpm。
3.1 获取src.rpm源码文件来编译

3.1.1 获取并安装源码
获取内核RPM源码包

[user@host]$ wget http://vault.centos.org/7.3.1611/updates/Source/SPackages/kernel-3.10.0-514.26.2.el7.src.rpm

安装源码包:

[user@host]$ rpm -i kernel-3.10.-514.26..el7.src.rpm >& | grep -v exist

解压并释放出源文件

[user@host]$ cd ~/rpmbuild/SPECS
[user@host SPECS]$ rpmbuild -bp --target=$(uname -m) kernel.spec

3.1.2 修改编译配置文件
(1)拷贝源码文件到rpm编译目录:

[user@host] $ cp ~/rpmbuild/BUILD/kernel-3.10.-514.26..el7/linux-3.10.-514.26..el7.x86_64/configs/* ~/rpmbuild/SOURCES/

(2)改变工作目录:

[user@host]$ cd ~/rpmbuild/BUILD/kernel-3.10.-514.26..el7/linux-3.10.-514.26..el7.x86_64/

(3)拷贝内核的默认配置文件到当前工作目录:

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

(4)执行make oldconfig命令生成默认内核配置

[user@host]$ make oldconfig

(5)执行make menuconfig命令自定义编译模块

[user@host]$ make menuconfig

此时会弹出窗口,如下图所示:

左侧的[]里面有三种可能的值:
[*]表示将编译进内核;
[M]表示以内核模块的形式编译进行内核,这种形式可以用modprobe xxx命令进行加载;
[]表示不对该模块进行编译
比如我自己的需求是需要将bcache模块以内核模块的形式编译进行内核中,则我的选择是:
Device Drivers -> Multiple devices driver support -> Block device as cache
找到Block device as cache这个选项,将其[]值改为[M],如下图所示:

选择完后进行save保存,其会生成到.config配置文件中,接着退出。

(6)编辑.config文件并拷贝到编译配置文件目录中
如果你的平台是x86_64平台则,在.config文件的第一行加上
# x86_64
是其它的则加上其它的,可以使用uname -m命令查看你的平台:

[user@host ~]$ uname -m
x86_64

拷贝.config文件到编译配置文件目录中:

[user@host]$ cp .config configs/kernel-3.10.-`uname -m`.config
[user@host]$ cp configs/* ~/rpmbuild/SOURCES/

3.1.3 使用rpmbuild命令进行编译

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

还可以在编译项里加上一些编译选项:
--with baseonly
--without up
--without debug
--without debuginfo
--without fips
--without kabichk
比如,编译基础的则一般加上这些选项:
--with baseonly --without debug --without debuginfo --without kabichk
最后可以使用如下命令编译内核:

[user@host]$ rpmbuild -bb --target=`uname -m` kernel.spec --with baseonly --without debug --without debuginfo --without kabichk > build-err.log | tee build-out.log

编译完成后便可以在 ~/rpmbuild/RPMS/`uname -m`/ 目录下看到编译生成的内核rpm包了

3.2 获取源码文件来编译

3.2.1 获取源码文件

去linux kernel官网获取源码,官网地址:https://www.kernel.org

我这里是下载4.14.95版本的内核源码来编译:

[user@host ~]# wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.14.95.tar.xz

解压源码文件:

[user@host ~]# tar xvf linux-4.14.95.tar.xz

解压完成后进入linux-4.14.95目录:

[user@host ~]# cd linux-4.14.

3.2.2 配置.config文件

(可选)将当前系统的配置作为模板拷贝到当前目录命名为.config:

[user@host linux-4.14.]# cp -v /boot/config-3.10.-.el7.x86_64 .config

如果提示权限不够,则可使用root用户来拷贝到那个目录:

[root@host ~]# cp -u user -v /boot/config-3.10.-.el7.x86_64 /home/lhx/.config

执行make menuconfig来选择模块,选择方式如3.1.2所述

3.2.3 编译rpm

[user@host linux-4.14.]$ make rpm

注意点:这里有个疑问,我用4.19.12版本执行make rpm的时候会报如下错:

[user@host linux-4.19.]$ make rpm
make: *** 没有规则可以创建目标“rpm”。 停止。

有些博客说执行make rpm-pkg,但这个编译完后生成的rpm非常大,有500多M,这个疑问还需解决。

4 内核编译注意点
编译时间一般比较长,可能1小时到几小时不等,看你的机器性能,但有一点是要注意的,就是存储空间要够,我之前用10G都不够,最好预留20G的空间给内核编译,否则编译过程中会报错,报错时用df命令看下空间是否占满了来排除下是否是这个错误。

成后便

自定义配置编译linux内核的更多相关文章

  1. Centos下编译Linux内核

    Linux内核编译是一件简单却费事的事.但是独立的编译linux内核会帮助你很好的理解Linux内核的工作机理. 首先编译linux内核我们需要在当前linux操作系统下安装gcc编译器,因为我是Ce ...

  2. Mac下重新编译Linux内核

    Mac下重新编译Linux内核 操作系统实验,要求添加系统调用并重新编译内核,这里记录一下编译内核的过程 0.下载VirtualBox 博主一直用parallel desk,但因为驱动等问题,在PD上 ...

  3. 为什么要编译Linux内核?

    新的内核修订了旧内核的bug,并增加了许多新的特性.如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译Linux内核. 通常,更新的内核会支持更多的硬件,具 ...

  4. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #2 如何编译Linux内核

    HACK #2 如何编译Linux内核 本节介绍编译Linux内核的方法.当发现bug而修改源代码或者添加新功能时,就需要对内核进行重新编译,生成二进制映像文件.另外,如果想要使用发布版内核中无效的功 ...

  5. 35、在编译Linux内核中增加程序需要完成以下3项工作

    在编译Linux内核中增加程序需要完成以下3项工作: 将编写的源代码拷入Linux内核源代码的相应目录. 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项 在目录的Makefile文 ...

  6. 安装debian总结以及编译linux内核

    1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...

  7. 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录

    最近帮一位上海的朋友搞一块小板,在ubuntu15.04 vivid上已经加载了对应了.ko驱动包 但关键是系统根本就枚举不到该声卡ALC5640,试了OpenSUSE也是一样的结果,看来是内核漏加载 ...

  8. 编译linux内核时出错

    在编译linux内核的时候使用make menuconfig 可能出现下面的错误 *** Unable to find the ncurses libraries or the*** required ...

  9. 编译Linux内核(Mac OS平台)

    操作系统第一次实验需要编译Linux内核,我之前在Mac上一直使用的都是Parallels Desktop这个软件,所以这次也将课程网站上提供的Ubuntu安装在了PD上,但是编译完内核后无法进入Ub ...

随机推荐

  1. springcloud-Feign基础使用

    声明式REST客户端:Feign Feign是一个声明式的Web服务客户端.它使得Web服务客户端的写入更加方便.具有可插拔注解支持,包括Feign注解和JAX-RS注解. Spring Cloud增 ...

  2. BG.Sqoop

    1. 下载 Sqoop,并复制到虚拟机 http://sqoop.apache.org/ 2. 安装Sqoop tar zxf sqoop-1.4.6.bin__hadoop-2.0.4-alpha. ...

  3. [javascript] Promise简单学习使用

    原文地址:http://www.cnblogs.com/dojo-lzz/p/4340897.html 解决回调函数嵌套太深,并行逻辑必须串行执行,一个Promise代表一个异步操作的最终结果,跟Pr ...

  4. 【转】JS前台加密,java后台解密实现

    因项目需求,需要一些敏感信息进行加密,不能以明文暴露到浏览器. 然后后台进行解密操作 先看一下效果图 未对其加密传输 1.前台JS <script type="text/javascr ...

  5. oracle数据库定时任务

    应用系统运行中,经常需要定时执行一些任务,例如:定时更新汇总数据,定时更新状态数据等,目前 Treesoft数据库管理系统 增加[定时任务]功能,直接通过页面简单配置,即可按调度规则定时执行SQL任务 ...

  6. Mybatis中的jdbcType的作用

    使用MyBatis框架做更新操作时,在该字段需要更新的内容为空时,就会出现1111错误,也就是无效的列类型,这个时候你就要使用jdbcType.至于什么时候要使用到javaType我还没遇到过,而且我 ...

  7. ManualResetEvent

    ManualResetEvent是C#中一个比较常用的工具,可用于线程间通信,实现一种类似信号量的功能(不知道我这样描述是否恰当,有可能不是“类似”,而“就是”通过信号量来实现的,因为我也是最近才知道 ...

  8. 【学习笔记】--- 老男孩学Python,day13 生成器,生成器函数,各种推倒式和生成器表达式

    1. 生成器和生成器函数 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 2.通过生成器表达式创建生成器 3.通过数据转换   2. 生成器函数: 函数中包含了yield的就是生成 ...

  9. 用Jquery去写树结构

    <!DOCTYPEhtml> <html> <head> <metacharset="utf-8"> <title>Tr ...

  10. 12:计算2的N次方

    12:计算2的N次方 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 任意给定一个正整数N(N<=100),计算2的n次方的值. 输入 输入一个正整数N ...