Centos7 内核编译及 RPM 包的制作

为什么要制作RPM包

通常一般Linux用户在使用过程中需要安装/更新某个软件(如telnet、ssh等)都是通过rpm包来进行的,而获取rpm包的方式大都是通过配置yum源进行自动下载安装/升级,另一种方式则是直接到官网或其它网站手动下载到本地后再执行安装/升级命令;当然,作为Linux开发人员您还可以下载该软件对应的源代码,进行本地编译、安装。

第一种方式: 需要配置yum源,一般情况下你可以配置官方源(国外的,相对慢点)、阿里源、清华源等地址,但是这些都要求你的机器能够上外网;当然你也可以配置本地源(公司源或自己搭建),这个就可能存在本地源中没有你想要安装的rpm包,这个时候你就需要通过第二种方式去找各个rpm包放到你的本地源中。

第二种方式: 需要自己花一定的时间和经历去找到你想要安装的rpm包,需要考虑rpm适用平台架构(32位还是64位或是都可以),即使你找到需要安装的rpm包,但是再执行命令安装时你可能会发现有时你还需要去下载一系列的依赖包,这个过程可能是令你非常不爽的。注:这个在Debain系列(deb包)可能你会感触更深;

第三种方式: 无论是第一种还是第二种,都有可能找不到你需要的软件包;如,你需要更新某个软件来实现最新功能或是修复最新漏洞;这个时候就需要通过第三种方式:去软件官网下载最新代码进行编译、安装;但是该方法同样存在弊端,即编译、安装必须搭建编译环境(安装gcc/g++、make、autoconf等工具)且有时整个编译、安装过程也是非常的耗时;我们可以将这个编译过程只进行一次,也就是说将源码包直接编译为rpm包,这样在后续如果还要再次使用时就可以直接安装rpm包省去了再次编译的过程!!!

一、下载源码包

kernel 官网:https://www.kernel.org/

下载链接: https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.9.8.tar.gz

[root@luckly ~]# wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.9.8.tar.gz

二、准备 config 文件

复制系统默认的内核 config 文件使用

[root@luckly ~]# cd linux-6.9.8/
[root@luckly linux-6.9.8]# cp /boot/config-`uname -r` .config

三、安装编译开发环境和依赖软件包

安装依赖软件包

[root@luckly ~]# yum install -y gcc make ncurese-devel openssl-devel perl bc

安装编译开发环境

yum install flex bison rpm-build rpmdevtools elfutils-libelf-devel gmp-devel mpfr-devel libmpc-devel -y
yum groupinstall "Development Tools"

四、开始定制内核模块

[root@luckly ~]# make menuconfig

在配置内核时报错,原因是当前通过yum安装的gcc版本过低,要想编译内核gcc版本至少要5.1.0,没办法只能去升级gcc喽

屏幕截图 2024-07-11 101113

升级gcc

gcc升级不建议升级到太高版本不然会提示gcc版本过高而导致无法编译,我这里选择8.2.0亲测没有问题( 别问我为什么知道 ←_← )

