记一次centos 7内核升级事故 原
情景
公司做等保3测评,在进行系统漏洞检测时发现内核存在漏洞,需要进行升级。
名称 |
版本 |
---|---|
升级前内核 |
CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core) |
升级后内核 |
CentOS Linux (3.10.0-957.1.3.el7.x86_64) 7 (Core) |
正确操作过程
升级方法
升级方法很简单,找到对应版本的内核rpm包,然后直接使用yum或rpm进行安装即可,该过程中可能需要处理一些包之间的依赖问题。
$ yum install -y kernel-3.10.0-957.1.3.el7.x86_64.rpm kernel-headers-3.10.0-957.el7.x86_64.rpm kernel-tools-3.10.0-957.1.3.el7.x86_64.rpm kernel-tools-libs-3.10.0-957.1.3.el7.x86_64.rpm
生效新版本内核
安装完新版本内核之后一定要进行如下处理,不然就会和我一样在重启服务器的时候踩坑。
接下来操作的目的就是通过grub更改服务器启动时加载内核的版本!
- 查看当前安装的系统内核 $ rpm -qa kernel* kernel-3.10.0-957.1.3.el7.x86_64 kernel-headers-3.10.0-957.el7.x86_64 kernel-tools-3.10.0-957.1.3.el7.x86_64 kernel-tools-libs-3.10.0-957.1.3.el7.x86_64
- 查看当前系统默认启动的内核版本,结果可能有如下两种: $ grub2-editenv list # 结果1:无相关信息 saved_entry=0 # 结果2:当前运行的系统版本 saved_entry=CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)
- 切换系统启动时默认内核版本: $ grub2-set-default 'CentOS Linux (3.10.0-957.1.3.el7.x86_64) 7 (Core)'
- 然后可以顺利重启服务器了,重启后查看系统信息: $ uname -a 或 $ cat /proc/version Linux version 3.10.0-957.1.3.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 29 14:49:43 UTC 2018
至此内核升级完成。
意外
既然有正确操作过程,有时候往往就会一不小心犯点错误。因为是第一次做内核升级,我就顺利的踩坑了。精彩过程请往下看:
重启
新版内核安装完成后需要服务器重启才生效。第一次操作,就当一个普通rpm包升级来处理的,安装完成后果断执行 init 6
重启服务器,结果悲催了,如下图:
卡在这里不动了,看提示信息也没报错,直接回车,结果下面的场景出现了:
找不到对应版本的内核!!!
WTF!!!
解决问题
认真分析一下,提示信息是说找不到”3.10.0-327.el7.x86_64“版本的内核,那既然如此,百度(google)吧!关键词”centos 7 内核升级重启找不到内核“ ,找到一下几篇文章:
- 内核重装: http://blog.51cto.com/zhaoqifly/1841868 (不推荐该方法)
- 修改内核启动顺序及删除无用内核: https://www.cnblogs.com/anliven/p/7944842.html (思路来源)
- centos7 如何修改内核启动顺序: https://www.cnblogs.com/cnsong/p/7058000.html (正确操作过程参考文档)
看过第一篇和第二篇文档后大概了解了修复的原理,即修改内核启动顺序,第一篇中的重装原系统内核对于本次内核升级来说意义不大,第二篇倒是提醒我一个核心——linux系统一切皆文件!
既然可以在服务器宕机前通过grub命令行更改内核启动顺序,那么宕机后肯定可以通过救援模式进入grub修改或者其他办法。
问题复现
因为是第一次遇到这种问题,整好手头有虚拟机,于是就抱着试试看的心理复现了该错误场景,重启虚拟机来到内核选择界面:
提示:"e" 编辑当前所选项目!反正是虚拟机,随便搞就是了,果断进入编辑状态:
刚好有内核信息出现,内心窃喜,不如就试试在这里更改一下系统版本信息,再继续往下看:
一口气全改了就是了,大不了重装系统了(前提当前服务器没部署特别重要的服务,不然的话还是要严谨些)。将上图中红框内的信息都改成新版本 “3.10.0-957.1.3.el7.x86_64” ,然后Ctrl-x,进入系统加载界面,瞬间内心如释重负。
等待系统启动完成,赶紧登陆检查一下状态,一切正常!!!
实践出真知!!!(PS:没事不要瞎搞,搞之前一定要好好学习!!!)
发篇文档装B!!!
(adsbygoogle = window.adsbygoogle || []).push({});
- 15:21爆出的小程序功能升级,你还要对小程序观望吗?
- 如何解决分布式系统中的跨时区问题[原理篇]
- 什么是区块链:块的结构
- Spring读书笔记——bean创建(下)
- 当区块链遇上传统行业 我们的生活和工作会改变吗?
- 如何设计开发好一个 HTTP API?
- [WCF权限控制]基于Windows用户组的授权方式[下篇]
- Spring读书笔记——bean解析
- 10个大数据误区,看看你中了几个?
- 从数据到代码——通过代码生成机制实现强类型编程[上篇]
- Spring读书笔记——bean加载
- Java8-初识Lambda
- 我的WCF之旅(5):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的重载(Overloading)
- WCF技术剖析之三十:一个很有用的WCF调用编程技巧[下篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java中的数字类解析(包括格式化数字、大数运算等等)
- 数据挖掘领域十大经典算法之—K-邻近算法/kNN(超详细附代码)
- 洛谷 P1019 单词接龙
- SpringBoot 将自制的Starter 发布到远程公服
- 【分享】优化rootfs的大小
- PAT (Advanced Level) Practice 1099 Build A Binary Search Tree (30 分)
- 前端国际化辅助工具——自动替换中文并翻译
- Codeforces Round #613 (Div. 2)A. Mezo Playing Zoma
- PAT (Advanced Level) Practice 1096 Consecutive Factors (20 分)
- Codeforces Round #613 (Div. 2)B. Just Eat It!
- java线程池(六):ForkJoinPool源码分析之二(WorkQueue源码)
- Codeforces Round #605 (Div. 3) D. Remove One Element
- 用python爬虫,pyinstaller写一个属于自己的彩虹屁生成器!
- 2020牛客寒假算法基础集训营4 C 子段乘积
- Callable and Future in Java(java中的Callable和Future)