基于RedHat 8.2源码编译升级Kernel 5.8.1

2023-11-17

1.基于RedHat 8.2源码编译升级Kernel 5.8.1

1.1 背景

只是单纯为了验证工作中遇到的一个bug…才诞生了此文

1.2 先从如下网址下载内核源码包,我这里下载的是"linux-5.8.1.tar.gz",大家可根据自己需求自行下载

https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/(我是从这个网站下载的)
https://www.kernel.org/(官网)

在这里插入图片描述

在这里插入图片描述

将"linux-5.8.1.tar.gz"拷贝至系统(RedHat8.2(4.18.0-193.el8.x86_64))本地并解压

#tar -zxvf linux-5.8.1.tar.gz

在这里插入图片描述

在这里插入图片描述

1.3 进入解压文件夹/…/linux-5.8.1,准备文本配置文件

#cp /boot/config-$(uname -r) ./.config

在这里插入图片描述

1.4 选择你需要的内核模块,配置内核选项

#make menuconfig

(1)当执行make menuconfig后发现提示缺"ncurses-devel or libncurses-dev",我们需要安装ncurses-devel package

在这里插入图片描述

(2)安装ncurses-devel package

#rpm -ivh ncurses-devel-6.1-5.20180224.el8.x86_64.rpm --nodeps

在这里插入图片描述

(3)安装ncurses-devel后便可以执行make menuconfig了,会看到关于.config的配置界面,如果没有特殊需求,选择"Save"保存后,点击"Exit"退出当前配置界面即可

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(4)配置结束可以看到打印出"End of the configuration"

在这里插入图片描述

!!!!!!!!!!!!!!!!!!!!
----高能预警:前方踩雷入坑高危区,慎入----
!!!!!!!!!!!!!!!!!!!!

1.5 优化多核、多线程的编译过程

(1)当执行#make -j 4后提示"please install libelf-dev, libelf-devel or elfutils-libelf-devel"

在这里插入图片描述

那我们就按照报错提示安装"elfutils-libelf-devel"吧

在这里插入图片描述

但我们安装"gcc-toolset-9-elfutils-libelf-devel-0.176-5.el8.x86_64.rpm"和"gcc-toolset-9-elfutils-libelf-0.176-5.el8.x86_64.rpm"后再次执行#make -j 4发现还是提示"please install libelf-dev, libelf-devel or elfutils-libelf-devel",咨询大神才明白安装错了rpm package,正确的package应该是"elfutils-libelf-devel-0.180-1.el8.x86_64.rpm"

http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/

在这里插入图片描述

(2)当安装"elfutils-libelf-devel-0.180-1.el8.x86_64.rpm"后再执行#make -j 4后发现不会再提示"please install libelf-dev, libelf-devel or elfutils-libelf-devel",但问题又来了,提示"fatal error: openssl/opensslv.h: No such file or directory"

在这里插入图片描述

于是我一口气安装了好几个与openssl相关的rpm package

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

但是结果却不尽人意,执行#make -j 4后还是提示"fatal error: openssl/opensslv.h: No such file or directory"

在这里插入图片描述

咨询大神,发现又装错了rpm package,好吧,那按照大神说的,安装"libssl-devel-1.1.1i-alt2.x86_64.rpm"吧

在这里插入图片描述

果不其然,竟然成功了,我是开森的,安装"libssl-devel-1.1.1i-alt2.x86_64.rpm"后竟然不会提示"fatal error: openssl/opensslv.h: No such file or directory"了

(3)若在执行#make -j 4的过程中提示"warning: objtool: mce_panic()+0x113: unreachable instruction",可忽略

在这里插入图片描述

(4)以上执行#make -j 4的步骤都是在百度查到的,没有关注-j后的value,经大神指点,-j后最好加上机器的Core(有翻阅资料发现:默认的make不加-j参数效率比较低,加上-j参数,-j4和-j8性能差距不大,-j16性能就比较差了),如下是我的测试环境CPU的核心数

#lscpu

