首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么macos(x86)可以运行停靠臂容器arm64v8/高寒?

为什么macos(x86)可以运行停靠臂容器arm64v8/高寒?
EN

Stack Overflow用户
提问于 2021-02-24 12:24:15
回答 1查看 4.7K关注 0票数 14

我碰巧发现,我的macos(x86)可以为arm映像arm64v8/阿尔卑斯运行一个码头容器,但有以下警告:

代码语言:javascript
复制
docker run -it  arm64v8/alpine uname -a

WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
Linux d5509c57dd24 4.19.121-linuxkit #1 SMP Tue Dec 1 17:50:32 UTC 2020 aarch64 Linux

而且我很确定这个图像不是一个多拱图像(docker manifest inspect --verbose arm64v8/alpine)。为什么x86可以运行arm容器?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-02 07:38:41

您是正确的,图像不是多架构,但是,码头可以运行它。这背后的原因是一个名为binfmt_misc的内核子系统,它允许将二进制文件的magic编号设置为执行它们的特定操作。你可以在这个漂亮的维基百科帖子上读到更多关于它的内容。

Docker正在为binfmt魔术做好准备,所以没有什么可做的了。它将启用开箱即用的安装,您所需要做的就是获取映像并运行。该机制的详细信息可以在此链接上的docker项目存储库中找到。

简单地解释一下,二进制映像有一个magic编号,它允许内核决定如何处理执行。当binfmt_misc截取它识别magic编号的文件时,它将调用与magic编号相关联的处理程序。

仅凭这一点还不足以运行容器。魔术的下一部分是QEMU,它是各种CPU体系结构的模拟器。内核(binfmt_misc)将为每个属于ARM64的二进制文件调用quemy,并将模仿ARM64v8。

这不仅限于docker,也不限于在macOS上运行docker的虚拟机。任何linux系统都可以配置为这样做。

您可以使用下面的方法来安装它,安装Ubuntu来运行仿真。

代码语言:javascript
复制
sudo apt-get install qemu binfmt-support qemu-user-static # Install the qemu packages
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # This step will execute the registering scripts

docker run --rm -t arm64v8/ubuntu uname -m # Testing the emulation environment

有关整个设置过程的更多详细信息可以在qemu-用户静态存储库中找到。

OP:如果您想知道这样做有什么用处,从我个人的经验来看,在将应用程序从X86移植到其他体系结构(主要是ARM64)时,我正在大量使用此功能。这允许我为不同的体系结构运行构建系统,而不需要在物理机器上运行构建。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66350893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档