CentOS6-Linux内核编译 详细步骤

背景

Win10用VMwareWorkstation搭的虚拟机

CentOS6.5,内核版本2.6.32-431.el6.x86_64

在该环境下升级至4.9.195版本(版本随便选的一个),并且编译版本信息(版本信息里面加上我的学号_姓名)

确定内核以及版本信息

[root@ymhadoop ~]# uname -r
2.6.32-431.el6.x86_64
[root@ymhadoop ~]# cat /etc/centos-release
CentOS release 6.5 (Final)

搭建编译环境


#逐条运行命令
sudo yum groupinstall "Development Tools"
sudo yum install ncurses-devel
sudo yum install qt-devel
sudo yum install openssl-devel //后文全部默认在root权限下输入命令(即省略sudo)
  • 如果使用sudo命令报错:

    xxx is not in the sudoers file.This incident will be reported.

    解决办法见后文[1]

  • Development Tools" :是用于更新编译环境,确保内核源码编译的时候拥有编译时所需的一切工具

  • ncurses-devel:确保让make config系列指令正确地执行

  • qt-devel、openssl-devel同上

下载内核

  • Linux内核的官方网址:https://www.kernel.org。这个网站只列出了所有的longterm版、最新的stable版、当前的mainline版。
  • 我是从另外一个网址上下载的,存放了Linux内核的所有版本,十分方便:https://www.kernel.org/pub/linux/kernel

    下载的源码包是:linux-4.9.195.tar.gz。
  • 从windows移动文件到虚拟机中,有些文件可以直接从windows拖进虚拟机桌面上。一般选择用SSH或者Winscp。源码压缩包直接放在桌面上就行。

解压内核

CentOS6的源码放在/urc/src/kernels/文件夹下,所以我也直接将压缩包解压至该路径下,得到文件夹linux-4.9.195。

cd /usr/src/kernels/
tar -zxvf ~/installer/linux/src/linux-4.9.195.tar.gz

配置源码

  • 由于我的上机任务是需要在源码的版本信息中加入我的学号_姓名,则只需要用make menuconfig指令 —> 这个指令能让你的源码配置在可视化界面上操作。

  • make menuconfig指令与之前配置编译环境时候的后三条语句息息相关,否则会报错误:

    Makefile:546: recipe for target 'menuconfig' failed

    解决办法见后文[3]

  • 看到menu菜单后,进入General setup;进入setup后,再找到 Local version - append to kernel release 表示在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a/-r"命令看到

  • 回车后键入:_xxxxxxxx_ym

编译源码

  • 进入源码根目录,即/usr/src/kernels/linux-4.9.195/,执行make编译语句
cd /usr/src/kernels/linux-4.9.195/
make -j 4
  • 4表示4线程编译,据说编译速度会稍快一点,结果编译还是用了将近一个小时。
  • make出现问题大部分原因可能是编译器与内核版本不兼容,报错:

    make[1]: *** [scripts/kconfig/mconf.o] ERROR

    解决方法见后文[2]
  • 如果是多核cpu,可以选择多核编译;使用

    cat /proc/cpuinfo 查看cpu信息。

    找到其中“processor : [数字]”表示对CPU的编号,这个编号从0开始,所以找到最后一个“processor : [数字]”,[数字]+1就是你的CPU数。我的机器最后一个CPU编号为“processor : 0”,所以我的电脑是单核。
  • 编译时间一般而言将近一个小时,要注意待机的情况下虚拟机貌似不会在后台继续编译。

安装源码

  1. 安装内核模块
make modules_install
  1. 安装完内核模块后内核模块的可执行文件就会出现在/lib/modules/文件夹下,进入该目录下就可以看到我们安装内核版本的文件夹
  2. 注册启动项
