Qemu 4.2.1 版本构建
简单记录一下在 CentOS 7 aarch64 上构建 Qemu 4.2.1 版本的步骤。

不管是 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 包还关联删除/修改了一些其它的内容)。

qemu.spec

然后使用 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)。


最后修改于 2024-06-23