x86_64平台通过qemu-user-static 运行arm64的docker镜像

x86_64平台通过qemu-user-static 运行arm64的docker镜像

  1. 下载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
#下载后需要解压
  1. 初始化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 架构。

  1. 拉取arm版本的镜像
docker pull arm64v8/ubuntu:20.04
  1. 运行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 通常包括以下步骤:

  1. 确保内核支持:现代 Linux 内核通常默认支持 binfmt_misc,但需要确认它被编译进了内核或作为模块加载了。

  2. 挂载 binfmt_misc 文件系统:如果还没挂载,需要执行如下命令:

    mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
    
  3. 注册新的文件格式:通过向 /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注册项:

  1. 确认 binfmt_misc 文件系统已经被挂载:

    mount | grep binfmt_misc
    

    如果没有挂载,使用以下命令挂载它:

    sudo mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
    
  2. 检查 binfmt_misc 目录中相关的注册信息:

    ls -al /proc/sys/fs/binfmt_misc
    

    你应该能够看到与不同架构对应的条目,比如 qemu-armqemu-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 包后不需要进行额外的配置,除非有特定的高级用例或存在问题需要解决。简单地安装该包通常就足够了。

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值