目录
在编译高版本内核之前,构建编译环境以及依赖包安装是肯定的;但是,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
- 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
- # 解压源码包
- 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
通过上面的步骤我们已经将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
- 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