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

2024-06-17 20:04

本文主要是介绍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 包后不需要进行额外的配置,除非有特定的高级用例或存在问题需要解决。简单地安装该包通常就足够了。

这篇关于x86_64平台通过qemu-user-static 运行arm64的docker镜像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070396

相关文章

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

通过Docker Compose部署MySQL的详细教程

《通过DockerCompose部署MySQL的详细教程》DockerCompose作为Docker官方的容器编排工具,为MySQL数据库部署带来了显著优势,下面小编就来为大家详细介绍一... 目录一、docker Compose 部署 mysql 的优势二、环境准备与基础配置2.1 项目目录结构2.2 基

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

关于Docker Desktop的WSL报错问题解决办法

《关于DockerDesktop的WSL报错问题解决办法》:本文主要介绍关于DockerDesktop的WSL报错问题解决办法的相关资料,排查发现是因清理%temp%文件夹误删关键WSL文件,... 目录发现问题排查过程:解决方法其实很简单:重装之后再看就能够查到了:最后分享几个排查这类问题的小www.cp

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla

如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件

《如何使用Docker部署FTP和Nginx并通过HTTP访问FTP里的文件》本文介绍了如何使用Docker部署FTP服务器和Nginx,并通过HTTP访问FTP中的文件,通过将FTP数据目录挂载到N... 目录docker部署FTP和Nginx并通过HTTP访问FTP里的文件1. 部署 FTP 服务器 (

解读docker运行时-itd参数是什么意思

《解读docker运行时-itd参数是什么意思》在Docker中,-itd参数组合用于在后台运行一个交互式容器,同时保持标准输入和分配伪终端,这种方式适合需要在后台运行容器并保持交互能力的场景... 目录docker运行时-itd参数是什么意思1. -i(或 --interactive)2. -t(或 --

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins