Centos 升级linux内核版本

  • Post author:
  • Post category:linux


有两种方法可以升级Centos内核版本。分别是:1. 下载linux内核源码,编译内核源码进行安装。2:下载官方的rpm包进行安装升级。下面分别进行说明。

一、使用下载内核源码进行升级


1.1、从官网下载我们需要升级的内核文件并解压

下载内核5.11的源码并解压,源码路径

Index of /pub/linux/kernel/v5.x/

,解压:tar -zxvf linux-5.11.tar.gz

解压到磁盘空间较大的分区中,对于v5.11版本的内核编译,建议至少要有10G以上的剩余磁盘空间,否则编译到一半发现磁盘空间不够。。。


1.2、复制红帽官方的kernel编译配置文件并更改名字

进入解压后的目录,参考下列命令执行:

cp /boot/config-3.10.0-1127.19.1.el7.x86_64 .config
yum install openssl openssl-devel
make defconfig
make menuconfig  //配置自己的需要的模块,例如增加vdpa,virtio的支持。
//make  bzImage    //开始编译,一路回车
make -j4
make modules_install    //安装模块
make install            //安装内核

如果install过程中磁盘空间不够,则需要在 /lib/modules 目录中腾出空间,如果当前系统中已经安装的内核版本较多,则可以清理掉不用的内核。


卸载指令:

yum remove 3.10.0-1127.19.1.el7.x86_64

或者:

//删除多余的内核
cd /boot
rm -rf *3.10.0-123.4.4.el7*           //删除所有相关的文件
cd /lib/modules/
rm -rf 3.10.0-123.4.4.el7           //对应的文件夹
grub2-mkconfig -o /boot/grub2/grub.cfg

如果安装过程中提示/tmp路径下磁盘空间不够用,则在别的磁盘空间较大的目录新建tmp目录, 并改变tmp目录的路径,例如 使用如下命令:

export TMPDIR=/data/tmp

install安装完成后,在 /lib/modules 目录中多出了内核文件,例如:


1.3、安装内核完成,配置启动、重启验证

查看当前系统支持的内核版本:

$ cat /boot/grub2/grub.cfg |grep menuentry      //查看当前支持的内核版本

显示如下类容
if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option
menuentry 'CentOS Linux (5.11.6) 7 (Core)' --class centos ...
可以看到支持 CentOS Linux (5.11.6) 7 (Core) 内核的启动

设置系统启动内核'CentOS Linux (5.11.0) 7 (Core)':
grub2-set-default 'CentOS Linux (5.11.0) 7 (Core)'  //设置内核启动版本,用单引号' '
grub2-editenv list                            //查看启动的内核版本
//重新编译引导(非UEFI系统上),编译之后,上面设置内核启动版本才有效
grub2-mkconfig -o /boot/grub2/grub.cfg        

如果上面设置默认的启动内核不起作用,做下面的设置再测试:

//查看可以启动的内核:
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (4.14.91.el7.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-957.1.3.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-7ebbe12473084ddea5bfebf0cf63627f) 7 (Core)

//设置默认启动项
[root@host ~]# grub2-set-default 0
"0"对应上面list的编号0
最后 grub2-mkconfig -o /boot/grub2/grub.cfg 

一般新内核在grub的list最高位所以直接
grub2-set-default 0
重启 一般就可以了,现在的版本以上操作完成后centos7的内核版本

如果按照前面的操作步骤,设置完默认启动的系统无效,则检查 /etc/default/grub 文件:

1. 文件位置
cat /etc/default/grub

#属性名:进入默认启动项的等候时间
#值说明:单位:秒,默认10秒,-1表示一直等待
GRUB_TIMEOUT=10

GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"

#属性名:默认启动项(就是我要的开机默认启动系统)
#值说明:
#	数字:从0开始(按照开机选择界面的顺序对应)
#	saved:默认上次的启动项
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"

#属性名:手动添加内核启动参数
#值说明:默认为空,可以添加你需要的参数,以 “name=value” 的格式添加,多个参数用空格隔开
#例如:GRUB_CMDLINE_LINUX="name1=value1 name2=value2"
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet intel_iommu=on iommu=pt default_hugepagesz=2M hugepagesz=2M hugepages=4"

