CentOS7.6升级内核到5.11及build RPM包

2023-05-16

目录

源码编译方式升级内核

安装依赖包

升级GCC

编译安装kernel5.11

构建RPM包

安装RPM包


源码编译方式升级内核

在编译高版本内核之前,构建编译环境以及依赖包安装是肯定的;但是,CentOS7的GCC版本过低v4.8.5)会导致编译失败。报错:

cc scripts/mod/empty.o cc1: error: -Werror=date-time: no option -Wdate-time    

所以,首先要升级GCC到9.4版本。另外,内核编译和GCC编译都很慢,差不多要2小时以上所以要耐心等待。

注意:CentOS8的GCC是8.5版本貌似没问题(未验证)

安装依赖包

yum -y groupinstall "development tools"
yum -y install ncurses-devel openssl-devel elfutils-libelf-devel bc hmaccalc zlib-devel binutils-devel

升级GCC

cp /usr/bin/gcc /usr/bin/gcc.4.8.5
wget http://mirrors.ustc.edu.cn/gnu/gcc/gcc-9.4.0/gcc-9.4.0.tar.gz
tar zxvf gcc-9.4.0.tar.gz -C /opt/
cd /opt/gcc-9.4.0/
./contrib/download_prerequisites
mkdir build
cd build
../configure -prefix=/usr --enable-checking=release --enable-languages=c,c++ --disable-multilib
make -j4
sudo make install

编译安装kernel5.11

# 解压源码包
tar zxvf linux-5.11.tar.gz -C /usr/src/kernels/

# 从 /boot 目录将现有版本的内核编译config配置文件拷过来到放到新的内核源码解压目录内并重命名为.config的隐藏文件
cp -v /boot/config-$(uname -r) /usr/src/kernels/linux-5.11/.config

# 开启文本界面的编译选项菜单窗口,可以对内核加载的模块编译选项进行调整,如修改编译后的内核名称、新添加之前系统缺少的模块等。如果不确定要自定义(启用或禁用哪些模块,那么就用我们上一步cp的.config文件即可),不要再执行本步骤,否则会覆盖旧.config文件。
cd /usr/src/kernels/linux-5.11/
make menuconfig 

# 根据机器CPU核心数,如果不超过4核, -j 后面接cpu核心数量;超过4核,建议使用-j 4,如果服务器上没有负载,可以指定更高,可以加快编译速度。
sh -c 'yes "" | make -j 4'
/usr/src/kernels/linux-5.11/Makefile:643: include/config/auto.conf: No such file or directory
/usr/src/kernels/linux-5.11/Makefile:687: include/config/auto.conf.cmd: No such file or directory
……

# 编译完后,安装内核模块(一般编译的时候不出错,后面就不会出错的)
make modules_install 

# 安装到系统
make install
sh ./arch/x86/boot/install.sh 5.11.0 arch/x86/boot/bzImage \
        System.map "/boot"

# 此时查看grub配置文件,新内核已被写入
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.11.0) 7 (Core)
1 : CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-44bad4545ae24925b4f62be647df9bac) 7 (Core)

# 查看默认启动内核
grub2-editenv list
saved_entry=CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)

# 设置默认启动内核
grub2-set-default 0 

# 重启
reboot

构建RPM包

通过上面的步骤我们已经将kernel升级到了5.11版本。如果我们想在多台机器上升级kernel,那么构建成RPM包,无疑是一种高效的方式。

build rpm包,通过make rpm-pkg就可以,我还傻傻地自己编辑spec文件,然后各种填坑。

make rpm-pkg命令的拆解过程如下:

  • make clean 
  • 生成spec文件:sh ./scripts/package/mkspec >./kernel.spec
  • 压缩当前目录为名为kernel(源码包名为linux)的tar.gz包:TAR     kernel-5.11.0.tar.gz
  • 执行rpmbuild:rpmbuild  --target x86_64 -ta kernel-5.11.0.tar.gz --define='_smp_mflags %{nil}'
  • 下面的过程就跟我们手动执行rpmbuild一样了。

强烈建议您不要以 root 身份构建包。

## 使用rpmdev-setuptree命令创建编译目录
$ sudo yum -y install rpmdevtools
$ rpmdev-setuptree

## 编译环境以及依赖包安装同上

# 解压源码包
$ tar zxvf linux-5.11.tar.gz -C /usr/src/kernels/
$ cd linux-5.11
$ cp -v /boot/config-3.10.0-957.el7.x86_64 .config

## 生成rpm(整个过程需要至少2个小时,如果机器配置好可能会快点。。)
$ sh -c 'yes "" | make rpm-pkg -j 4'
……
make clean
sh ./scripts/package/mkspec >./kernel.spec
  TAR     kernel-5.11.0.tar.gz
