文章目录
0X1 序章
在某些情况下,可能需要对操作系统的内核进行必要的升降,本文提供几个内核更换的方式,以期帮助到各位朋友进行内核的更换,本文以CentOS Linux release 7.9.2009 (Core)系统为例进行参数,对Oracle Linux、Ubuntu、Red Hat等操作系统亦有参考的作用。本文以一个全新的CentOS Linux release 7.9.2009 (Core)系统为例,从换源开始一一进行讲解,重点包含多种内核的升降级的方式以及内核崩溃转储服务kdump的开启。
所有操作的均需要保证有网络。
0X2 换源
由于Centos的镜像源是国外的,因此我们在下载东西的时候极为不变,为了提高速度,建议更换为国内的源,比较好的国内的镜像源有阿里云、清华、中科大的源。这里笔者参考阿里云的换源教程进行换源。
2.1 对原有源进行备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2.2 下载新源到 /etc/yum.repos.d/下
正常来说,由于操作系统是Centos7,所以这里一般换Centos7的源,这个命令的意思是下载来自阿里云网站的repo文件,使用-O参数是指定文件的保存路径和名字
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
2.3 生成缓存
yum makecache
2.4 更新软件包
yum -y update
0X3 内核更换
首先确定系统的内核版本,然后确定要更换的内核版本,内核的更换主要有三重方式,第一种是下载源码进行编译;第二种是通过添加内核源,然后使用yum进行安装;第三种是通过下载rpm包,然后通过rpm来进行安装。
三种方法各有优缺点,第一种,通过源码进行编译按安装,他的优点是可以去网站找内核的代码进行编译,对于大佬来说比较友好(作者是小菜鸡,比不了各位大佬),但是缺点也是非常的明显,就是需要耗费大量的时间去编译,还有的情况就是编译后的内核还是无法使用,额…,这就很搞心态了;第二种,通过添加内核源,然后使用yum去安装,操作简单,对于笔者这种小白非常友好,但是存在的问题是,只能下载源内存在的内核,非源内存在的内核是无法下载的,对于官网不再维护的内核,大部分是下载不了的;而第三种就可以解决这种问题,直接从网上对需要的内核包进行查找,然后下载rpm包,使用rpm包管理器进行安装。由于第一种源码编译很费时,本文将不会阐述此种方式。
3.1 序幕
使用以下命令可查看当前系统的内核版本
[root@localhost ~]# uname -r
3.10.0-1160.el7.x86_64
列出可用内核软件包,
[root@localhost ~]#yum list kernel --showduplicates
但是目前均是只能升级,对于降级或者更换过期的内核极不友好,所以第二种方法夭折,继而从事第三种方式,也是笔者比较推崇的一种,使用rpm包进行安装。
此种方式的安装的困难点在于如何找到对应内核版本的rpm包,本文提供两种查找方法帮助大家进行查找。
3.2 rpm包查找
1 方法1
使用搜索引擎的语法进行快速查找,此方法简便,各家搜索语法各有差异。个人推荐使用Google进行查找,以kernel-3.10.0-123.el7.x86_64.rpm 查找为例,Google的进去就可以查找下载了,百度就,额…,就各种网站套娃,付费下载,博客转载等。
以下是对比效果
----百度----
2 方法2
通过查找各发行版本对应的内核,然后找到各发行版本的仓库,然后下载rpm包。还是以kernel-3.10.0-123.el7.x86_64.rpm为例。看到有篇博客总结了一部分,这里贴上链接,有需要的可以去看看,centos 各版本发行时间和内核对应列表
可以看到,要找的内核时centos7.0版本的,这是我们去centos的官网镜像站进行下载。这里提供两个网站,当然从前边一个网站时可以到达后边一个的。
第一个是Centos官网不再支持的内核或者操作系统,会将其移到一个叫vault的镜像库去:
https://vault.centos.org/
第二个是现阶段还是维护的内核或者操作系统均放到这个网站去:
https://mirrors.edge.kernel.org/centos/
当然了如果从下边这个网站访问过时的内核,还是会找到上边的网站去,因为现维护的里边只有一个readme.txt文件,文件内容如下
内核存在的路径一般为
版本号/os/x86_64/Packages/
到达此页面后可使用"ctr+f"对内核进行快速查找
这样我们就能下载rpm包了,接下来就是下载包,然后将包上传到操作系统上,至于怎么上传,有xshell的可以直接拖拽或者使用xftp进行上传。
如果都不能上传,这里推荐一种方法,前提是两者网络互通,可以直接连接:在下载的内核路径上使用python启动一个server服务,然后服务器使用wget进行下载
文件路径下使用python启动一个服务
python -m http.server
浏览器打开,右键复制地址
服务器使用wget 下载
[root@localhost opt]# wget http://192.168.195.1:8000/kernel-3.10.0-123.el7.x86_64.rpm
--2024-02-02 22:03:02-- http://192.168.195.1:8000/kernel-3.10.0-123.el7.x86_64.rpm
Connecting to 192.168.195.1:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 30267120 (29M) [application/octet-stream]
Saving to: ‘kernel-3.10.0-123.el7.x86_64.rpm’
100%[=======================================================================================================>] 30,267,120 191MB/s in 0.2s
2024-02-02 22:03:02 (191 MB/s) - ‘kernel-3.10.0-123.el7.x86_64.rpm’ saved [30267120/30267120]
3.3 内核安装
直接安装
rpm -ivh [your_rpm_name.rpm]
如果上边命令报错,可以换成此命令
yum install -y [your_rpm_name.rpm]
1. 报错解决
有可能在安装过程报错的问题汇总
报错1
大概是此错误
[root@localhost opt]# rpm -ivh kernel-name.rpm
warning:kernel-name.rpm : Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
error: Failed dependencies:
linux-firmware >= 999:20200124-999.4.git1eb2408c is needed by kernel-name.rpm .el7uek.x86_64
如果是第一次使用rpm,可能会出现这个错误,大概意思就是缺少依赖,安装他给的提示版本,进行依赖安装即可
yum install -y linux-firmware
安装完此依赖后再次执行安装命令
rpm -ivh [your_rpm_name.rpm]
报错2
[root@localhost opt]# rpm -ivh kernel-3.10.0-123.el7.x86_64.rpm
warning: kernel-3.10.0-123.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing... ################################# [100%]
package kernel-3.10.0-1160.el7.x86_64 (which is newer than kernel-3.10.0-123.el7.x86_64) is already installed
这是因为我们已经安装了较新的内核。但是现在却要安装过时的内核的报错。
先卸载kernel-firmware
yum -y remove kernel kernel-firmware
然后再次使用此命令进行安装
yum -y install [your_rpm_name.rpm]
2. 安装完成验证
ll /boot/
[root@localhost ~]# ll /boot/
total 178468
-rw-r--r--. 1 root root 153591 Oct 19 2020 config-3.10.0-1160.el7.x86_64
-rw-r--r--. 1 root root 122059 Jun 30 2014 config-3.10.0-123.el7.x86_64
drwx------. 3 root root 17 Jul 29 2020 efi
drwxr-xr-x. 2 root root 27 Feb 2 21:49 grub
drwx------. 5 root root 97 Feb 2 21:57 grub2
-rw-------. 1 root root 79723849 Feb 2 10:36 initramfs-0-rescue-e1a6989617b64edd93098d94b4ca65a1.img
-rw-------. 1 root root 31987003 Feb 2 10:39 initramfs-3.10.0-1160.el7.x86_64.img
-rw-------. 1 root root 13938404 Feb 2 22:00 initramfs-3.10.0-1160.el7.x86_64kdump.img
-rw-------. 1 root root 31361413 Feb 2 21:21 initramfs-3.10.0-123.el7.x86_64.img
-rw-r--r--. 1 root root 320648 Oct 19 2020 symvers-3.10.0-1160.el7.x86_64.gz
-rw-r--r--. 1 root root 228562 Jun 30 2014 symvers-3.10.0-123.el7.x86_64.gz
-rw-------. 1 root root 3616707 Oct 19 2020 System.map-3.10.0-1160.el7.x86_64
-rw-------. 1 root root 2840084 Jun 30 2014 System.map-3.10.0-123.el7.x86_64
-rwxr-xr-x. 1 root root 6769256 Feb 2 10:36 vmlinuz-0-rescue-e1a6989617b64edd93098d94b4ca65a1
-rwxr-xr-x. 1 root root 6769256 Oct 19 2020 vmlinuz-3.10.0-1160.el7.x86_64
-rwxr-xr-x. 1 root root 4902656 Jun 30 2014 vmlinuz-3.10.0-123.el7.x86_64
3. 修改默认启动项的内核
查看内核的启动顺序
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
[root@localhost opt]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux (3.10.0-123.el7.x86_64) 7 (Core)
CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-e1a6989617b64edd93098d94b4ca65a1) 7 (Core)
**V123的内核时排在第一个,由于索引是从0开始计算的,我们的V123版本的内核索引就是0,**接下来就是修改默认启动的配置文件即可;
设置启动序号
[root@localhost opt]# grub2-set-default 0
然后重启电脑
reboot now
[root@localhost ~]# uname -r
3.10.0-123.el7.x86_64
0X4 开启Kdump
如果在装系统的时候,没有做过特别的设置,这一项默认是开启的,如果没有开启,可按照此方法进行安装
4.1 安装kdump
[root@localhost ~]# yum install -y kexec-tools
4.2 修改配置文件
如果不修改配置文件是无法启动成功的,原因是分配的内存不足
[root@localhost ~]# systemctl start kdump.service
Job for kdump.service failed because the control process exited with error code. See "systemctl status kdump.service" and "journalctl -xe" for details.
[root@localhost ~]# systemctl status kdump.service
● kdump.service - Crash recovery kernel arming
Loaded: loaded (/usr/lib/systemd/system/kdump.service; disabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2024-02-02 21:52:23 EST; 6s ago
Process: 2432 ExecStart=/usr/bin/kdumpctl start (code=exited, status=1/FAILURE)
Main PID: 2432 (code=exited, status=1/FAILURE)
Feb 02 21:52:23 localhost.localdomain systemd[1]: Starting Crash recovery kernel arming...
Feb 02 21:52:23 localhost.localdomain kdumpctl[2432]: No memory reserved for crash kernel
Feb 02 21:52:23 localhost.localdomain kdumpctl[2432]: Starting kdump: [FAILED]
Feb 02 21:52:23 localhost.localdomain systemd[1]: kdump.service: main process exited, code=exited, status=1/FAILURE
Feb 02 21:52:23 localhost.localdomain systemd[1]: Failed to start Crash recovery kernel arming.
Feb 02 21:52:23 localhost.localdomain systemd[1]: Unit kdump.service entered failed state.
Feb 02 21:52:23 localhost.localdomain systemd[1]: kdump.service failed.
修改配置文件,在倒数第二行quit的后边加上 crashkernel=512M
修改前:
[root@localhost ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
修改后:
[root@localhost ~]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet crashkernel=512M"
GRUB_DISABLE_RECOVERY="true"
刷新配置文件
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-e1a6989617b64edd93098d94b4ca65a1
Found initrd image: /boot/initramfs-0-rescue-e1a6989617b64edd93098d94b4ca65a1.img
done
最后重启即可
reboot now
进来之后可能还是无法启动,手动启动即可
[root@localhost ~]# systemctl start kdump.service