不管是 rpm 包的构建,还是 Qemu 自身的构建都非常简单,主要是记录一下如何查找特定版本的 rpm 包源代码。
Qemu 源码
首先需要获取源代码,可以克隆 Qemu 上游仓库并切换到相应 tag,也可以从已有的各大 RPM 系发行版获取 src rpm 包,考虑到可能的补丁以及构建选项的选择,这里选择基于 src rpm 包的方式。
通过 https://pkgs.org/ 可以搜索到 Qemu 4.2.1 只在 Oracle Linux 8 aarch64 上有提供1,CentOS 7/8 由于都已经 EOL 了,所以 pkgs.org 上没法进行搜索,但是可以通过 CentOS vault2 进行手工查找,同时尝试在 Fedora 构建服务器3上进行查找,也找到了 Qemu 4.2.1 相关的信息4。
本文选择基于 Fedora 的源码进行构建,实际上基于 Oracle 的代码可能会更合理,因为 Oracle 8 毕竟还处于维护周期内。
$ wget https://kojipkgs.fedoraproject.org//vol/fedora_koji_archive04/packages/qemu/4.2.1/1.fc32/src/qemu-4.2.1-1.fc32.src.rpm
构建环境
显然,不可能仅仅只是为了构建 Qemu 就安装一个 CentOS 7 的环境,可以选择创建基于容器的 CentOS 7 环境进行构建。
$ docker pull centos:7
$ docker run -it centos:7
然后在容器内安装 gcc, rpm-build 等 rpm 构建必须的工具。
rpm 构建
从 Fedora 构建服务器上下载的 src rpm 包需要先安装(实际上就是将代码和 rpm 构建所需的 spec 文件解压到 ~/rpmbuild
目录下)。
$ rpm -Uvh qemu-4.2.1-1.fc32.src.rpm
在正式构建前需要先安装所需的依赖(这里的 sudo
仅用来表示 root 用户权限,实际上在容器环境下默认就是 root 用户执行):
$ sudo yum-builddep ~/rpmbuild/SPECS/qemu.spec
此时会发现有一些依赖无法找到(确保 /etc/yum.repos.d/CentOS-Base.repo
中的 yum 源都已经 enabled),这说明 Fedora 构建的 Qemu 启用了一些特性,而这些特性 CentOS 没有对应的动态库支持。这个问题没有好的解决版本,要么在 CentOS 上构建缺失的动态库,要么就根据业务的需要禁用相关的特性。
下面是一个修改后的 spec 文件示例,禁用了一些不满足依赖要求以及业务不需要的特性(当然为了正确构建 rpm 包还关联删除/修改了一些其它的内容)。
然后使用 rpmbuild 进行 rpm 包构建:
$ rpmbuild -ba --nocheck ~/rpmbuild/SPECS/qemu.spec
如果一切正常,构建的 rpm 包在如下位置:
$ ls ~/rpmbuild/RPMS/aarch64
解压 rpm 包
为了从 rpm 包提取内容可以使用桌面环境下的解压工具,但更常见的是如下的命令行方式:
$ cd ~/rpmbuild/RPMS/aarch64
$ rpm2cpio qemu-system-aarch64-core-4.2.1-1.el7.aarch64.rpm | cpio -div
$ tree usr/
usr/
|-- bin
| `-- qemu-system-aarch64
`-- share
`-- systemtap
`-- tapset
|-- qemu-system-aarch64-log.stp
|-- qemu-system-aarch64-simpletrace.stp
`-- qemu-system-aarch64.stp
然后拷贝相应的文件即可(注意这里的 usr 是当前功过目录下的 usr,不是 /usr)。
-
Oracle Linux 8 KVM Source
https://yum.oracle.com/repo/OracleLinux/OL8/kvm/appstream/aarch64/index_src.html ↩︎ -
CentOS vault
https://mirrors.ustc.edu.cn/centos-vault/ ↩︎ -
Fedora buildsystem
https://koji.fedoraproject.org/koji/ ↩︎ -
Information for build qemu-4.2.1-1.fc32
https://koji.fedoraproject.org/koji/buildinfo?buildID=1533648 ↩︎
最后修改于 2024-06-23