在这里插入图片描述

(5)所以接下来我们都改成j56吧,执行#make -j56 modules,提示"No rule to make target ‘certs/rhel.pem’, needed by ‘certs/x509_certificate_list’. Stop"

在这里插入图片描述

此时需要在Kernel文件夹"linux-5.8.1"中,找到"./config"文件,禁掉"certs/rhel.pem":
CONFIG_SYSTEM_TRUSTED_KEYS=“certs/rhel.pem”
改成CONFIG_SYSTEM_TRUSTED_KEYS=""

在这里插入图片描述

在这里插入图片描述

(6)禁掉"certs/rhel.pem"后再次执行#make modules,哦多壳,又来…提示"Try to disable CONFIG_DEBUG_INFO_BTF"

在这里插入图片描述

我们在Kernel文件夹"linux-5.8.1"中,再次找到"./config"文件,禁掉"CONFIG_DEBUG_INFO_BTF":

CONFIG_DEBUG_INFO_BTF=y
改成#CONFIG_DEBUG_INFO_BTF=y

修改命令:

#perl -p -i -e “s/CONFIG_DEBUG_INFO_BTF=y/#CONFIG_DEBUG_INFO_BTF=y/g” .config

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

(7)至于为什么要安装"dwarves-1.15-4.el8.x86_64.rpm",我也不是很懂,这张图既然被我留存下来了,说明肯定是在编译过程中有出现关于"dwarves"的报错了,那我们也安装下吧

dwarves:调试信息,一种无需解析就可以理解源码的方式

#rpm -ivh dwarves-1.15-4.el8.x86_64.rpm --nodeps

在这里插入图片描述

由于前面执行了#make -j 4,#make -j56 modules,因此需要#make clean下,重新编译模块

(8)单独编译模块,驱动被配置成M的都是Modules,Modules不会被编译进内核Image,需要单独安装到rootfs,模块编译过程大概需要1小时,由于编译大概有1W行左右,自动清屏了,所以在下图中看不到最开始编译的部分

#make -j56 modules

在这里插入图片描述

在这里插入图片描述

将编译好的模块拷贝到系统目录下(一般是/lib/modules/),也可自己指定ko安装路径

#make ARCH=arm64 modules_install INSTALL_MOD_PATH=yourpath
如:#make ARCH=arm64 modules_install INSTALL_MOD_PATH="modules_install_path"

在交叉编译的情况下,需要将ko模块安装到rootfs

1.6 系统模块安装开始

#make -j56 modules_install

(1)安装arch/block/crypto系列

在这里插入图片描述

(2)安装drivers系列

在这里插入图片描述

(3)安装fs系列

在这里插入图片描述

(4)安装kernel/lib/mm/net系列

在这里插入图片描述

(5)安装sound系列

在这里插入图片描述

(6)安装virt系列

至此,#make -j56 modules_install 结束

执行#ll /usr/lib/modules可看到已成功安装Kernel 5.8.1的Modules

在这里插入图片描述

1.7 安装内核相关文件,如果执行make install后发现提示"Missing file: arch/x86/boot/bzImage",则需要安装bzImage为/boot/vmlinuz-VERSION-RELEASE

在这里插入图片描述

#make -j56 bzImage

在这里插入图片描述

在这里插入图片描述

1.8 安装内核二进制映像, 生成并安装boot初始化文件,系统映像文件

#make install

生成bzImage后发现/boot目录依旧没有生成关于Kernel 5.8.1的相关文件(initramfs,System.map,vmlinuz等),所以我们还需要#make install,这样,就能在/boot目录下看到生成的关于Kernel 5.8.1的相关文件了

在这里插入图片描述

1.9 最后,重启系统(万物皆可重启)

#reboot

终于…看到我最最最最最最最最最期待的一张图片了,开心~~

在BootLoader界面可以看到已升级的Kernel 5.8.1

在这里插入图片描述

进入系统,查看当前系统内核版本为5.8.1. 至此,成功升级Kernel 5.8.1,Over~~~

