测试时间:2024年5月15日,本文测试CentOS7.9的内核版本升级

测试结论:不要选择手动编译的方式!!!

一、使用第三方仓库(ELRepo)

(1)升级前内核查看(3.10.0-1160.el7.x86_64):uname -a 或者 uname -r

(2)添加ELRepo仓库

yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm

(3)检查可安装的内核版本

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

(4)安装指定版本的内核

yum --enablerepo=elrepo-kernel install -y kernel-<version>

(5)更新引导加载器配置

# 设置开机从新内核启动
grub2-set-default "CentOS Linux (5.4.275-1.el7.elrepo.x86_64) 7 (Core)"

(6)可以检查一下 /boot/grub2/grub.cfg中menuentry的内容

(7)重启服务器,查看内核版本

二、手动编译和安装

  阿弥陀佛,施主回头是岸!

自测评价:太慢了,还容易出错。不推荐使用该方法

(1)查看操作系统以及内核的版本

(2)安装编译工具和依赖

yum groupinstall 'Development Tools'
yum install kernel-devel kernel-header elfutils-libelf-devel

(3)下载内核源码:https://kernel.org/

(4)解压并配置内核

# 解压
tar -xvf linux-5.4.275.tar.xz

# 配置内核
make olddefconfig

(5)编译内核 no! 不要往下走了

time make -j$(nproc)
make modules_install
make install

心态崩了......就像肉夹馍,吃到了虫子,并且还是半只... (ಥ﹏ಥ)

三、Q&A

Q1:手动编译和安装时,执行time make -j$(nproc)有如下报错

注意:根据以下解决报错后,重新执行time make -j$(nproc)

Answer:

1、构建过程中试图生成ORC(Optimized Restartable Sequences)元数据,但缺少必要的开发库。

解决:

  • yum install libelf-devel(Red Hat系统:Fedora、CentOS)
  • apt-get install libelf-dev(Debian系统:Ubuntu)
  • dnf install elfutils-libelf-devel(较新的Fedora/CentOS)

2、在编译过程中需要访问OpenSSL的头文件,所以需要安装OpenSSL的开发包

解决:yum install openssl-devel

Q2:在Q1问题解决后,再次执行time make -j$(nproc),发现有以下提示,但是编译过程并未中断。

  在执行 make 命令,尤其是在编译像操作系统内核这样的大型项目时,缺少花括号({})通常会导致代码结构不完整,从而影响代码的正确编译。花括号在C语言及类似语言中用于定义代码块的范围,比如循环体、条件语句块或函数体等。如果花括号缺失,编译器可能无法正确理解哪些语句应该被包含在特定的控制结构中。

对于内核升级过程,这确实是个问题,因为它可能会导致以下几个后果:

(1)编译错误:最直接的影响是编译失败,因为编译器会在遇到语法错误时停止编译过程。
(2)逻辑错误:即使某些情况下编译通过了(例如,如果缺少的花括号导致的逻辑块很小,而编译器默认将其与下一行关联),这也可能导致内核功能不按预期工作,因为执行的代码逻辑与设计意图不符。
(3)潜在的安全风险:代码逻辑的改变可能引入安全漏洞,特别是在内核这样对安全性要求极高的软件中。
(4)维护困难:代码的可读性和可维护性降低,给后续的开发和调试带来不必要的复杂度。

因此,如果在尝试编译内核时遇到提示缺少花括号的错误,应该首先修正这些语法错误,确保所有的控制结构(如if语句、for循环等)都有正确的花括号来界定其作用域。这不仅是修复编译错误所必需的,也是保证内核正确、安全运行的基础。

Q3:手动编译的方式升级内核问题可能会很多......(此处强烈建议不要使用该方式)

— 业精于勤荒于嬉,行成于思毁于随 —

