跳转至

(4):最快的方式运行或编译不同cpu架构的程序

快速示例演示

目标:创建一个arm32v7架构的容器,以便于可以编译arm32v7架构的程序,期望的操作系统是Debian

要在Docker上创建一个运行在arm7架构上的qemu虚拟机,可以使用基于QEMU的多架构模拟器,例如multiarch/qemu-user-static。以下是一些简单的步骤来实现这个目标:

  1. 安装Docker:如果你还没有安装Docker,请先按照官方文档安装:https://docs.docker.com/get-docker/

  2. 下载并安装multiarch/qemu-user-static

    docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    
    • 这个命令将下载和安装multiarch/qemu-user-static,它提供了在不同架构上运行的QEMU二进制文件。
  3. 运行Docker容器:

    docker run -it arm32v7/debian -v /path/to/resouce:/workspace/ /bin/bash
    
    1. 这个命令将拉去arm32v7架构的debian操作系统,并启动一个交互式的bash shell,允许你在容器内进行命令行操作;
    2. 挂载自己要编译的代码或程序/path/to/resource/目录到容器的/workspace/目录;
    3. 接着就可以在arm32v7架构下,编译或运行自己的程序的。

镜像:multiarch/qemu-user-static

如前文所述,我们运行的命令如下完成了运行不同架构的准备工作:

$ docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

仓库可以参阅Github:https://github.com/multiarch/qemu-user-static

为什么之后可以运行不同cpu架构的容器?

这个命令启动了一个名为multiarch/qemu-user-static的Docker容器,并将其设置为特权模式(privileged mode)。这个容器包含了一个名为qemu-user-static的二进制文件,它可以模拟其他CPU架构的环境,从而让你在当前CPU架构上运行其他架构的容器。

具体来说,这个命令执行了以下操作:

  1. --privileged选项将容器设置为特权模式,这样它就可以访问宿主机的硬件和内核功能。

  2. multiarch/qemu-user-static是一个预先构建好的Docker镜像,其中包含了qemu-user-static二进制文件和其他必要的文件。

  3. --reset选项告诉qemu-user-static重置所有模拟器选项并退出。

  4. -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的文件:

$ ls /sys/fs/binfmt_misc/qemu-arm

有没有免安装的方法?

Docker桌面版直接支持,安装方法可访问官网:https://docs.docker.com/get-docker/

评论