有需求需要升级内核到指定版本,在网上搜索n多资源都只是升级到了当时的稳定版本ml,有时效性,特记录完整操作流程,希望能帮助到大家.
第一季 安装内核
1、内核版本:
关于内核版本的定义:
版本性质:主分支ml(mainline),稳定版(stable),长期维护版lt(longterm)
版本命名格式为 “A.B.C”:
A是内核版本号:只有在代码和内核的概念有重大改变的时候才会改变.
B是内核主版本号:根据传统的奇-偶系统版本编号来分配:奇数为开发版,偶数为稳定版.
C是内核次版本号:在内核增加安全补丁、修复bug、实现新的特性或者驱动时都会改变.
目标版本:
[root@k3s205 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@k3s205 ~]# uname -r
5.12.7-1.el7.elrepo.x86_64
当前版本:
[root@k3s206 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@k3s206 ~]# uname -r
3.10.0-1160.el7.x86_64
2、备份好数据防止服务器爆炸
3、配置ali源:
yum install wget -y
yum install perl -y
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
3、配置elrepo源:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm
4、查看可用的版本内核:
[root@k3s206 ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* elrepo-kernel: mirrors.tuna.tsinghua.edu.cn
可安装的软件包
kernel-lt.x86_64 5.4.124-1.el7.elrepo elrepo-kernel
kernel-lt-devel.x86_64 5.4.124-1.el7.elrepo elrepo-kernel
kernel-lt-doc.noarch 5.4.124-1.el7.elrepo elrepo-kernel
kernel-lt-headers.x86_64 5.4.124-1.el7.elrepo elrepo-kernel
kernel-lt-tools.x86_64 5.4.124-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs.x86_64 5.4.124-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs-devel.x86_64 5.4.124-1.el7.elrepo elrepo-kernel
kernel-ml-devel.x86_64 5.12.9-1.el7.elrepo elrepo-kernel
kernel-ml-doc.noarch 5.12.9-1.el7.elrepo elrepo-kernel
kernel-ml-headers.x86_64 5.12.9-1.el7.elrepo elrepo-kernel
kernel-ml-tools.x86_64 5.12.9-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs.x86_64 5.12.9-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs-devel.x86_64 5.12.9-1.el7.elrepo elrepo-kernel
perf.x86_64 5.12.9-1.el7.elrepo elrepo-kernel
python-perf.x86_64 5.12.9-1.el7.elrepo elrepo-kernel
突然懵逼,不妙...
https://elrepo.org/linux/kernel/el7/x86_64/RPMS/
官网只显示最近两个版本8和9,就是没有目标5.12.7,good!
http://rpm.pbone.net/
继续找...
https://www.kernel.org/
...
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/refs/tags?h=v5.12.9
终于发现了所有版本,源码,泪目...
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/snapshot/linux-5.12.7.tar.gz
PS:当然你们要是想安装最新版本的话执行下面命令
yum --enablerepo=elrepo-kernel install kernel-ml
#离线下载可以下载好rpm包安装即可
rpm -ivh kernel-ml-5.12.8-1.el7.elrepo.x86_64.rpm
congratulations!安装最新版做飞机直接跳到第五季.
第二季 源码编译
1、磨拳:
因为linux内核放置在boot分区,先确保boot剩余空间足够
[root@k3s206 ~]# df -h /boot
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb2 297M 171M 127M 58% /boot
2、编译
源码下载网址很多!
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.12.7.tar.xz
tar xvJf linux-5.12.7.tar.xz -C /usr/src/
cd /usr/src/linux-5.12.7
#基于文本菜单的配置界面,用这个命令更多是查看漏掉的依赖
make menuconfig
/bin/sh: gcc: 未找到命令
yum install -y gcc
make menuconfig
Unable to find the ncurses package.
yum install ncurses-devel.x86_64 -y
make menuconfig
/bin/sh: flex: command not found
yum install flex -y
/bin/sh: bison: 未找到命令
yum install bison -y
make menuconfig
fatal error: openssl/opensslv.h: No such file or directory:使用sudo not-get install libssl-dev解决。
include/config/auto.conf: No such file or directory:使用make oldconfig解决。
make oldconfig
Compiler is too old.
#必须要GCC version 4.9.0以上的版本才可以
不想说话,请看第三季!
第三季 更新gcc
1、安装基本工具
yum install -y bzip2 gcc gcc-c++ make
wget https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.xz
tar xvJf gcc-10.2.0.tar.xz -C /usr/src/
cd /usr/src/gcc-10.2.0
./contrib/download_prerequisites
mkdir /usr/src/gcc-10.2.0/gcc-build-10.2.0
cd /usr/src/gcc-10.2.0/gcc-build-10.2.0
../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j4
注意:根据及其性能,性能差的节点可能会需要一个小时或者更长
我的跑了近两个小时---微笑,以后再编译安装我就是dog.
make install
2、替换旧版本
which gcc
/usr/local/bin/gcc
/usr/local/bin/gcc -v
gcc version 10.2.0 (GCC)
gcc -v
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
#重新登录即可
[root@db1 ~]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (GCC)
#如果想保留原来旧版本
# cd /usr/bin
# ln -s ${destdir}/bin/gcc gcc102
# ln -s ${destdir}/bin/g++ g++102
# ln -s ${destdir}/bin/gcj gcj102
这样,就可以分别使用gcc102、g++102、gcj102来调用GCC 10.2.0的gcc、g++、gcj完成对C、C++、JAVA程序的编译了。同时,仍然能够使用旧版本的GCC编译器中的gcc、g++等命令。
第四季 继续编译内核
1、编译
cd /usr/src/linux-5.12.7
make menuconfig
OK!出现图形界面,没有遗漏依赖!
yum install elfutils-libelf-devel -y
make -j4
openssl/opensslv.h: No such file or directory
yum install openssl-devel -y
make -j4
make modules_install
make install
至此内核终于升级完毕!
第五季 应用内核
1、查看系统上的所有的内核
[root@k3s206 5.12.8]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.12.7-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-1ac2c5ff63894534b3eda60cfa75eeea) 7 (Core)
2、修改默认启动项
默认启动项由/etc/default/grub中的GRUB_DEFAULT控制。
如果GRUB_DEFAULT=saved,则该参数将存储在/boot/grub2/grubenv中。
可使用grub2-editenv list查看:
[root@localhost ~]# grub2-editenv list
saved_entry=CentOS Linux (3.10.0-862.el7.x86_64) 7 (Core)
原有内核建议不删除,centos也支持多内核,防止服务器爆炸
grub2-set-default 0
# 设置新内核为grub2的默认版本
#grub2-set-default 'CentOS Linux (5.12.7-1.el7.elrepo.x86_64) 7 (Core)'
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
#有时候会有重启网卡丢失情况出现
查看使用的网卡驱动: # lspci -v
重新加载下r8169驱动即可解决。
1. #rmmod r8169
2. #modprobe r8169
3. #systemctl restart network
注意:yum update会升级内核
如果不想升级内核及系统版本,则在执行 yum update之前在 /etc/yum.conf 的 [main] 后面添加以下配置
exclude=kernel*
exclude=centos-release*
#内核删除---谨慎操作
rpm -qa | grep kernel
yum remove kernel-ml-5.12.7-1.el7.elrepo.x86_64
#方法2、yum remove 删除旧内核的 RPM 包
$ yum remove kernel-3.10.0-514.el7.x86_64 \
kernel-tools-libs-3.10.0-862.11.6.el7.x86_64 \
kernel-tools-3.10.0-862.11.6.el7.x86_64 \
kernel-3.10.0-862.11.6.el7.x86_64