Linux编译升级内核
#排查容器的一些问题的时候最终都指向到了linux内核,现在也只有Centos7.9在维护了,但是是3.10的内核,如果想升级内核咋办,网上很多rpm包或者第三方源的方式,我们这里还是采用官网tar包编译安装的方式。小小的记录一下。
官网公布的LTS长期支持版本的列表:https://www.kernel.org/category/releases.html
一、编译升级至4.x
第一步:去官网下载
我们这里下载4.x的最新版本:# wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.280.tar.xz
第二步:进行相关yum依赖安装
#yum -y install gcc bc gcc-c++ ncurses ncurses-devel cmake elfutils-libelf-devel openssl-devel flex bison libelf-devel
第三步:开始编译安装
#tar xf linux-4.19.280.tar.xz
#cd linux-4.19.280/
# make mrproper #去除内核的依赖关系及编译后的垃圾信息(如果第一次编译可以不需要执行)
#cp /boot/config-3.10.0-1160.el7.x86_64 ./.config #没错我们使用现有的内核配置
# sh -c 'yes ""|make oldconfig' #这样就不用老回车了
# make -j16 all #时间非常长,可以喝杯咖啡了
#make modules_install -j 16 #安装模块,但是有个问题啊,如果什么参数都不加你会发现安装的内核目录非常大可能3GB,是因为编译出来的ko文件里有很多debug信息,所以要执行make INSTALL_MOD_STRIP=1 modules_install -j 16,如果已经安装了可以进入到/lib/modules/内核目录下面执行bash -c 'find . -iname "*.ko" | xargs strip --strip-unneeded' 进行清理,这样空间就降下来了。当然你要觉得占用空间无所谓可以什么参数都不加。
#不过我看4.x和5.x是需要这样的,但是6.x内核不加这个参数编译出来的内核目录也是300MB以内的。
#make install -j 16 #安装内核相关文件
# ls -l /lib/modules/ #查看一下安装完毕后的效果
第四步: 设置默认启用新内核版本启动
# cat /boot/grub2/grub.cfg | grep menuentry #查看系统可用内核
#grub2-set-default 'CentOS Linux (4.19.280) 7 (Core)' #修改开机默认使用的内核
第五步: 重启机器使新内核生效
# reboot
# uname -r #查看当前内核版本
4.19.280
博文来自:www.51niux.com
注:至此我们操作系统的内核版本已升级完毕。但是吧有一个小坑,我们现在操作系统还是Centos7.9的,如果你一旦yum update进行全面更新的话,比如这次升级涉及到内核版本,那就尴尬了,一旦机器reboot就又变回3.x的内核版本了。所以如果你进行了yum update之后,切记执行下grub2-set-default 'CentOS Linux (4.19.280) 7 (Core)' ,将启动内核版本修改回来。
二、编译升级至5.x
#如果centos7.9升级到5.x还有点麻烦还得把gcc重新编译一次,因为gcc版本过低
# sh -c 'yes ""|make oldconfig'
*** *** Compiler is too old. *** Your GCC version: 4.8.5 *** Minimum GCC version: 5.1.0 *** scripts/Kconfig.include:44: Sorry, this compiler is not supported. make[2]: *** [oldconfig] 错误 1 make[1]: *** [oldconfig] 错误 2 make: *** [__sub-make] 错误 2
2.1 重新编译GCC
第一步下载相关软件包:
#我这边直接进入阿里云的镜像站下载了https://mirrors.aliyun.com/gnu/
# wget https://mirrors.aliyun.com/gnu/gmp/gmp-6.2.1.tar.xz
# wget https://mirrors.aliyun.com/gnu/mpfr/mpfr-4.2.0.tar.gz
# wget https://mirrors.aliyun.com/gnu/mpc/mpc-1.3.1.tar.gz
# wget https://mirrors.aliyun.com/gnu/gcc/gcc-12.2.0/gcc-12.2.0.tar.gz
#并且全部解压
# tar xf gmp-6.2.1.tar.xz
# tar xf mpfr-4.2.0.tar.gz
# tar xf mpc-1.3.1.tar.gz
# tar xf gcc-12.2.0.tar.gz
第二步开始编译:
# cd gmp-6.2.1/
# ./configure --prefix=/usr/local/gmp
# make -j 4 && make install
# cd ../mpfr-4.2.0/
# ./configure --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp
# make -j 4 && make install
# cd ../mpc-1.3.1/
# ./configure --prefix=/usr/local/mpc --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr
# make -j 4 && make install
# cd ../gcc-12.2.0/
# echo 'export LD_LIBRARY_PATH=/usr/local/mpfr/lib:$LD_LIBRARY_PATH' >>/etc/profile
# source /etc/profile
# ./configure --prefix=/usr/local/gcc/ --enable-checking=release --enable-languages=c,c++ --disable-multilib --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr --with-mpc=/usr/local/mpc
#make -j 4 && make install
第三步修改gcc路径:
# mv /usr/bin/gcc /usr/bin/gcc485
# mv /usr/bin/g++ /usr/bin/g++485
# mv /usr/bin/c++ /usr/bin/c++485
# mv /usr/bin/cc /usr/bin/cc485
# ln -s /usr/local/gcc/bin/gcc /usr/bin/
# ln -s /usr/local/gcc/bin/g++ /usr/bin/
# ln -s /usr/local/gcc/bin/c++ /usr/bin/
# ln -s /usr/local/gcc/bin/gcc /usr/bin/cc
# mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak
# ln -s /usr/local/gcc/lib64/libstdc++.so.6.0.30 /usr/lib64/
# ln -s /usr/local/gcc/lib64/libstdc++.so.6.0.30 /usr/lib64/libstdc++.so.6 #缺少这个polkit启动失败
# gcc -v #查看一下gcc版本
2.2 编译安装5.x内核
# wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.108.tar.xz #下载新内核
跟上面的4.x步骤一模一样,就不累述了
编译完后最后来个#grub2-set-default 'CentOS Linux (5.15.108) 7 (Core)' 然后reboot机器就可以了
# uname -r
5.15.108