#uname -r
或#uname -a

在这里插入图片描述

1.10 最后简单总结下对于"linux-xxx.tar.gz"这种内核源码包的配置编译升级过程

(1)鄙人编译的实际顺序是:

#tar -zxvf linux-xxx.tar.gz
#cp /boot/config-$(uname -r) ./.config
#make menuconfig
#make -j56 modules
#make -j56 modules_install
#make -j56 bzImage
#make -j56 install
#reboot

(2)按照大神的意思编译顺序(以后有时间再试试这种顺序吧)应该是:

#tar -zxvf linux-xxx.tar.gz
#cp /boot/config-$(uname -r) ./.config
#make menuconfig
#make -j56 bzImage
#make -j56 modules
#make -j56 modules_install
#make -j56 install
#reboot

2.基于CentOS 7u6 升级rpm文件的Kernel 5.4.87-19.0004

2.1 背景

国内各大云厂商不断开源自己定制优化的OS,近日,腾讯云宣布开源其云服务器操作系统TencentOS内核(TencentOS Server Kernel,又称 Tencent Linux,简称 Tlinux),接下来让兰兰酱简单介绍下这种Tlinux Kernel升级方式吧

2.2 解压"Tlinux4-0004.zip"压缩包

#unzip Tlinux4-0004.zip

在这里插入图片描述

2.3 修改系统时间为当前北京时间

#date -s "2021-02-18 12:26:00"

在这里插入图片描述

2.4 安装Tlinux下的rpm package,我们发现安装失败

#rpm -Uvh *

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.5 我们加俩参数解除依赖性并强制安装下吧

#rpm -Uvh * --nodeps --force

2.6 然而安装后,发现只能安装5个rpm package,有个rpm package始终安装不上:perf-5.4.87-19.0004.tl2.x86_64.rpm

#rpm -qa | grep 5.4.87

2.7 看到/usr/lib/modules目录已成功安装Kernel 5.4.87-19.0004的相关Modules

#ll /usr/lib/modules

2.8 看到/boot目录已生成关于Kernel 5.4.87-19.0004的相关文件(initramfs,symvers,System.map,vmlinuz,vmlinux等)

#ll /boot

2.9 重新生成GRUB文件(如果想保留之前的Kernel,此步骤可以省略,因为发现当执行"grub2-mkconfig…"命令后破坏了我之前的Kernel 3.10.0-957,欲哭无泪哈哈哈哈哈哈)

#grub2-mkconfig –o /boot/efi/EFI/redhat/grub.cfg

2.10 重启

#reboot

在这里插入图片描述

2.11 见证奇迹的BootLoader界面

在这里插入图片描述

2.12 进入系统查看内核也是5.4.87-19.0004,说明升级成功

#uname -a
#uname -r

在这里插入图片描述

2.13 可是还有一个遗留的rpm package升级失败,有尝试过安装本地yum源也安装失败,为什么呢,各种查资料请教大神都无解

#yum install perf-5.4.87-19.0004.tl2.x86_64.rpm

在这里插入图片描述

2.14 后来请教腾讯的大神,需要加上"–noscripts"参数才能安装成功

#rpm -ivh perf-5.4.87-19.0004.tl2.x86_64.rpm --noscripts --nodeps --force

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.15 "–noscripts"参数番外篇

(1)解决方法为加–noscripts标记来删除RPM
–noscripts 相当于 --nopre --nopost --nopreun --nopostun

(2)卸载命令为:

#rpm -e --noscripts wine-20050310-1fc1winehq

(3)若要查看与RPM关联的scripts,使用–script查询RPM包

#rpm -q --scripts package

(4)卸载时,若系统里有同一程序的多个安装版本要一起删除,可使用–allmatches标记,如

#rpm -e --noscripts --allmatches wine

2.16 总结如下:

(1)升级Kernel

#rpm –Uvh kernel-XXX.rpm

(2)重新生成GRUB文件

For legacy mode:

#grub2-mkconfig –o /boot/grub2/grub.cfg