make install
  • 这个命令是将该内核注册给引导程序,当开机启动的时候,引导程序会调用注册给它的内核来启动系统,如果有多个内核,用户可以选择从哪个内核启动
  • 运行到这一步,很容易出现报错:

    ERROR: modinfo: could not find module XXX

    解决方法和具体原因见后文[4]

    但是不管如何,该报错并不会影响内核安装,对于进行后续操作完全没有任何问题。
  1. 安装完之后修改默认内核启动项:打开/etc/grub.conf 查看系统内核的情况,修改grub引导顺序,让新安装的内核作为默认内核。

    • 从命令行查看文本出现的数字中可以看出存在两个内核版本,
    • 在 grub.conf 文件中决定开机使用哪个内核版本做启动的参数是 default,默认为 0(代表从最新的内核启动,代表的内核版本从上往下依次是 0,1, 2 等)
    • 在这个例子中,如果要选择从旧版内核即系统最开始的内核启动,则把 default 值改为 0 ,然后重启服务器从新的内核进行引导
vi /etc/grub.conf

#boot=/dev/sda
default=0 //此处需要将1修改成0;一般新安装的内核在第一个位置,所以设置default=0。
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.10.58)
root (hd0,0)
......
  • 此处需要注意:CentOS 7.0 系统更改内核启动顺序与CentOS 6.X 系统更改内核启动顺序的方式截然不同, CentOS 7 使用 grub2 作为引导程序,而CenOS6.x是修改 /etc/grub.conf 来修改启动项。所以两者修改进行内核启动顺序的步骤完全不一样,CenOS7与6.x进行操作做具体区别如此:[点击此处]
  1. 重启电脑即可查看新内核版本
reboot      //重启命令

uname -r    //查看内核版本信息

4.9.195_xxxxxxxxx_ym    //显示内核版本信息

可能遇到问题

1.xxx is not in the sudoers file.This incident will be reported.

sudo命令报错是因为用普通用户权限使用root级别命令

简单解决就直接su命令切换到root用户下进行原来操作即可,但是要把原命令中的sudo去掉

其他能够允许普通用户使用sudo命令的解决方法[点击这]

2.make[1]: *** [scripts/kconfig/mconf.o] 错误

make[1]: *** [scripts/kconfig/mconf.o] 错误 1

make: *** [menuconfig] 错误 2

一般是由于gcc和内核版本不兼容导致的。

3.Makefile:546: recipe for target 'menuconfig' failed

make[1]: *** [scripts/kconfig/mconf.o] Error 1

Makefile:546: recipe for target 'menuconfig' failed

make: *** [menuconfig] Error 2

该错误是因为make menuconfig需要安装(Ubuntu)libssl-dev / (CentOS)openssl-devel

4.ERROR: modinfo: could not find module *

  • 详细可以看这篇文章[ERROR: modinfo: could not find module * ]
  • 简要来说有三种原因:
    1. 确实是缺少了某个module
    2. 新编译的kernel已经将该选项编译进kernel了
    3. 模块的名称变了
  • 大部分情况是属于第三种原因。什么module报错找不到,都可以用lsmod命令查找当前内核中该module的运行情况,可以通过find指令大致检查出该module是改名了,还是在后续版本中没再使用了
[root@ymhadoop ~]# lsmod | grep [module_name]     //For example :lsmod | grep sco

[root@ymhadoop ~]# find  /lib/ -name "*sco.ko"

参考资料

[ERROR: modinfo: could not find module * ]

[CentOS 6.x 内核升级(2.6.32 -> 3.10.58)过程记录]

[Linux CentOS 修改内核引导顺序]

[CentOS7编译内核 详细步骤]

[CentOS系统安装libssl-dev时No package libssl-dev availab]

[CentOS 6.X 系统更改内核启动顺序]

[CentOS 7.3 手动编译安装最新版本Linux Kernel ]

