1.基于RedHat 8.2源码编译升级Kernel 5.8.1
1.1 背景
只是单纯为了验证工作中遇到的一个bug…才诞生了此文
1.2 先从如下网址下载内核源码包,我这里下载的是"linux-5.8.1.tar.gz",大家可根据自己需求自行下载
https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/(我是从这个网站下载的)
https://www.kernel.org/(官网)
将"linux-5.8.1.tar.gz"拷贝至系统(RedHat8.2(4.18.0-193.el8.x86_64))本地并解压
#tar -zxvf linux-5.8.1.tar.gz
1.3 进入解压文件夹/…/linux-5.8.1,准备文本配置文件
#cp /boot/config-$(uname -r) ./.config
1.4 选择你需要的内核模块,配置内核选项
#make menuconfig
(1)当执行make menuconfig后发现提示缺"ncurses-devel or libncurses-dev",我们需要安装ncurses-devel package
(2)安装ncurses-devel package
#rpm -ivh ncurses-devel-6.1-5.20180224.el8.x86_64.rpm --nodeps
(3)安装ncurses-devel后便可以执行make menuconfig了,会看到关于.config的配置界面,如果没有特殊需求,选择"Save"保存后,点击"Exit"退出当前配置界面即可
(4)配置结束可以看到打印出"End of the configuration"
!!!!!!!!!!!!!!!!!!!!
----高能预警:前方踩雷入坑高危区,慎入----
!!!!!!!!!!!!!!!!!!!!
1.5 优化多核、多线程的编译过程
(1)当执行#make -j 4后提示"please install libelf-dev, libelf-devel or elfutils-libelf-devel"
那我们就按照报错提示安装"elfutils-libelf-devel"吧
但我们安装"gcc-toolset-9-elfutils-libelf-devel-0.176-5.el8.x86_64.rpm"和"gcc-toolset-9-elfutils-libelf-0.176-5.el8.x86_64.rpm"后再次执行#make -j 4发现还是提示"please install libelf-dev, libelf-devel or elfutils-libelf-devel",咨询大神才明白安装错了rpm package,正确的package应该是"elfutils-libelf-devel-0.180-1.el8.x86_64.rpm"
http://mirror.centos.org/centos/8/BaseOS/x86_64/os/Packages/
(2)当安装"elfutils-libelf-devel-0.180-1.el8.x86_64.rpm"后再执行#make -j 4后发现不会再提示"please install libelf-dev, libelf-devel or elfutils-libelf-devel",但问题又来了,提示"fatal error: openssl/opensslv.h: No such file or directory"
于是我一口气安装了好几个与openssl相关的rpm package
但是结果却不尽人意,执行#make -j 4后还是提示"fatal error: openssl/opensslv.h: No such file or directory"
咨询大神,发现又装错了rpm package,好吧,那按照大神说的,安装"libssl-devel-1.1.1i-alt2.x86_64.rpm"吧
果不其然,竟然成功了,我是开森的,安装"libssl-devel-1.1.1i-alt2.x86_64.rpm"后竟然不会提示"fatal error: openssl/opensslv.h: No such file or directory"了
(3)若在执行#make -j 4的过程中提示"warning: objtool: mce_panic()+0x113: unreachable instruction",可忽略
(4)以上执行#make -j 4的步骤都是在百度查到的,没有关注-j后的value,经大神指点,-j后最好加上机器的Core(有翻阅资料发现:默认的make不加-j参数效率比较低,加上-j参数,-j4和-j8性能差距不大,-j16性能就比较差了),如下是我的测试环境CPU的核心数
#lscpu
(5)所以接下来我们都改成j56吧,执行#make -j56 modules,提示"No rule to make target ‘certs/rhel.pem’, needed by ‘certs/x509_certificate_list’. Stop"
此时需要在Kernel文件夹"linux-5.8.1"中,找到"./config"文件,禁掉"certs/rhel.pem":
将CONFIG_SYSTEM_TRUSTED_KEYS=“certs/rhel.pem”,
改成CONFIG_SYSTEM_TRUSTED_KEYS=""
(6)禁掉"certs/rhel.pem"后再次执行#make modules,哦多壳,又来…提示"Try to disable CONFIG_DEBUG_INFO_BTF"
我们在Kernel文件夹"linux-5.8.1"中,再次找到"./config"文件,禁掉"CONFIG_DEBUG_INFO_BTF":
将CONFIG_DEBUG_INFO_BTF=y
改成#CONFIG_DEBUG_INFO_BTF=y
修改命令:
#perl -p -i -e “s/CONFIG_DEBUG_INFO_BTF=y/#CONFIG_DEBUG_INFO_BTF=y/g” .config
(7)至于为什么要安装"dwarves-1.15-4.el8.x86_64.rpm",我也不是很懂,这张图既然被我留存下来了,说明肯定是在编译过程中有出现关于"dwarves"的报错了,那我们也安装下吧
dwarves:调试信息,一种无需解析就可以理解源码的方式
#rpm -ivh dwarves-1.15-4.el8.x86_64.rpm --nodeps
由于前面执行了#make -j 4,#make -j56 modules,因此需要#make clean下,重新编译模块
(8)单独编译模块,驱动被配置成M的都是Modules,Modules不会被编译进内核Image,需要单独安装到rootfs,模块编译过程大概需要1小时,由于编译大概有1W行左右,自动清屏了,所以在下图中看不到最开始编译的部分
#make -j56 modules
将编译好的模块拷贝到系统目录下(一般是/lib/modules/),也可自己指定ko安装路径
#make ARCH=arm64 modules_install INSTALL_MOD_PATH=yourpath
如:#make ARCH=arm64 modules_install INSTALL_MOD_PATH="modules_install_path"
在交叉编译的情况下,需要将ko模块安装到rootfs
1.6 系统模块安装开始
#make -j56 modules_install
(1)安装arch/block/crypto系列
(2)安装drivers系列
(3)安装fs系列
(4)安装kernel/lib/mm/net系列
(5)安装sound系列
(6)安装virt系列
至此,#make -j56 modules_install 结束
执行#ll /usr/lib/modules可看到已成功安装Kernel 5.8.1的Modules
1.7 安装内核相关文件,如果执行make install后发现提示"Missing file: arch/x86/boot/bzImage",则需要安装bzImage为/boot/vmlinuz-VERSION-RELEASE
#make -j56 bzImage
1.8 安装内核二进制映像, 生成并安装boot初始化文件,系统映像文件
#make install
生成bzImage后发现/boot目录依旧没有生成关于Kernel 5.8.1的相关文件(initramfs,System.map,vmlinuz等),所以我们还需要#make install,这样,就能在/boot目录下看到生成的关于Kernel 5.8.1的相关文件了
1.9 最后,重启系统(万物皆可重启)
#reboot
终于…看到我最最最最最最最最最期待的一张图片了,开心~~
在BootLoader界面可以看到已升级的Kernel 5.8.1
进入系统,查看当前系统内核版本为5.8.1. 至此,成功升级Kernel 5.8.1,Over~~~
#uname -r
或#uname -a
1.10 最后简单总结下对于"linux-xxx.tar.gz"这种内核源码包的配置编译升级过程
(1)鄙人编译的实际顺序是:
#tar -zxvf linux-xxx.tar.gz
#cp /boot/config-$(uname -r) ./.config
#make menuconfig
#make -j56 modules
#make -j56 modules_install
#make -j56 bzImage
#make -j56 install
#reboot
(2)按照大神的意思编译顺序(以后有时间再试试这种顺序吧)应该是:
#tar -zxvf linux-xxx.tar.gz
#cp /boot/config-$(uname -r) ./.config
#make menuconfig
#make -j56 bzImage
#make -j56 modules
#make -j56 modules_install
#make -j56 install
#reboot
2.基于CentOS 7u6 升级rpm文件的Kernel 5.4.87-19.0004
2.1 背景
国内各大云厂商不断开源自己定制优化的OS,近日,腾讯云宣布开源其云服务器操作系统TencentOS内核(TencentOS Server Kernel,又称 Tencent Linux,简称 Tlinux),接下来让兰兰酱简单介绍下这种Tlinux Kernel升级方式吧
2.2 解压"Tlinux4-0004.zip"压缩包
#unzip Tlinux4-0004.zip
2.3 修改系统时间为当前北京时间
#date -s "2021-02-18 12:26:00"
2.4 安装Tlinux下的rpm package,我们发现安装失败
#rpm -Uvh *
2.5 我们加俩参数解除依赖性并强制安装下吧
#rpm -Uvh * --nodeps --force
2.6 然而安装后,发现只能安装5个rpm package,有个rpm package始终安装不上:perf-5.4.87-19.0004.tl2.x86_64.rpm
#rpm -qa | grep 5.4.87
2.7 看到/usr/lib/modules目录已成功安装Kernel 5.4.87-19.0004的相关Modules
#ll /usr/lib/modules
2.8 看到/boot目录已生成关于Kernel 5.4.87-19.0004的相关文件(initramfs,symvers,System.map,vmlinuz,vmlinux等)
#ll /boot
2.9 重新生成GRUB文件(如果想保留之前的Kernel,此步骤可以省略,因为发现当执行"grub2-mkconfig…"命令后破坏了我之前的Kernel 3.10.0-957,欲哭无泪哈哈哈哈哈哈)
#grub2-mkconfig –o /boot/efi/EFI/redhat/grub.cfg
2.10 重启
#reboot
2.11 见证奇迹的BootLoader界面
2.12 进入系统查看内核也是5.4.87-19.0004,说明升级成功
#uname -a
#uname -r
2.13 可是还有一个遗留的rpm package升级失败,有尝试过安装本地yum源也安装失败,为什么呢,各种查资料请教大神都无解
#yum install perf-5.4.87-19.0004.tl2.x86_64.rpm
2.14 后来请教腾讯的大神,需要加上"–noscripts"参数才能安装成功
#rpm -ivh perf-5.4.87-19.0004.tl2.x86_64.rpm --noscripts --nodeps --force
2.15 "–noscripts"参数番外篇
(1)解决方法为加–noscripts标记来删除RPM
–noscripts 相当于 --nopre --nopost --nopreun --nopostun
(2)卸载命令为:
#rpm -e --noscripts wine-20050310-1fc1winehq
(3)若要查看与RPM关联的scripts,使用–script查询RPM包
#rpm -q --scripts package
(4)卸载时,若系统里有同一程序的多个安装版本要一起删除,可使用–allmatches标记,如
#rpm -e --noscripts --allmatches wine
2.16 总结如下:
(1)升级Kernel
#rpm –Uvh kernel-XXX.rpm
(2)重新生成GRUB文件
For legacy mode:
#grub2-mkconfig –o /boot/grub2/grub.cfg
For UEFI mode:
#grub2-mkconfig –o /boot/efi/EFI/redhat/grub.cfg
(3)重启系统
#reboot
3.对于标准RHEL OS,参考如下链接升级OSV提供的kernel 版本
https://eos.labs…com/RHEL_update.htm
User Guide of RedHat Satellite Server
(1)Supported OS list
RHEL 7.6 and later version
RHEL 8.0 and later version
(2)Preparation
1)Connect the lab lan
2)Confirm your machine is the correct date,modify the date
date –s "2020-1-3 12:00:00"
3)Can not use the default hostname “localhost”,modify the temporary hostname
#hostname XXX
(3)Register the satellite server
#rpm -Uvh http://sate.labs…com/pub/katello-ca-consumer-latest.noarch.rpm
#subscription-manager register --org=“Default_Organization” --activationkey="base"
#yum update/install XXX
(4)Unregister,Please unregister it after the installation/update
#subscription-manager unregister
#subscription-manager clean
(5)Note:The default setting is not enable the whole repos,if you need the additional repos,you can enable it manually
1)Get the availiable repos
#subscription-manager repos --list
2)Enable the request repos
#subscription-manager repos --enable [Repo ID]
4.关于卸载内核,等有时间再尝试并完善这篇文章吧
(1)删除/usr/lib/modules/目录下不需要的内核库文件
(2)删除/usr/src/linux/目录下不需要的内核源码
(3)删除/boot目录下启动的内核和内核映像文件
(4)更改/boot/grub2的配置文件,删除不需要的内核启动列表
之所以能够成功,是因为有三位大神两天的鼎力相助,太感谢了. 嘿嘿,我一个小白,老是问他们问题,估计被我烦死了,他们工作也很忙的,当然也谢谢自己,百度各种查资料.
兰兰酱需要学习的还有很多,很多…
未完待续…