For UEFI mode:

#grub2-mkconfig –o /boot/efi/EFI/redhat/grub.cfg

(3)重启系统

#reboot

3.对于标准RHEL OS,参考如下链接升级OSV提供的kernel 版本

https://eos.labs…com/RHEL_update.htm

User Guide of RedHat Satellite Server

(1)Supported OS list

RHEL 7.6 and later version
RHEL 8.0 and later version

(2)Preparation

1)Connect the lab lan

2)Confirm your machine is the correct date,modify the date

date –s "2020-1-3 12:00:00"

3)Can not use the default hostname “localhost”,modify the temporary hostname

#hostname XXX

(3)Register the satellite server

#rpm -Uvh http://sate.labs…com/pub/katello-ca-consumer-latest.noarch.rpm
#subscription-manager register --org=“Default_Organization” --activationkey="base"
#yum update/install XXX

(4)Unregister,Please unregister it after the installation/update

#subscription-manager unregister
#subscription-manager clean

(5)Note:The default setting is not enable the whole repos,if you need the additional repos,you can enable it manually

1)Get the availiable repos

#subscription-manager repos --list

2)Enable the request repos

#subscription-manager repos --enable [Repo ID]

4.关于卸载内核,等有时间再尝试并完善这篇文章吧

(1)删除/usr/lib/modules/目录下不需要的内核库文件
(2)删除/usr/src/linux/目录下不需要的内核源码
(3)删除/boot目录下启动的内核和内核映像文件
(4)更改/boot/grub2的配置文件,删除不需要的内核启动列表

之所以能够成功,是因为有三位大神两天的鼎力相助,太感谢了. 嘿嘿,我一个小白,老是问他们问题,估计被我烦死了,他们工作也很忙的,当然也谢谢自己,百度各种查资料.

兰兰酱需要学习的还有很多,很多…

