在MacOS下使用Qemu usermode异构打包riscv64 rpm包

最近,因为需要较长时间离电开机,换了MacBook,所以以前直接在Fedora下在X86-64下使用Qemu usermode打包riscv64人rpm包的操作就不能用了。大约摸索了一下,现在在MacOS下使用原生container命令建立Fedora容器来使用原来的流程打包,测试了一下大约可以,记录一下步骤。当然,现在MacOS下的容器其实是基于Apple virtualization的轻量级虚拟机的,还需要手动分配更多的CPU肯内存资源来使打包快一点。但是会有一定的概率让容器卡死,需要杀死这个虚拟机的进程来中止,会丢数据。

首先是使用Homebrew安装container:

1
brew install container

然后启动container服务:

1
container system start

当然,因为在大陆,下载镜像的时候一般还是需要代理来加速的,可以这样启动:

1
env http_proxy='http://proxyserver:8080' https_proxy='http://proxyserver:8080' container system start

经过实际使用中测试,似乎在pull的时候命令行加代理配置是没用的,要在启动服务的时候加上代理的配置。

下载镜像:

1
container image pull fedora

这一步不是必须,如果没有镜像在本地,默认会自动pull,但是,对于使用代理来说,这一步是有意义的,可以在pull下载镜像的时候使用代理,平常运行的时候不使用代理。

创建并运行容器:

1
container run -ti --name fedora-mock -v /path/to/work:/work/path/in/container --cpus 12 --memory 32GB fedora /bin/bash

我的Mac有14个核,分配12个给打包用,打包一般32G内存也够了,必须笔记本本身才48G内存。

在容器里安装qemu-user-static,为binfmt启动usermode准备:

1
dnf install qemu
-user-static

因为是容器,自动注册binfmt的systemd-binfmt.service是不会工作的,所以需要自己手工操作。

先挂载binfmt目录:

1
mount -t binfmt_misc none /proc/sys/fs/binfmt_misc

然后注册格式:

1
echo ':qemu-riscv64:M::\x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-riscv64-static:OCF' > /proc/sys/fs/binfmt_misc/register

检验:

1
cat /proc/sys/fs/binfmt_misc/qemu-riscv64

1
enabled<br />interpreter /usr/bin/qemu-riscv64-static<br />flags: OCF<br />offset 0<br />magic 7f454c460201010000000000000000000200f300<br />mask ffffffffffffff00fffffffffffffffffeffffff

然后就可以在容器中与原来在Fedora X86_64下一样直接使用mock打包riscv64的rpm了:

1
time env G_SLICE=always-malloc mock --no-bootstrap-chroot --no-bootstrap-image --enable-network -r fedora-43-riscv64 --sources=$PWD --spec=$(basename $PWD).spec

发表评论

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理