本文主要是介绍x86_64平台通过qemu-user-static 运行arm64的docker镜像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
x86_64平台通过qemu-user-static 运行arm64的docker镜像
- 下载qemu-user-static(x86_64)
此步骤也不是必须的,但是可能碰到【exec /usr/bin/uname: no such file or directory】这样的错误,需要把qemu-aarch64-static手动mount到目标容器里。
wget https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-aarch64-static.tar.gz
#下载后需要解压
- 初始化binfmt
#初始化和重置binfmt
docker run --rm --privileged multiarch/qemu-user-static --reset
#设置binfmt(可能会失败,原因未知,解决方式是手动mount qemu-aarch64-static到容器;)
docker run --rm --privileged multiarch/qemu-user-static -p yes
qemu-user-static结合binfmt_misc来实现arm架构的指令模拟(文末有详细介绍)
可以通过检查 /proc/sys/fs/binfmt_misc 下的内容来确认是否成功启用。
root@testhost1:/root>ls -al /proc/sys/fs/binfmt_misc
total 0
drwxr-xr-x 2 root root 0 May 21 15:11 .
dr-xr-xr-x 1 root root 0 May 21 23:11 ..
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-aarch64
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-aarch64_be
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-alpha
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-arm
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-armeb
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-hexagon
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-hppa
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-m68k
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-microblaze
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-microblazeel
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-mips
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-mips64
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-mips64el
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-mipsel
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-mipsn32
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-mipsn32el
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-or1k
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-ppc
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-ppc64
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-ppc64le
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-riscv32
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-riscv64
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-s390x
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-sh4
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-sh4eb
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-sparc
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-sparc32plus
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-sparc64
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-xtensa
-rw-r--r-- 1 root root 0 Jun 17 14:58 qemu-xtensaeb
--w------- 1 root root 0 Jun 17 14:59 register
-rw-r--r-- 1 root root 0 May 21 15:11 status
如果没有自动启用,你可能需要手动挂载 binfmt_misc 文件系统:
sudo mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
在安装并配置好 qemu-user-static 与 binfmt_misc 后,你就可以直接使用 Docker 运行 ARM64 的镜像了。这时,Docker 与 QEMU 联动,能够在你的 x86_64 机器上模拟 ARM64 架构。
- 拉取arm版本的镜像
docker pull arm64v8/ubuntu:20.04
- 运行arm容器
需要把qemu-aarch64-static映射到目标容器里
需要指定目标容器的platform
ddocker run -it --rm --platform linux/arm64 -v `pwd`/qemu-aarch64-static:/usr/bin/qemu-aarch64-static arm64v8/ubuntu:20.04 uname -m
这个命令尝试运行一个基于 ARM64 的 Ubuntu 镜像,并执行 uname -m 命令来输出机器架构类型。如果一切配置正确,它应该输出 aarch64,表明当前正在模拟 ARM64 架构运行。
从网络上收集的其他资料来看,貌似不需要强制把qemu-aarch64-static映射到目标容器里,但是我没有实验成功,不这么做的话,不管运行什么都会返回“exec XXX: no such file or directory”如果哪位读者知道原因,麻烦评论区给出方案,谢谢
附录:bin-fmt详解
binfmt_misc
(binary format miscellaneous)是 Linux 内核的一个功能,它允许系统动态地支持新的可执行文件格式。它不仅限于标准的 ELF(Executable and Linkable Format)或 a.out 格式,还可以让系统识别和执行各种其他格式的程序,比如 Windows 的可执行文件(.exe 和 .dll),Java 类文件,甚至是脚本语言文件等。
binfmt_misc
的工作原理是通过注册给定的文件格式和相应的解释器(或处理程序)来实现。当尝试执行某个文件时,Linux 内核会检查文件的魔数(magic numbers,即文件头部的一组特定字节,用于标识文件格式)或其他标识,并根据之前通过 binfmt_misc
注册的规则,将文件和对应的解释器匹配起来。然后,内核会用指定的解释器来执行该文件,就好像是运行一个本地 ELF 文件一样。
使用场景
一个常见的应用场景是使 Linux 系统能够直接执行 Windows 的可执行文件。通过为 Windows 程序注册 binfmt_misc
支持,并且系统中安装了 wine
,你就可以像运行本地 Linux 程序那样运行 .exe
文件。
Java 程序也是一个典型例子。通过配置 binfmt_misc
,可以使得 Java 字节码文件(.class 或 .jar)直接可执行,无需显式调用 java -jar
命令。
配置步骤
配置 binfmt_misc
通常包括以下步骤:
-
确保内核支持:现代 Linux 内核通常默认支持
binfmt_misc
,但需要确认它被编译进了内核或作为模块加载了。 -
挂载 binfmt_misc 文件系统:如果还没挂载,需要执行如下命令:
mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
-
注册新的文件格式:通过向
/proc/sys/fs/binfmt_misc/register
文件写入特定的规则字符串来注册新的可执行文件格式。例如,为.py
Python 脚本注册解释器可能看起来像这样:echo ':Python:E::py::/usr/bin/python:' > /proc/sys/fs/binfmt_misc/register
这样配置后,系统就能够通过直接执行 .py
文件(设置了执行权限的前提下)来运行 Python 脚本了,无需在命令行前添加 python
。
注意事项
- 使用
binfmt_misc
会让系统更加开放和灵活,但也要注意安全性。误配置可能会引入安全风险。 - 在一些特定的环境或分布式系统中,由于涉及到多种架构和平台,
binfmt_misc
与 QEMU(一个处理跨平台模拟的工具)结合可以实现在一个架构上运行另一个架构编译的程序,这常用于开发和测试跨平台应用。这也是binfmt_misc
较为高级的用法之一。
当你安装了 qemu-user-static
包之后,大多数情况下,配置将会自动完成。它会利用 binfmt_misc
功能注册各种架构的二进制格式,以便你在x86_64系统上能够透明地运行其他架构的可执行文件,例如 ARM。
自动配置包括注册可执行文件的魔数(magic numbers)与对应的 QEMU 静态模拟器。这允许内核自动使用 QEMU 模拟不同架构的程序,无需任何额外的用户干预。
为了确认qemu-user-static
是否已经正确配置和启动,你可以检查binfmt_misc
注册项:
-
确认
binfmt_misc
文件系统已经被挂载:mount | grep binfmt_misc
如果没有挂载,使用以下命令挂载它:
sudo mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
-
检查
binfmt_misc
目录中相关的注册信息:ls -al /proc/sys/fs/binfmt_misc
你应该能够看到与不同架构对应的条目,比如
qemu-arm
、qemu-aarch64
等。
如果这些条目存在,说明 qemu-user-static
已经正确配置。
在某些 Linux 发行版中,你可能还需要启用或重启 systemd-binfmt
服务,确保相关的设置在系统重启时生效:
sudo systemctl enable systemd-binfmt
sudo systemctl restart systemd-binfmt
以下是一些可能需要手动配置的高级选项:
-
在某些情况下,如果需要的话,你可以手动添加或编辑
/proc/sys/fs/binfmt_misc
目录下的注册文件,以调整模拟器行为。 -
对于大规模或定制的环境,你可能需要创建自己的
binfmt_misc
注册脚本,以自动化注册步骤。
大多数用户在安装 qemu-user-static
包后不需要进行额外的配置,除非有特定的高级用例或存在问题需要解决。简单地安装该包通常就足够了。
这篇关于x86_64平台通过qemu-user-static 运行arm64的docker镜像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!