未完待续…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于RedHat 8.2源码编译升级Kernel 5.8.1 的相关文章

  • thread_Timer(线程中定时器)

    package com gzhs zsd thread import java util Date import java util Timer import java util TimerTask Timer定时器运用 author 谢泽
  • java 支付宝红包接入

    1 将公钥验证升级为证书验证 会得到如下三个证书 2 配置文件相关 支付宝支付相关配置 alipayconfig appid pid app private key charset utf 8 alipay public key call
  • Ubuntu 提示 Could not get lock /var/lib/dpkg/lock-frontend.解决方法

    今天在Ubuntu上安装的达梦数据库出现了一点操作错误 进行删除后还原快照就出现了这个问题 当我进行 apt 源安装还有更新时就一直显示 Waiting for cache lock Could not get lock var lib d
  • 解决VScode代码注释异常高亮

    问题描述 VScode出现代码注释后仍然高亮的问题 或者定义的函数名或者关键词没有高亮 如下所示 正常情况 异常情况 原因分析 同时装了python的扩展和vscode for python的扩展导致 两个扩展的主题配色冲突 解决方案 卸载
  • unity之InputField的文本监听

    1 创建InputField creat gt UI gt InputField 2 基本属性界面 可以再content type属性下设置InputField的文本类型 图片中无显示 3 文本监听 创建脚本 代码如下 using Syst
  • 计算机视觉————目标检测,多尺度问题理解以及FCN(全卷积神经网络)存在的弊端,问题。

    在阅读文献中 通常会遇到一个名词 XX用来解决多尺度问题 多尺度问题是什么意思 目标检测中 我们希望对于输入图片 不管图片中某个目标或大或小 我们都需要将其识别 对于小物体 我们可以将其理解为两种方式 一种是绝对小物体 即它本身占的像素就比
  • Android.bp 语法浅析-Android10.0编译系统(八)

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • mysql怎么创建出生日期表_MySQL表的创建

    第1步 设计 首先要设计一张用于我想要用途的表 例如如下用于描述个人的信息类型 姓名 性别 出生日期 地址 最喜爱的食物 下面为他来指定列和数据类型 列 类型 允许值 name varchar 40 gender char 1 M F bi
  • MyBatis之枚举类型

    枚举可以让代码变得更为优雅 B格更高 当然MyBatis也是支持枚举类型的啦 首先 MyBatis内置了Enum的TypeHandler TypeHandler Java类型 JDBC类型 EnumTypeHandler Enum VARC
  • 华为机试练习(二)二叉树遍历

    题目描述 给定一棵二叉树的前序遍历和中序遍历 求其后序遍历 输入 两个字符串 其长度n均小于等于26 第一行为前序遍历 第二行为中序遍历 二叉树中的结点名称以大写字母表示 A B C 最多26个结点 输出 输入样例可能有多组 对于每组测试样
  • NodeJs模块化

    目录 一 导入模块 二 模块暴露数据 三 注意事项 一 导入模块 在模块中使用 require 传入文件路径即可引入文件 const test require me js 案例 在func js中定义一个函数 在index js使用该函数
  • kube-flannel.yml

    flannel作为k8s的集群中常用的网络组件 其yml文件的获取 建议去github中获取 具体的获取方式如下 apiVersion policy v1beta1 kind PodSecurityPolicy metadata name
  • C#实现组合优化问题算法-背包问题(附源码)

    C 实现组合优化问题算法 背包问题 附源码 背包问题是一类经典的组合优化问题 也是NP完全问题中的一种 其基本思想是 有一个容量为V的背包和n个物品 每个物品有自己的体积和价值 在保证不超过背包容量的前提下 选择某些物品装入背包 使得背包中
  • 依赖项注入

    ASP NET Core 通过依赖关系注入 DI 生成 服务 如数据库上下文 在 Program cs 中向 DI 注册 这些服务通过构造函数参数提供给需要它们的组件 在 Controllers MoviesController cs 文件
  • rsyslogd、syslog远程传输、日志存储、转存

    一 产生本地日志 1 etc resolv conf 配置文件 local0 local7是用户自定义的日志 这里我们使用local1 添加以下 local1 www admin admin log web log 配置完需要重启 rsys
  • DNS 解析一个地址的时候会返回多个 IP 吗?

    这是一个或许对你有用的社群 一对一交流 面试小册 简历优化 求职解惑 欢迎加入 芋道快速开发平台 知识星球 下面是星球提供的部分资料 项目实战 视频 从书中学 往事上 练 互联网高频面试题 面朝简历学习 春暖花开 架构 x 系统设计 摧枯拉
  • nginx php-fpm 分别安装在不同的机器(理解nginx和php-fpm)

    先起一个ubuntu的docker docker run ti name test1 ubunt 然后安装php5 fpm apt get install php5 fpm 配置fpm 允许从其他机器访问 listen 9000 默认是12
  • 树实现客户端红点系统

    树实现客户端红点系统 红点系统总览 demo 设计 代码设 引用 https zhuanlan zhihu com p 85978429 红点系统总览 如上图所示 规划红点系统的时候 我们将整个系统分为独立的三个部分 结构层 驱动层和表现层
  • C++ 循环练习第2题:输出一个整数序列中与指定数字相同的数的个数。输入包含2行:第1行为n和m,表示整数序列的长度n<=100和指定的数字;第2行为n个整数,整数之间以一个空格分开。输出为n个数中与

    C 循环练习第2题 输出一个整数序列中与指定数字相同的数的个数 输入包含2行 第1行为n和m 表示整数序列的长度n lt 100和指定的数字 第2行为n个整数 整数之间以一个空格分开 输出为n个数中与m相同的数的个数 1 题目 2 循环解决
  • 计算机网络——第4章网络层(上)

    目录 第 4 章 网络层 上 基本概念 IP地址 基本概念 IP地址结构 ABC三类IP地址 A类 B类 C类 子网地址的结构 子网掩码 无类域间路由技术CIDR CIDR地址块 CIDR地址规划方法 最长前缀匹配 IP地址相关的解题步骤

随机推荐