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


    目录

    源码编译方式升级内核

    安装依赖包

    升级GCC

    编译安装kernel5.11

    构建RPM包

    安装RPM包


    源码编译方式升级内核

    在编译高版本内核之前,构建编译环境以及依赖包安装是肯定的;但是,CentOS7GCC版本过低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版本貌似没问题(未验证)

    安装依赖包

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

    升级GCC

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

    编译安装kernel5.11

    1. # 解压源码包
    2. tar zxvf linux-5.11.tar.gz -C /usr/src/kernels/
    3. # 从 /boot 目录将现有版本的内核编译config配置文件拷过来到放到新的内核源码解压目录内并重命名为.config的隐藏文件
    4. cp -v /boot/config-$(uname -r) /usr/src/kernels/linux-5.11/.config
    5. # 开启文本界面的编译选项菜单窗口,可以对内核加载的模块编译选项进行调整,如修改编译后的内核名称、新添加之前系统缺少的模块等。如果不确定要自定义(启用或禁用哪些模块,那么就用我们上一步cp的.config文件即可),不要再执行本步骤,否则会覆盖旧.config文件。
    6. cd /usr/src/kernels/linux-5.11/
    7. make menuconfig
    8. # 根据机器CPU核心数,如果不超过4核, -j 后面接cpu核心数量;超过4核,建议使用-j 4,如果服务器上没有负载,可以指定更高,可以加快编译速度。
    9. sh -c 'yes "" | make -j 4'
    10. /usr/src/kernels/linux-5.11/Makefile:643: include/config/auto.conf: No such file or directory
    11. /usr/src/kernels/linux-5.11/Makefile:687: include/config/auto.conf.cmd: No such file or directory
    12. ……
    13. # 编译完后,安装内核模块(一般编译的时候不出错,后面就不会出错的)
    14. make modules_install
    15. # 安装到系统
    16. make install
    17. sh ./arch/x86/boot/install.sh 5.11.0 arch/x86/boot/bzImage \
    18. System.map "/boot"
    19. # 此时查看grub配置文件,新内核已被写入
    20. awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
    21. 0 : CentOS Linux (5.11.0) 7 (Core)
    22. 1 : CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core)
    23. 2 : CentOS Linux (0-rescue-44bad4545ae24925b4f62be647df9bac) 7 (Core)
    24. # 查看默认启动内核
    25. grub2-editenv list
    26. saved_entry=CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
    27. # 设置默认启动内核
    28. grub2-set-default 0
    29. # 重启
    30. 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 身份构建包。

    1. ## 使用rpmdev-setuptree命令创建编译目录
    2. $ sudo yum -y install rpmdevtools
    3. $ rpmdev-setuptree
    4. ## 编译环境以及依赖包安装同上
    5. # 解压源码包
    6. $ tar zxvf linux-5.11.tar.gz -C /usr/src/kernels/
    7. $ cd linux-5.11
    8. $ cp -v /boot/config-3.10.0-957.el7.x86_64 .config
    9. ## 生成rpm(整个过程需要至少2个小时,如果机器配置好可能会快点。。)
    10. $ sh -c 'yes "" | make rpm-pkg -j 4'
    11. ……
    12. make clean
    13. sh ./scripts/package/mkspec >./kernel.spec
    14. TAR kernel-5.11.0.tar.gz
    15. rpmbuild --target x86_64 -ta kernel-5.11.0.tar.gz --define='_smp_mflags %{nil}'
    16. Building target platforms: x86_64
    17. Building for target x86_64
    18. Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.AoA9IV
    19. + umask 022
    20. + cd /home/xiao/rpmbuild/BUILD
    21. + rm -rf kernel-5.11.0
    22. + /usr/bin/gzip -dc /home/xiao/linux-5.11/kernel-5.11.0.tar.gz
    23. + /usr/bin/tar -xf -
    24. ……
    25. + cp System.map /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/boot/System.map-5.11.0
    26. + cp .config /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/boot/config-5.11.0
    27. + bzip2 -9 --keep vmlinux
    28. + mv vmlinux.bz2 /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/boot/vmlinux-5.11.0.bz2
    29. + rm -f /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/lib/modules/5.11.0/build
    30. + rm -f /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/lib/modules/5.11.0/source
    31. + mkdir -p /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/usr/src/kernels/5.11.0
    32. + 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' .
    33. + tar xf - -C /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/usr/src/kernels/5.11.0
    34. + cd /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64/lib/modules/5.11.0
    35. + ln -sf /usr/src/kernels/5.11.0 build
    36. + ln -sf /usr/src/kernels/5.11.0 source
    37. + /usr/lib/rpm/brp-compress
    38. Processing files: kernel-5.11.0-1.x86_64
    39. Provides: kernel = 5.11.0-1 kernel(x86-64) = 5.11.0-1 kernel-5.11.0
    40. Requires(interp): /bin/sh /bin/sh /bin/sh
    41. Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
    42. Requires(post): /bin/sh
    43. Requires(preun): /bin/sh
    44. Requires(postun): /bin/sh
    45. Processing files: kernel-headers-5.11.0-1.x86_64
    46. Provides: kernel-headers = 5.11.0 kernel-headers = 5.11.0-1 kernel-headers(x86-64) = 5.11.0-1
    47. Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
    48. Obsoletes: kernel-headers
    49. Processing files: kernel-devel-5.11.0-1.x86_64
    50. Provides: kernel-devel = 5.11.0-1 kernel-devel(x86-64) = 5.11.0-1
    51. Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
    52. Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64
    53. Wrote: /home/xiao/rpmbuild/SRPMS/kernel-5.11.0-1.src.rpm
    54. Wrote: /home/xiao/rpmbuild/RPMS/x86_64/kernel-5.11.0-1.x86_64.rpm
    55. Wrote: /home/xiao/rpmbuild/RPMS/x86_64/kernel-headers-5.11.0-1.x86_64.rpm
    56. Wrote: /home/xiao/rpmbuild/RPMS/x86_64/kernel-devel-5.11.0-1.x86_64.rpm
    57. Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.2NffvD
    58. + umask 022
    59. + cd /home/xiao/rpmbuild/BUILD
    60. + cd kernel-5.11.0
    61. + rm -rf /home/xiao/rpmbuild/BUILDROOT/kernel-5.11.0-1.x86_64
    62. + exit 0
    63. # 查看进程调用情况,可以清晰看到进程调用情况。
    64. # ps -ef |grep rpm
    65. xiao 5893 4954 0 09:54 pts/0 00:00:00 sh -c yes "" | make rpm-pkg -j 4
    66. xiao 5895 5893 0 09:54 pts/0 00:00:00 make rpm-pkg -j 4
    67. 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
    68. xiao 6235 5896 0 09:54 pts/0 00:00:00 make -f ./scripts/Makefile.package rpm-pkg
    69. 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包

    1. # 安装RPM
    2. ll new-kernel/
    3. total 1047616
    4. -rw-r--r--. 1 root root 908952964 Aug 12 12:05 kernel-5.11.0-1.x86_64.rpm
    5. -rw-r--r--. 1 root root 162391844 Aug 12 12:05 kernel-devel-5.11.0-1.x86_64.rpm
    6. -rw-r--r--. 1 root root 1406536 Aug 12 12:05 kernel-headers-5.11.0-1.x86_64.rpm
    7. # kernel-devel可以不装
    8. yum -y install new-kernel/*
    9. # 查启动内核列表
    10. awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
    11. 0 : CentOS Linux (5.11.0) 7 (Core)
    12. 1 : CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
    13. 2 : CentOS Linux (0-rescue-ddb7104fb2e4432fb3cc8c57d192738d) 7 (Core)
    14. # 查看默认启动内核
    15. grub2-editenv list
    16. saved_entry=CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)
    17. # 设置默认启动内核
    18. grub2-set-default 0
    19. [root@update2kernel ~]# grub2-editenv list
    20. saved_entry=0
    21. # 重启
    22. reboot
  • 相关阅读:
    MySQL8.0 MGR方式搭建集群
    进程调度算法-先来先服务、最短作业优先调度算法和高响应比优先调度算法
    Matlab进阶绘图第60期—带伪彩图的曲面图
    微服务 | Springboot整合Seata+Nacos实现分布式事务
    C和指针 第12章 使用结构和指针 12.8 编程练习
    egg.js框架的基本设置 及 使用
    Vue项目后台部分2,文件夹介绍,登录页面,路由的搭建,品牌管理页面使用element-ui动态展示
    2023-10-16 node.js-调用python-记录
    javascript设计模式单例
    将数据、代码、栈放入不同的段
  • 原文地址:https://blog.csdn.net/avatar_2009/article/details/126303420