rpmbuild  --target x86_64 -ta kernel-5.11.0.tar.gz --define='_smp_mflags %{nil}'
Building target platforms: x86_64
Building for target x86_64
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.AoA9IV
+ umask 022
+ cd /home/xiao/rpmbuild/BUILD
+ rm -rf kernel-5.11.0
+ /usr/bin/gzip -dc /home/xiao/linux-5.11/kernel-5.11.0.tar.gz
+ /usr/bin/tar -xf -
……
+ cp System.map /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/boot/System.map-5.11.0
+ cp .config /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/boot/config-5.11.0
+ bzip2 -9 --keep vmlinux
+ mv vmlinux.bz2 /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/boot/vmlinux-5.11.0.bz2
+ rm -f /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/lib/modules/5.11.0/build
+ rm -f /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/lib/modules/5.11.0/source
+ mkdir -p /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/usr/src/kernels/5.11.0
+ tar cf - --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git '--exclude=*vmlinux*' '--exclude=*.mod' '--exclude=*.o' '--exclude=*.ko' '--exclude=*.cmd' --exclude=Documentation --exclude=.config.old --exclude=.missing-syscalls.d '--exclude=*.s' .
+ tar xf - -C /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/usr/src/kernels/5.11.0
+ cd /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/lib/modules/5.11.0
+ ln -sf /usr/src/kernels/5.11.0 build
+ ln -sf /usr/src/kernels/5.11.0 source
+ /usr/lib/rpm/brp-compress
Processing files: kernel-5.11.0-1.x86_64
Provides: kernel = 5.11.0-1 kernel(x86-64) = 5.11.0-1 kernel-5.11.0
Requires(interp): /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires(postun): /bin/sh
Processing files: kernel-headers-5.11.0-1.x86_64
Provides: kernel-headers = 5.11.0 kernel-headers = 5.11.0-1 kernel-headers(x86-64) = 5.11.0-1
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Obsoletes: kernel-headers
Processing files: kernel-devel-5.11.0-1.x86_64
Provides: kernel-devel = 5.11.0-1 kernel-devel(x86-64) = 5.11.0-1
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64
Wrote: /home/xiao/rpmbuild/SRPMS/kernel-5.11.0-1.src.rpm
Wrote: /home/xiao/rpmbuild/RPMS/x86_64/kernel-5.11.0-1.x86_64.rpm
Wrote: /home/xiao/rpmbuild/RPMS/x86_64/kernel-headers-5.11.0-1.x86_64.rpm
Wrote: /home/xiao/rpmbuild/RPMS/x86_64/kernel-devel-5.11.0-1.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.2NffvD
+ umask 022
+ cd /home/xiao/rpmbuild/BUILD
+ cd kernel-5.11.0
+ rm -rf /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64
+ exit 0

# 查看进程调用情况,可以清晰看到进程调用情况。
# ps -ef |grep rpm
xiao      5893  4954  0 09:54 pts/0    00:00:00 sh -c yes "" | make rpm-pkg -j 4
xiao      5895  5893  0 09:54 pts/0    00:00:00 make rpm-pkg -j 4
xiao      5896  5895  0 09:54 pts/0    00:00:00 make -C /home/xiao/linux-5.11 -f /home/xiao/linux-5.11/Makefile rpm-pkg
xiao      6235  5896  0 09:54 pts/0    00:00:00 make -f ./scripts/Makefile.package rpm-pkg
xiao      9379  6235 10 09:58 pts/0    00:09:55 rpmbuild --target x86_64 -ta kernel-5.11.0.tar.gz --define=_smp_mflags %{nil}

安装RPM包

# 安装RPM
ll new-kernel/
total 1047616
-rw-r--r--. 1 root root 908952964 Aug 12 12:05 kernel-5.11.0-1.x86_64.rpm
-rw-r--r--. 1 root root 162391844 Aug 12 12:05 kernel-devel-5.11.0-1.x86_64.rpm
-rw-r--r--. 1 root root   1406536 Aug 12 12:05 kernel-headers-5.11.0-1.x86_64.rpm
# kernel-devel可以不装
yum -y install new-kernel/*

# 查启动内核列表
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.11.0) 7 (Core)
1 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-ddb7104fb2e4432fb3cc8c57d192738d) 7 (Core)

# 查看默认启动内核
grub2-editenv list
saved_entry=CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)

# 设置默认启动内核
grub2-set-default 0 
[root@update2kernel ~]# grub2-editenv list  
saved_entry=0

# 重启
reboot
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CentOS7.6升级内核到5.11及build RPM包 的相关文章

随机推荐