实验环境
- Virtualbox 7.0
- CentOS 7.9
- Linux Kernel 6.5.2
实验需求
为我的 CentOS7.9 虚拟机编译安装最新内核版本
CentOS7.9 升级前的内核版本:
[root@localhost ~]# uname -r
3.10.0-1160.95.1.el7.x86_64
CentOS7.9 升级后的内核版本:
[root@localhost ~]# uname -sr
Linux 6.5.2
实验解法
1、安装编译环境
yum groupinstall "Development Tools" -y && \
yum install -y \
openssl-devel \
rpm-build \
redhat-rpm-config \
asciidoc \
hmaccalc \
perl-ExtUtils-Embed \
pesign \
xmlto \
audit-libs-devel \
binutils-devel \
elfutils-devel \
elfutils-libelf-devel \
ncurses-devel \
newt-devel \
numactl-devel \
pciutils-devel \
python-devel \
zlib-devel \
rpm-build
2、更新GCC版本
CentOS7 自带的 GCC 是 4.8.5 版本,编译内核会导致报错
以下是安装新的GCC操作:(多GCC版本共存)
yum install centos-release-scl devtoolset-8-gcc* -y
scl enable devtoolset-8 bash # 该操作允许GCC多版本共存
以下是永久替换旧的GCC操作:(只使用GCC新版本)
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++
3、下载内核源代码并解压内核源代码
从清华大学镜像源下载 Linux Kernel 6.5.2 的源代码包。
注意:一定要执行 cd linux-6.5.2
命令,因为接下的操作默认都是这该目录下操作的。
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v6.x/linux-6.5.2.tar.gz
tar -zxvf linux-6.5.2.tar.gz
cd linux-6.5.2
4、配置 config
方法一:执行以下这个命令,会进入一个配置界面,如果看不懂就保持默认配置,Tab键选定 save
然后回车,根据提示保存 .config
文件。
make menuconfig
方法二:根据现有内核参数去生成新的配置参数文件 .config
3.10.0-1160.95.1.el7.x86_64
这个文件在你的机器里可能并不相符,可以执行 ls -l /boot/
命令查看你的这个文件名称。
cp /boot/3.10.0-1160.95.1.el7.x86_64 .config
make oldconfig # 一路回车
5、编译安装内核
-j 12
参数是因为我给虚拟机CPU分配了12核心,根据自己的机器情况修改。make INSTALL_MOD_STRIP=1 modules_install > /dev/null
把内核模块的 debug 信息去掉,节约磁盘空间
make -j 12 all
make INSTALL_MOD_STRIP=1 modules_install > /dev/null && make modules_install && make install
6、设置以后默认从新的 Kernel 启动
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg && sudo grub2-set-default 0 && sudo grub2-mkconfig -o /boot/grub2/grub.cfg
7、编译成 rpm 包
编译出的 rpm 包可以在其他的 CeonOS7.9 机器上直接安装升级内核。
如果需要压缩体积,可以将 make rpm-pkg -j 12
换成 make INSTALL_MOD_STRIP=1 rpm-pkg -j 12
命令执行完成后,会在当前目录的 ~/rpmbuild/RPMS/x86_64/
下出现三个 rpm 安装包
在其他CentOS7机器上安装这三个 rpm 包,就可以更新内核了。
make rpm-pkg -j 12
make INSTALL_MOD_STRIP=1 rpm-pkg -j 12
yum localinstall kernel* -y
安装这三个 rpm 包后,还需要更新一下启动项。
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg && sudo grub2-set-default 0 && sudo grub2-mkconfig -o /boot/grub2/grub.cfg
8、删除多余内核
使用 uname -a
查看当前使用的内核
[root@localhost ~]# uname -a
Linux localhost.localdomain 6.5.2 #1 SMP PREEMPT_DYNAMIC Fri Sep 8 13:10:46 CST 2023 x86_64 x86_64 x86_64 GNU/Linux
使用 rpm -qa|grep kernel
查看通过 rpm
安装的内核
[root@localhost ~]# rpm -qa | grep kernel
kernel-tools-libs-3.10.0-1160.95.1.el7.x86_64
kernel-3.10.0-1160.95.1.el7.x86_64
kernel-tools-3.10.0-1160.95.1.el7.x86_64
kernel-debug-devel-3.10.0-1160.95.1.el7.x86_64
kernel-headers-3.10.0-1160.95.1.el7.x86_64
kernel-3.10.0-1160.el7.x86_64
使用 yum remove [多作内核]
删除多余内核,执行多次删除多余的 kernel
[root@localhost ~]# yum remove kernel-tools-libs-3.10.0-1160.95.1.el7.x86_64
Loaded plugins: fastestmirror
Resolving Dependencies
--> Running transaction check
---> Package kernel-tools-libs.x86_64 0:3.10.0-1160.95.1.el7 will be erased
--> Processing Dependency: kernel-tools-libs = 3.10.0-1160.95.1.el7 for package: kernel-tools-3.10.0-1160.95.1.el7.x86_64
--> Processing Dependency: libcpupower.so.0()(64bit) for package: kernel-tools-3.10.0-1160.95.1.el7.x86_64
--> Running transaction check
---> Package kernel-tools.x86_64 0:3.10.0-1160.95.1.el7 will be erased
--> Finished Dependency Resolution
Dependencies Resolved
========================================================================================================================
Package Arch Version Repository Size
========================================================================================================================
Removing:
kernel-tools-libs x86_64 3.10.0-1160.95.1.el7 @updates 18 k
Removing for dependencies:
kernel-tools x86_64 3.10.0-1160.95.1.el7 @updates 337 k
Transaction Summary
========================================================================================================================
Remove 1 Package (+1 Dependent package)
Installed size: 355 k
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Erasing : kernel-tools-3.10.0-1160.95.1.el7.x86_64 1/2
Erasing : kernel-tools-libs-3.10.0-1160.95.1.el7.x86_64 2/2
Verifying : kernel-tools-libs-3.10.0-1160.95.1.el7.x86_64 1/2
Verifying : kernel-tools-3.10.0-1160.95.1.el7.x86_64 2/2
Removed:
kernel-tools-libs.x86_64 0:3.10.0-1160.95.1.el7
Dependency Removed:
kernel-tools.x86_64 0:3.10.0-1160.95.1.el7
Complete!
使用 grub2-mkconfig -o /boot/grub2/grub.cfg
更新引导配置
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.5.2
Found initrd image: /boot/initramfs-6.5.2.img
Found linux image: /boot/vmlinuz-0-rescue-0197527dc1e0e34ab25e04d6402a7388
Found initrd image: /boot/initramfs-0-rescue-0197527dc1e0e34ab25e04d6402a7388.img
done