(4):最快的方式运行或编译不同cpu架构的程序
快速示例演示¶
目标:创建一个arm32v7
架构的容器,以便于可以编译arm32v7
架构的程序,期望的操作系统是Debian
要在Docker上创建一个运行在arm7架构上的qemu虚拟机,可以使用基于QEMU
的多架构模拟器,例如multiarch/qemu-user-static
。以下是一些简单的步骤来实现这个目标:
-
安装Docker:如果你还没有安装Docker,请先按照官方文档安装:https://docs.docker.com/get-docker/
-
下载并安装
multiarch/qemu-user-static
:- 这个命令将下载和安装
multiarch/qemu-user-static
,它提供了在不同架构上运行的QEMU二进制文件。
- 这个命令将下载和安装
-
运行Docker容器:
- 这个命令将拉去
arm32v7
架构的debian
操作系统,并启动一个交互式的bash shell,允许你在容器内进行命令行操作; - 挂载自己要编译的代码或程序
/path/to/resource/
目录到容器的/workspace/
目录; - 接着就可以在
arm32v7
架构下,编译或运行自己的程序的。
- 这个命令将拉去
镜像:multiarch/qemu-user-static¶
如前文所述,我们运行的命令如下完成了运行不同架构的准备工作:
仓库可以参阅Github:https://github.com/multiarch/qemu-user-static
为什么之后可以运行不同cpu架构的容器?¶
这个命令启动了一个名为multiarch/qemu-user-static
的Docker容器,并将其设置为特权模式(privileged mode)。这个容器包含了一个名为qemu-user-static
的二进制文件,它可以模拟其他CPU架构的环境,从而让你在当前CPU架构上运行其他架构的容器。
具体来说,这个命令执行了以下操作:
-
--privileged
选项将容器设置为特权模式,这样它就可以访问宿主机的硬件和内核功能。 -
multiarch/qemu-user-static
是一个预先构建好的Docker镜像,其中包含了qemu-user-static
二进制文件和其他必要的文件。 -
--reset
选项告诉qemu-user-static
重置所有模拟器选项并退出。 -
-p yes
选项表示在容器内安装所需的binfmt_misc
注册表条目,以便在宿主机上注册qemu-user-static
二进制文件作为二进制格式解释器。
通过这个命令,你可以在当前CPU架构上启动其他架构的容器,例如在x86_64 CPU架构的机器上运行ARM架构的容器。但需要注意的是,这个方法并不是最理想的,因为它需要在容器内运行额外的模拟器,会增加容器的启动时间和资源消耗。
如何确认已经成功安装到主机上?¶
这个命令的作用是安装qemu-user-static
二进制文件并在宿主机上注册它作为二进制格式解释器。这样就可以在宿主机上直接执行不同架构的二进制文件。
具体来说,这个命令会在宿主机上创建一个名为binfmt_misc
的虚拟文件系统,并向其中添加一个名为qemu-arm
的条目,表示使用qemu-user-static
作为ARM架构二进制文件的解释器。它也会安装一些依赖包,以确保qemu-user-static正常工作。
为了确认qemu-user-static已经被正确安装到主机上,可以尝试执行一个ARM架构的二进制文件,如:
$ file /bin/ls
/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped
$ qemu-arm /bin/ls
如果一切正常,你应该能够在x86_64架构的机器上成功执行ARM架构的二进制文件,而不需要在Docker容器内使用qemu-user-static模拟器。
安装后主机文件系统有什么改动?¶
执行这个命令会在宿主机上创建一个名为binfmt_misc
的虚拟文件系统,并向其中添加一个名为qemu-arm
的条目。这个虚拟文件系统并不是实际的文件系统,而是内核提供的一种机制,可以将特定的二进制文件格式映射到相应的解释器程序上。
在Linux系统中,binfmt_misc
虚拟文件系统通常被挂载在/sys/fs/binfmt_misc
目录下。你可以通过查看该目录来确认是否存在名为qemu-arm
的文件:
有没有免安装的方法?¶
Docker桌面版直接支持,安装方法可访问官网:https://docs.docker.com/get-docker/