Linux - 内核版本升级的更多相关文章

  1. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核

    HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...

  2. Linux 内核概述 - Linux Kernel

    Linux 内核学习笔记整理. Unix unix 已有40历史,但计算机科学家仍认为其是现存操作系统中最大和最优秀的系统,它已成为一种传奇的存在,历经时间的考验却依然声名不坠. 1973 年,在用 ...

  3. 模仿Linux内核kfifo实现的循环缓存

    想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...

  4. linux内核调试技术之printk

    原创博客:欢迎转载,转载请注明出处https://i.cnblogs.com/EditPosts.aspx?postid=6218383 1.简介(基于s3c2440 linux) 在内核调试技术之中 ...

  5. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  6. Linux内核配置、编译及Makefile简述

    Hi,大家好!我是CrazyCatJack.最近在学习Linux内核的配置.编译及Makefile文件.今天总结一下学习成果,分享给大家^_^ 1.解压缩打补丁 首先是解压缩你获取到的Linux内核. ...

  7. linux内核数据结构之kfifo

    1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...

  8. 浅析linux内核中的idr机制

    idr在linux内核中指的就是整数ID管理机制,从本质上来说,这就是一种将整数ID号和特定指针关联在一起的机制.这个机制最早是在2003年2月加入内核的,当时是作为POSIX定时器的一个补丁.现在, ...

  9. gcc/linux内核中likely、unlikely和__attribute__(section(""))属性

    查看linux内核源码,你会发现有很多if (likely(""))...及if (unlikely(""))...语句,这些语句其实是编译器的一种优化方式,具 ...

  10. Linux 内核版本命名

    Linux 内核版本命名在不同的时期有其不同的规范,我们熟悉的也许是 2.x 版本奇数表示开发版.偶数表示稳定版,但到 2.6.x 以及 3.x 甚至将来的 4.x ,内核版本命名都不遵守这样的约定. ...

随机推荐

  1. OS之《进程管理》

    进程同步 同步实际上是指:将多个进程,按照顺序,有序执行. 让进程有序进行的场景有很多.比如:一个进程依赖另外一个进程的计算结果:一个进程等待另外一个对临界资源的访问:还有像生产者消费者模型中的相互配 ...

  2. 4.mysql中的存储过程

    创建存储过程和函数 CREATE [DEFINER = {USER | CURRENT_USER}] # 定义者是谁 PROCEDURE sp_name ([proc_parameter[,...]] ...

  3. 搭建SpringBoot中验证数据机制问题 Add a provider like Hibernate Validator (RI) to your classpath

    搭建SpringBoot中的验证数据机制时出现的错误 报错代码 java.lang.IllegalStateException: Failed to load ApplicationContext a ...

  4. JS操作iframe父级子级元素,jquery自动点击iframe里按钮

    在父窗口中操作 选中iframe中的id $(window.frames["ifm"].document).find("#id").attr("val ...

  5. Qt/C++编写网络摄像头推流(4路1080P主码流只占用0.2%CPU/极低延时极速响应)

    一.前言说明 将从网络摄像头拉流过来的视频流重新推流出去,是目前一个很常规的做法,尤其是推流到流媒体服务中心,这样流媒体服务中心就把散落在各个区域的监控摄像头集中起来统一管理,同时提供对外一致的访问接 ...

  6. IM通讯协议专题学习(三):由浅入深,从根上理解Protobuf的编解码原理

    本文由码农的荒岛求生陆小风分享,为了提升阅读体验,进行了较多修订和排版. 1.引言 搞即时通讯IM方面开发的程序员,在谈到通讯层实现时,必然会提到网络编程.那么计算机网络编程中的一个非常基本的问题:到 ...

  7. 直播系统聊天技术(八):vivo直播系统中IM消息模块的架构实践

    本文由vivo互联网技术团队LinDu.Li Guolin分享,有较多修订和改动. 1.引言 IM即时消息模块是直播系统的重要组成部分,一个稳定.有容错.灵活的.支持高并发的消息模块是影响直播系统用户 ...

  8. mac zshrc环境变量配置

      配置mac zshrc的环境变量时犯了一个错误,我配置了多个export PATH, 结果只有一个PATH生效了,所以配置多个PATH是错误的: zshrc中环境变量配置如下: export AN ...

  9. 分布式Session解决方案详解

    4种分布式session解决方案 cookie和session的区别和联系 cookie是本地客户端用来存储少量数据信息的,保存在客户端,用户能够很容易的获取,安全性不高,存储的数据量小session ...

  10. MQ的定时任务改装,实现自定义定时:MQ+redis

    package com.*.server.live.listener; import com.*.common.core.entity.constant.LiveConstant; import co ...