CentOS6-Linux内核编译 详细步骤的更多相关文章

  1. Lab1:Linux内核编译及添加系统调用(详细版)

    实验一:Linux内核编译及添加系统调用(HDU) 花了一上午的时间来写这个,良心制作,发现自己刚学的时候没有找到很详细的,就是泛泛的说了下细节地方也没有,于是自己写了这个,有点长,如果你认真的看完了 ...

  2. 使用autotools工具用configure、make、make install编译安装linux工程的详细步骤

    使用autotools工具用configure.make.make install编译安装linux工程的详细步骤 转载tmxkwzy 最后发布于2016-11-24 10:20:15 阅读数 324 ...

  3. Linux内核编译、安装流程

    原文链接:https://blog.csdn.net/qq_28437139/article/details/83692907 此处只讲linux内核编译步骤至于安装虚拟机,安装ubuntu操作系统请 ...

  4. Linux内核编译完整过程

    Linux内核编译完整过程 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过 ...

  5. Linux 内核 编译模块

    背景: 由于调试内核或者由于分区大小限制,有时候内核组件不一定完全需要编进内核中. 所以,在开发中经常将内核组件编译成为模块,等到在恰当的时机加载. 概览: Linux内核模块的编译方法有两种: 1. ...

  6. 运行在TQ2440开发板上以及X86平台上的linux内核编译

    一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...

  7. linux内核编译环境配置

    linux内核编译环境配置 如果不是编译内核,只需要安装与内核相匹配的kernel-devel开发包即可.即是/lib/modules/`uname -r`/build -> /usr/src/ ...

  8. Linux内核编译与安装

    2013-04-16    Linux内核介绍  Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统.内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.L ...

  9. Linux内核编译配置脚本

    环境 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL Linux内核编译配置脚本 在linux开发过程中熟练使用脚本可以大大简化命令行操作,同时对于需要经常重复操作的指令也是一种备忘 ...

随机推荐

  1. Qt for Android开发入门

    1.    Qt for Android环境搭建 1.1    打包需要的工具 1.2   JDK安装 如果之前配置过,就可以跳过这一步. 下载java jdk 64:java jdk 1.8 x64 ...

  2. 【linux】【jenkins】自动化运维六 构建生成备份

    push tag用于提交代码构建成功后push tag,以防提交代码报错,方便回滚之前正常的代码. 由于采用docker部署的形式,构建失败自动回滚还未实现,待研究解决. 构建后操作选择 Git Pu ...

  3. 第八届蓝桥杯java b组第六题

    标题:最大公共子串 最大公共子串长度问题就是:求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc",可以找 ...

  4. 【已解决】关于IDEA中 Tomcat 控制台打印日志中文乱码的解决

    在 Idea 上面使用 Tomcat 时,发现控制台打印信息的时候,出行中文乱码问题; 可以通过以下几种解决办法 1:在-Dfile.encoding=UTF-8 在vm中设置编码方式 2.然后从Fi ...

  5. python 课后习题 猜数游戏

    4.1 猜数游戏.在程序中预设一个0~9之间的整数,让用户通过键盘输入所猜数字,如果大于预设的数,显示“遗憾,太大了”:如果小于预设的数,显示“遗憾,太小了”:如此循环,直至猜到该数,显示“预测N次, ...

  6. pt-archiver归档数据 源库和目标库是否会出现不一致

    背景 归档的表在源库和目标库都要存在 pt-archiver归档表的场景有:不删原表数据,非批量插入目标库:不删原表数据,批量插入目标库:非批量删除原表数据,非批量插入目标库:批量删除原表数据,批量插 ...

  7. nginx的ngx_http_geoip2模块以精准禁止特定地区IP访问

    要求:对网站的信息,比如某个访问节点不想国内或者国外的用户使用,禁止国内或者国外或者精确到某个城市的那种情况. 解决方式:1.Cloudfalre来实现禁止特定国家的ip访问,比较简单,但是需要mon ...

  8. windows下python和pycharm安装及其使用

    1.python安装及环境变量配置 1.1 python安装 1.1.1 python下载 官网下载:https://www.python.org/ Downloads-Windows(Mac os ...

  9. kotlin系列文章 --- 2.基本语法

    函数 函数定义使用fun关键字,参数格式为:参数:类型,需要声明返回类型 fun sum(a:Int, b:Int): Int{ return a+b } 表达式作为函数体,返回值类型自动推断 fun ...

  10. tiki-graph_formula.php代码执行漏洞复现(或许??)

    1.不知道从哪里翻出来的虚拟机镜像(不知道甚么时候出现在磁盘里面的) 打开配置一下是tikiwiki这个东西 2.遇到陌生的玩意总是忍不住好奇心的,打开nikto扫描一下,发现有些奇怪的东西 本来没抱 ...