记录编译与修改龙蜥Anolis OS内核的过程(一)
1. 安装Anolis OS 8.9
下载AnolisOS-8.9-x86_64-dvd.iso并安装。
使用uname -a查看内核版本为5.10.134-18.an8.x86_64。
[root@localhost cloud-kernel]# cat /etc/anolis-release
Anolis OS release 8.9
[root@localhost cloud-kernel]# uname -a
Linux localhost.localdomain 5.10.134-18.an8.x86_64 #1 SMP Fri Dec 13 16:32:58 CST 2024 x86_64 x86_64 x86_64 GNU/Linux
2. 下载内核源码包
- 安装yumdownloader
yum install yum-utils
- 下载内核源码rpm包 kernel-5.10.134-18.an8.src.rpm
yumdownloader --source kernel
3. 准备工作
- 安装rpmbuild工具
yum install rpm-build
- 安装其它编译依赖
- 查询依赖
[root@localhost ~]# rpm -qp --requires kernel-5.10.134-18.an8.src.rpm
asciidoc
audit-libs-devel
bash
bc
binutils
binutils-devel
bison
bzip2
coreutils
diffutils
dwarves
elfutils
elfutils-devel
findutils
flex
gawk
gcc
gettext
git
gzip
hmaccalc
hostname
java-devel
kmod
libcap-devel
libcap-ng-devel
libnl3-devel
m4
make
ncurses-devel
net-tools
newt-devel
numactl-devel
openssl
openssl-devel
patch
pciutils-devel
perl(ExtUtils::Embed)
perl-Carp
perl-devel
perl-generators
perl-interpreter
python3-devel
python3-docutils
redhat-rpm-config
rpm-build
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rsync
tar
which
xmlto
xz
xz-devel
zlib-devel
- 安装依赖
查询得到的依赖比较多,不同的人缺失的包可能不同,用下面的命令把依赖的包全部装一遍。
如果已经安装了,会自动跳过。
rpm -qp --requires kernel-5.10.134-18.an8.src.rpm | awk '{print $1}' | xargs yum install -y
4. 编译
- 安装src.rpm包,得到/root/rpmbuild目录
- 此目录底下是把src.rpm直接解压所得,源码没有准备出来
rpm -ivh kernel-5.10.134-18.an8.src.rpm
- 安装src.rpm包之后,通过spec文件拿到内核源码,源码在/root/rpmbuild/BUILD目录
rpm -ivh kernel-5.10.134-18.an8.src.rpm
rpmbuild -bp rpmbuild/SPECS/kernel.spec
- 从src.rpm构建拿到内核源码,不进行构建
rpmbuild -rp kernel-5.10.134-18.an8.src.rpm
解压缩源代码并应用补丁,源码在/root/rpmbuild/BUILD目录
- 从src.rpm构建二进制RPM包
rpmbuild -rb kernel-5.10.134-18.an8.src.rpm
- 其它用法参考rpmbuild --help
[root@localhost ~]# rpmbuild --help
用法: rpmbuild [选项...]
适用于 [ <specfile> | <tarball> | <source package> ] 的构建选项:
-bp 依据 <specfile> 从 %prep (解压缩源代码并应用补丁) 开始构建
-bc 依据 <specfile> 从 %build (%prep 之后编译) 开始构建
-bi 依据 <specfile> 从 %install (%prep、%build 后安装) 开始构建
-bl 依据 <specfile> 校验 %files 部分
-ba 依据 <specfile> 构建源代码和二进制软件包
-bb 依据 <specfile> 构建二进制软件包
-bs 依据 <specfile> 构建源代码软件包
-rp 仅执行 <source package> 的 %prep 部分(解压缩源代码并应用补丁)
-rc 仅执行 <source package> 的 %build 部分(先执行 %prep,然后 %build)
-ri 依据 <source package> 从 %install (%prep、%build 然后安装)开始构建
-rl 依据 <source package> 校验 %files 部分
-ra 从 <source package> 中构建二进制和源代码 RPM 包
-rb 仅从 <source package> 中构建二进制 RPM 包
-rs 仅从 <source package> 中构建源代码 RPM 包
-tp 依据 <tarball> 从 %prep (解压源代码并应用补丁)开始构建
-tc 依据 <tarball> 从 %build (%prep,之后编译)开始构建
-ti 依据 <tarball> 从 %install (%prep、%build 然后安装)开始构建
-ta 依据 <tarball> 构建源代码和二进制软件包
-tb 依据 <tarball> 构建二进制软件包
-ts 依据 <tarball> 构建源代码软件包
--rebuild 依据 <source package> 构建二进制软件包
--recompile 依据 <source package> 从 %install (%prep、%build 然后安装)开始构建
--buildroot=DIRECTORY 重载构建根路径
--build-in-place 在当前目录中构建
--clean 完成后移除构建树
--nobuild 不执行任何构建步骤
--nodeps 不检验构建依赖
--nodirtokens 生成和 rpm v3 包管理(旧版本)兼容的软件包头
--noclean 构建过程中不执行 %clean 步骤
--noprep 不执行构建的 %prep 阶段
--nocheck 构建过程中不执行 %check 步骤
--rmsource 完成时移除源代码
--rmspec 完成时移除 specfile
--short-circuit 直接跳转到指定步骤 (仅限 c,i)
--target=CPU-VENDOR-OS 重载目标平台
所有 rpm 模式和可执行文件的通用选项:
-D, --define=“MACRO EXPR” 定义值为 EXPR 的 MACRO
--undefine=MACRO 未定义的 MACRO
-E, --eval=“EXPR” 打印 EXPR 的宏展开
--target=CPU-VENDOR-OS Specify target platform
--macros=<FILE:…> 从文件 <FILE:...> 读取宏,不使用默认文件
--noplugins 不要启用任何插件
--nodigest 不校验软件包的摘要
--nosignature 不验证软件包签名
--rcfile=<FILE:…> 从文件 <FILE:...> 读取宏,不使用默认文件
-r, --root=ROOT 使用 ROOT 作为顶级目录 (default: "/")
--dbpath=DIRECTORY 使用 DIRECTORY 目录中的数据库
--querytags 显示已知的查询标签
--showrc 显示最终的 rpmrc 和宏配置
--quiet 提供更少的详细信息输出
-v, --verbose 提供更多的详细信息输出
--version 打印使用的 rpm 版本号
Options implemented via popt alias/exec:
--with=<option> enable configure <option> for build
--without=<option> disable configure <option> for build
--buildpolicy=<policy> set buildroot <policy> (e.g. compress man pages)
--sign generate GPG signature (deprecated, use command rpmsign instead)
--nodebuginfo do not generate debuginfo for this package
帮助选项:
-?, --help 显示这个帮助信息
--usage 显示简短的使用说明