#属性名:是否创建修复模式菜单项
#值说明:true:禁用,false:使用,默认false
GRUB_DISABLE_RECOVERY="true"

2. 执行 grub2-mkconfig -o /boot/grub2/grub.cfg 
该命令作用是更新原来的/boot/grub/grub.cfg文件,但修改配置时不要修改/boot/grub/grub.cfg文件,而
是要修改/etc/default/grub文件,然后sudo update-grub


错误解决

1、升级内核后,启动过程中提示:



Entering emergency mode, Exit the shell to continue


如下图:

jornalctl 查看log:


错误原因:



failed to mount /sysroot.

(无法挂载/ sysroot。)

Dependency failed for Initrd root File System.(Initrd根文件系统的依赖关系失败。)

Dependency failed for Reload configuration from the Real Root.(从实际根目录重新加载配置的依赖性失败。)



解决方法1:


从本机拷贝 /boot下已经存在的config文件,例如:我用5.11.16的源码安装,我可以


cp /boot/config-5.11.16-1.el7.elrepo.x86_64 /home/linux-5.11.16/.config


然后重新编译安装即可。


解决方法2:

死马当活马医,输入命令:

xfs_repair -v -L /dev/dm-0


-L 选项指定强制日志清零,强制xfs_repair将日志归零,即使它包含脏数据(元数据更改)。

然后重启系统 ,重启后可以就可以正常模式了。


可参考:


编译linux内核源码(适用Fedora/RHEL/CentOS/Oracle Linux /Debian/Ubuntu/Arch Linux/Manjaro)



内核3.10编译升级到5.11


Linux之Centos8升级内核5.11.11版本


centos卸载内核_CentOS7编译内核安装与卸载


grub2的/etc/default/grub文件详解


linux 开机错误 Entering emergency mode. Exit the shell to continue.

二、使用rpm包升级

最新的rpm包:
https://elrepo.org/linux/kernel/el7/x86_64/RPMS/

Centos 使用rpm包升级内核
1.官网下载最新的rpm包
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-ml-5.15.13-1.el7.elrepo.x86_64.rpm

安装内核:rpm -ivh kernel-ml-5.15.13-1.el7.elrepo.x86_64.rpm

2.更新kernel-ml-headers
wget http://ftp.osuosl.org/pub/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-headers-5.15.13-1.el7.elrepo.x86_64.rpm
安装headers:rpm -ivh kernel-ml-headers-5.15.13-1.el7.elrepo.x86_64.rpm

3.更新kernel-ml-devel
wget http://ftp.osuosl.org/pub/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-devel-5.15.13-1.el7.elrepo.x86_64.rpm
安装devel:rpm -ivh kernel-ml-devel-5.15.13-1.el7.elrepo.x86_64.rpm
到此,内核的升级已经完成,其中 kernel-ml-headers 和 kernel-ml-devel 是开发驱动程序等的时候用到的。如果不做开发,则可以不安装着两个包。


4.升级gcc
1.安装centos-release-scl
	yum install centos-release-scl
2,安装 devtoolset
	yum install devtoolset-9
3.激活
	scl enable devtoolset-9 bash
4.把下面的脚本放入/etc/init.d目录下 并给文件加上执行权限,开机启动
	#/bin/bash
	source /opt/rh/devtoolset-9/enable
 


错误提示:

warning: kernel-ml-headers-5.11.16-1.el7.elrepo.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID baadae52: NOKEY

error: Failed dependencies:

kernel-headers < 5.11.16-1.el7.elrepo conflicts with kernel-ml-headers-5.11.16-1.el7.elrepo.x86_64


解决方案:


则需要把原来的安装的 kernel-ml-headers-* 卸载掉,再重新安装,或者加参数 –force –nodeps可以安装,例如:

sudo rpm -ivh kernel-ml-headers-5.11.16-1.el7.elrepo.x86_64.rpm --force --nodeps



版权声明:本文为weixin_40209911原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。