最近,因为需要较长时间离电开机,换了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 |
因为是容器,自动注册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 |