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包:
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