[root@luckly ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-8.2.0/gcc-8.2.0.tar.gz
[root@luckly ~]# tar xf gcc-8.2.0.tar.gz
[root@luckly ~]# cd gcc-8.2.0
[root@luckly gcc-8.2.0]# ./contrib/download_prerequisites
[root@luckly gcc-8.2.0]# mkdir build
[root@luckly gcc-8.2.0]# cd build
[root@luckly gcc-8.2.0]# ../configure --prefix=/usr/local/gcc-8.2.0 --enable-bootstrap --enable-checking=release --enable-languages=c,c++ --disable-multilib
[root@luckly gcc-8.2.0]# make -j $(nproc)       # 用你机器的所有核心来编译速度比较快
[root@luckly gcc-8.2.0]# make install
[root@luckly gcc-8.2.0]# echo -e '\nexport PATH=/usr/local/gcc-8.2.0/bin:$PATH\n' >> /etc/profile.d/gcc.sh
[root@luckly gcc-8.2.0]# source /etc/profile.d/gcc.sh
[root@luckly gcc-8.2.0]# ln -sv /usr/local/gcc-8.2.0/include/ /usr/include/gcc
[root@luckly gcc-8.2.0]# rm -rf /etc/ld.so.conf.d/gcc.conf
[root@luckly gcc-8.2.0]# echo -e "/usr/local/gcc-8.2.0/lib64" >> /etc/ld.so.conf.d/gcc.conf
[root@luckly gcc-8.2.0]# chmod 644 /etc/ld.so.conf.d/gcc.conf 
[root@luckly gcc-8.2.0]# ldconfig -v
[root@luckly gcc-8.2.0]# ldconfig -p |grep gcc
[root@luckly gcc-8.2.0]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc-8.2.0/libexec/gcc/x86_64-pc-linux-gnu/8.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --prefix=/usr/local/gcc-8.2.0 --enable-bootstrap --enable-checking=release --enable-languages=c,c++ --disable-multilib
Thread model: posix
gcc version 8.2.0 (GCC)
gcc编译速度取决于你的机器性能和cpu内核数,我24c24g机器大概用时20分钟左右

接着定制内核模块

[root@luckly ~]# make menuconfig

由于我们是拿我们当前内核版本的config文件来编译新内核,所以我们如果没有要编译的新模块直接选择Save>OK>Exit>Exit 保存退出即可

屏幕截图 2024-07-11 105619

屏幕截图 2024-07-11 105924

屏幕截图 2024-07-11 105954

基于当前的.config文件提示更新内核,并打印出新内核的版本

[root@luckly linux-6.9.8]# make oldconfig
  HOSTCC  scripts/kconfig/conf.o
  HOSTLD  scripts/kconfig/conf
#
# No change to .config
#
[root@luckly linux-6.9.8]# make kernelversion
6.9.8
[root@luckly linux-6.9.8]#

如果说你想要直接从源码安装新内核请执行第五步命令,想打包为rpm包跳过第五步直接进入第六步

注意不管第五步还是第六步请确认你的git版本是否低于1.8.5,因为在v6.x(v5.x版本未知、v4.x版本不需要安装git命令即可编译内核)版本内核编译时会提示“error: creating source package requires git repository”,出现这个错误的原因主要有两个,第一个是因为在执行编译操作时会运行一个脚本检测当前目录是否是一个可操作的git仓库如果不是则会抛出报错;第二个原因是在执行脚本检测当前目录是否是一个可操作的git仓库时会用到一个git参数(git -C),而 -C 参数是在git1.8.5版本中加入的,所以说如果git版本低于1.8.5在编译内核时会报错!!!

五、安装新内核

[root@luckly linux-6.9.8]# git init
[root@luckly linux-6.9.8]# git add .
[root@luckly linux-6.9.8]# git config --global user.email "you@example.com"
[root@luckly linux-6.9.8]# git config --global user.name "Your Name"
[root@luckly linux-6.9.8]# git commit -m "Initial commit of Linux kernel source"
[root@luckly linux-6.9.8]# make INSTALL_MOD_STRIP=1 all $(nproc)
[root@luckly linux-6.9.8]# make INSTALL_MOD_STRIP=1 modules_install
[root@luckly linux-6.9.8]# ls -lh /lib/modules
[root@luckly linux-6.9.8]# make INSTALL_MOD_STRIP=1 install
[root@luckly linux-6.9.8]# ls -lh /boot
[root@luckly linux-6.9.8]# grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
[root@luckly linux-6.9.8]# grubby --default-kernel
[root@luckly linux-6.9.8]# reboot
重启之后查看内核是否为新内核
[root@luckly ~]# uname -r

第六步、打包为rpm包

编译打包速度取决于你的机器性能和cpu内核数,我24c24g机器大概用时30分钟左右

[root@luckly linux-6.9.8]# make INSTALL_MOD_STRIP=1 rpm-pkg -j $(nproc)

INSTALL_MOD_STRIP=1:这是一个环境变量,它的作用是在安装内核模块时去除调试符号,调试符号通常是用于调试的目的,但它们会增加rpm包的大小。

不出意外又又又报错了,这是因为在打包时用到了 rpmbuild命令但是使用这个命令时用到两个不被识别的选项 --build-in-place--noprep这是因为我们当前rpmbuild命令版本比较低,要解决有两种方式,第一种如果你不嫌麻烦可以去升级rpmbuild;第二种可以将不识别的参数暂时删除即可(不影响打包)。

屏幕截图 2024-07-11 114153

我暂时采用第二种方式,编辑Makefile.package文件,大概在74行,找到那两个参数删除即可

[root@luckly linux-6.9.8]# vim scripts/Makefile.package
[root@luckly linux-6.9.8]# make INSTALL_MOD_STRIP=1 rpm-pkg -j $(nproc)

1

编译完成后查看rpm,kernel-headers它主要包含 Linux 内核的头文件,对内核开发和系统编译任务比较重要,但是一般情况下,普通用户不需要直接使用它们。也就是说我们最后只需要 kernelkernel-devel两个包即可,当然你也可以选择安装kernel-headers。

[root@luckly linux-6.9.8]# ll -h rpmbuild/RPMS/x86_64/
total 70M
-rw-r--r-- 1 root root  57M Jul 11 13:54 kernel-6.9.8+-6.x86_64.rpm
-rw-r--r-- 1 root root  12M Jul 11 13:54 kernel-devel-6.9.8+-6.x86_64.rpm
-rw-r--r-- 1 root root 1.6M Jul 11 13:54 kernel-headers-6.9.8+-6.x86_64.rpm
[root@luckly linux-6.9.8]#

安装新内核

[root@luckly linux-6.9.8]# rm -rf rpmbuild/RPMS/x86_64/kernel-headers-6.9.8+-6.x86_64.rpm 
[root@luckly linux-6.9.8]# yum -y localinstall rpmbuild/RPMS/x86_64/*.rpm
# 更改内核的启动顺序
[root@luckly linux-6.9.8]# grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.9.8+
Found initrd image: /boot/initramfs-6.9.8+.img
Found linux image: /boot/vmlinuz-3.10.0-1160.118.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.118.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-72ca98e634d4439c9a153fc29fad479d
Found initrd image: /boot/initramfs-0-rescue-72ca98e634d4439c9a153fc29fad479d.img
done
# 检查默认的内核版本
[root@luckly linux-6.9.8]# grubby --default-kernel
/boot/vmlinuz-6.9.8+
# 重启操作系统
[root@luckly linux-6.9.8]# reboot
[root@luckly ~]# uname -r
6.9.8+
[root@luckly ~]#

七、内核编译命令

编译内核生成 centos rpm 或 ubuntu deb 包

make rpm          #生成带源码的RPM包
make rpm-pkg      #生成带源码的RPM包,同上
make binrpm-pkg   #生成包含内核和驱动的RMP包
make deb-pkg      #生成带源码的debian包
make bindeb-pkg   #生成包含内核和驱动的debian包

rpm-pkg: 每次编译前会先 clean, 重复编译会很慢

linux 内核 make help:

Kernel packaging:
  rpm-pkg             - Build both source and binary RPM kernel packages
  binrpm-pkg          - Build only the binary kernel RPM package
  deb-pkg             - Build both source and binary deb kernel packages
  bindeb-pkg          - Build only the binary kernel deb package
  tar-pkg             - Build the kernel as an uncompressed tarball
  targz-pkg           - Build the kernel as a gzip compressed tarball
  tarbz2-pkg          - Build the kernel as a bzip2 compressed tarball
  tarxz-pkg           - Build the kernel as a xz compressed tarball
  perf-tar-src-pkg    - Build perf-4.14.105.tar source tarball
  perf-targz-src-pkg  - Build perf-4.14.105.tar.gz source tarball
  perf-tarbz2-src-pkg - Build perf-4.14.105.tar.bz2 source tarball
  perf-tarxz-src-pkg  - Build perf-4.14.105.tar.xz source tarball
make clean            #删除编译中间文件,但是保留配置
make mrproper         #删除包括配置文件的所有构建文件
make distclean        #执行mrproper所做的一切,并删除备份文件

make menuconfig       #文本图形方式配置内核
make oldconfig        #基于当前的.config文件提示更新内核
make defconfig        #生成默认的内核配置
make allmodconfig     #所有的可选的选项构建成模块
make allyesconfig     #生成全部选择是内核配置
make noconfig         #生成全部选择否的内核配置

make all              #构建所有目标
make bzImage          #构建内核映像
make modules          #构建所有驱动
make dir/             #构建指定目录
make dir/file.[s|o|i] #构建指定文件
make dir/file.ko      #构建指定驱动

make install          #安装内核
make modules_install  #安装驱动

make xmldocs          #生成xml文档
make pdfdocs          #生成pdf文档
maek htmldocs         #生成html文档
© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

夸夸
夸夸
还有吗!没看够!
取消
昵称表情代码图片

    暂无评论内容