在linux上注册binfmt规则,以运行不同架构的二进制程序

6 阅读2分钟

方案一:在ubuntu上使用apt安装

apt install qemu-user-binfmt qemu-user-static 这种方式会注册一个路径固定的解释器

方案二:使用自定义的解释器,需要手动注册

检查是否已挂载

mount | grep binfmt_misc

如果没有,手动挂载

sudo mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc

向内核注册新规则

你需要向 /proc/sys/fs/binfmt_misc/register写入一行特定格式的文本。格式如下: :name:type:offset:magic:mask:interpreter: name: 规则的名称,如 my-qemu-riscv64。 type: 类型,E代表 ELF 格式,M代表其他(如脚本)。对于二进制文件,我们用 E。 offset: 检查的偏移量,对于 ELF 文件头是 0。 magic: 要匹配的魔数(16进制)。 mask: 掩码(16进制)。 interpreter: 解释器的完整路径。 对于 RISC-V 64,我们可以使用之前看到的魔数和掩码。执行以下命令(请务必替换成你的解释器路径): echo ':my-qemu-riscv64:M:0:\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/local/bin/qemu-riscv64:POF' | sudo tee /proc/sys/fs/binfmt_misc/register

注意,docker要求使用qemu-static版本,动态版本的qemu可能会因为找不到动态链接库而执行失败,因此请确保路径指向正确的二进制文件。

验证新规则

cat /proc/sys/fs/binfmt_misc/my-qemu-riscv64 如果一切顺利,你应该能看到类似之前你查询 my-qemu-riscv64时的输出,只不过 interpreter路径变成了你自定义的那个。

测试

现在,当你尝试执行一个 RISC-V 64 的二进制文件时,内核应该会使用你自定义的 QEMU 来解释执行它。

注销规则

如果你想删除这个自定义规则,可以向 unregister文件写入它的名字: sudo echo -1 > /proc/sys/fs/binfmt_misc/my-qemu-riscv64