背景
在 CentOS 使用过程中,难免需要升级内核,但有时候因为源码编译依赖问题,不一定所有程序都支持最新内核版本,所以以下将介绍两种升级内核方式。
注意事项
- ML 与 LT 两种内核类型版本可以共存
- 但每种类型内核只能存在一个版本
- 例如:
- 当系统已存在 LT 内核的 5.4.103 版本时,继续安装 LT 内核的 4.4.215 版本则会提示:
package kernel-lt-5.4.103-1.el7.elrepo.x86_64 (which is newer than kernel-lt-4.4.215-1.el7.elrepo.x86_64) is already installed
yum 安装
升级至最新
导入仓库源
plain text_snippet
Plain Text · 3 lines|
| rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
| rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm |
查看可安装的软件包
plain text_snippet
Plain Text · 1 line|
| yum --enablerepo="elrepo-kernel" list --showduplicates | sort -r | grep kernel-ml.x86_64 |
选择 ML 或 LT 版本安装
plain text_snippet
Plain Text · 5 lines|
| # 安装 ML 版本 |
| yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y |
| # 安装 LT 版本,K8S全部选这个 |
| yum --enablerepo=elrepo-kernel install kernel-lt-devel kernel-lt -y |
查看现有内核启动顺序
plain text_snippet
Plain Text · 1 line|
| awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg |
修改默认启动项
xxx 为序号数字,以指定启动列表中第 x 项为启动项,x 从 0 开始计数
plain text_snippet
Plain Text · 1 line|
| grub2-set-default xxxx |
例如设置以 4.4 内核启动
则直接输入“grub2-set-default 0”,下次启动即可从 4.4 启动
plain text_snippet
Plain Text · 18 lines|
| # 查看内核启动序号 |
| [root@localhost ~] awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg |
| CentOS Linux (4.4.179-1.el7.elrepo.x86_64) 7 (Core) |
| CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core) |
| CentOS Linux (0-rescue-6d4c599606814867814f1a8eec7bfd1e) 7 (Core) |
| # 设置启动序号 |
| [root@localhost ~] grub2-set-default 0 |
| # 重启 |
| reboot |
| # 检查内核版本 |
| uname -r |
安装指定内核版本
本次以安装 LT 内核的 4.415 版本为例。
查找版本
查找 kernel rpm 历史版本:http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/
下载内核 RPM
plain text_snippet
Plain Text · 3 lines|
| wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64.rpm |
| wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-4.4.215-1.el7.elrepo.x86_64.rpm |
| wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-4.4.215-1.el7.elrepo.x86_64.rpm |
安装内核
plain text_snippet
Plain Text · 2 lines|
| rpm -ivh kernel-lt-4.4.215-1.el7.elrepo.x86_64.rpm |
| rpm -ivh kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64.rpm |
确认已安装内核版本
plain text_snippet
Plain Text · 9 lines|
| [root@localhost ~]# rpm -qa | grep kernel |
| kernel-headers-3.10.0-1160.15.2.el7.x86_64 |
| kernel-devel-3.10.0-1160.49.1.el7.x86_64 |
| kernel-tools-libs-3.10.0-957.el7.x86_64 |
| kernel-3.10.0-957.el7.x86_64 |
| kernel-ml-4.9.9-1.el7.elrepo.x86_64 |
| kernel-lt-4.4.215-1.el7.elrepo.x86_64 |
| kernel-tools-3.10.0-957.el7.x86_64 |
| kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64 |
设置启动
plain text_snippet
Plain Text · 12 lines|
| # 查看启动顺序 |
| [root@localhost ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg |
| CentOS Linux (4.4.215-1.el7.elrepo.x86_64) 7 (Core) |
| CentOS Linux (4.9.9-1.el7.elrepo.x86_64) 7 (Core) |
| CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core) |
| CentOS Linux (0-rescue-b91f945269084aa98e8257311ee713c5) 7 (Core) |
| # 设置启动顺序 |
| [root@localhost ~]# grub2-set-default 0 |
| # 重启生效 |
| [root@localhost ~]# reboot |
源码安装
环境准备
安装核心软件包
plain text_snippet
Plain Text · 2 lines|
| yum install -y gcc make git ctags ncurses-devel openssl-devel |
| yum install -y bison flex elfutils-libelf-devel bc |
创建内核编译目录
使用
home 下的 kernelbuild 目录获取内核源码
linux-4.xx.xx.tar.xz
linux-4.xx.xx.tar.gz
这两个格式都可以的,tar.xz 压缩率更高,文件更小。
plain text_snippet
Plain Text · 1 line|
| wget https://mirror.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.17.11.tar.xz |
解压内核代码
将其解压后进入源码目录:
plain text_snippet
Plain Text · 1 line|
| tar -xvJf linux-4.17.11.tar.xz |
为确保内核树绝对干净,进入内核目录并执行 make mrproper 命令:
plain text_snippet
Plain Text · 2 lines|
| cd linux-4.17.11 |
| make clean && make mrproper |
内核配置
复制当前的内核配置文件
config-3.10.0-862.el7.x86_64是我当前环境的内核配置文件,根据实际情况修改plain text_snippet
Plain Text · 1 line|
| cp /boot/config-3.10.0-862.el7.x86_64 .config |
高级配置
编译和安装
编译内核
plain text_snippet
Plain Text · 1 line|
| make -j x |
安装内核
编译完内核后安装:
plain text_snippet
Plain Text · 1 line|
| make modules_install install |
设置启动
plain text_snippet
Plain Text · 12 lines|
| # 查看启动顺序 |
| [root@localhost ~]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg |
| CentOS Linux (4.17.11-1.el7.elrepo.x86_64) 7 (Core) |
| CentOS Linux (4.9.9-1.el7.elrepo.x86_64) 7 (Core) |
| CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core) |
| CentOS Linux (0-rescue-b91f945269084aa98e8257311ee713c5) 7 (Core) |
| # 设置启动顺序 |
| [root@localhost ~]# grub2-set-default 0 |
| # 重启生效 |
| [root@localhost ~]# reboot |
卸载 / 降级 内核
例如:
当系统已存在 LT 内核的 5.4.103 版本时,继续安装 LT 内核的 4.4.215 版本则会提示:
package kernel-lt-5.4.103-1.el7.elrepo.x86_64 (which is newer than kernel-lt-4.4.215-1.el7.elrepo.x86_64) is already installed这时就需要进行内核降级,卸载最新版的内核。
查看系统当前内核版本
plain text_snippet
Plain Text · 2 lines|
| [root@localhost ~]# uname -r |
| 5.4.103-1.el7.elrepo.x86_64 |
查看系统中全部内核
plain text_snippet
Plain Text · 9 lines|
| [root@localhost ~]# rpm -qa | grep kernel |
| kernel-headers-3.10.0-1160.15.2.el7.x86_64 |
| kernel-devel-3.10.0-1160.49.1.el7.x86_64 |
| kernel-tools-libs-3.10.0-957.el7.x86_64 |
| kernel-3.10.0-957.el7.x86_64 |
| kernel-ml-4.9.9-1.el7.elrepo.x86_64 |
| kernel-lt-5.4.103-1.el7.elrepo.x86_64 |
| kernel-tools-3.10.0-957.el7.x86_64 |
| kernel-lt-devel-5.4.103-1.el7.elrepo.x86_64 |
删除指定内核
plain text_snippet
Plain Text · 3 lines|
| yum remove -y kernel-lt-devel-5.4.103-1.el7.elrepo.x86_64 |
| yum remove -y kernel-lt-5.4.103-1.el7.elrepo.x86_64 |
检查卸载后内核版本
plain text_snippet
Plain Text · 7 lines|
| [root@localhost ~]# rpm -qa | grep kernel |
| kernel-headers-3.10.0-1160.15.2.el7.x86_64 |
| kernel-devel-3.10.0-1160.49.1.el7.x86_64 |
| kernel-tools-libs-3.10.0-957.el7.x86_64 |
| kernel-3.10.0-957.el7.x86_64 |
| kernel-ml-4.9.9-1.el7.elrepo.x86_64 |
| kernel-tools-3.10.0-957.el7.x86_64 |
✦ 卷终 · 柯航存卷 ✦