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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/28840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录】

调试笔记-系列文章目录 调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录 文章目录 调试笔记-系列文章目录调试笔记-20240612-Linux-在 QEMU 中配置 OpenWrt-23.05 支持访问 Windows 宿主机的共享目录 前言一、调试环境操作系统&…

开源模型应用落地-Qwen2-7B-Instruct与vllm实现推理加速的正确姿势(十)

一、前言 目前,大语言模型已升级至Qwen2版本。无论是语言模型还是多模态模型,均在大规模多语言和多模态数据上进行预训练,并通过高质量数据进行后期微调以贴近人类偏好。在本篇学习中,将集成vllm实现模型推理加速,现在,我们赶紧跟上技术发展的脚步,去体验一下新版本模型…

大模型泡沫退去,谁能活到下半场?

前言 从今年3月开始,国内企业纷纷下场大模型,铆足劲秀肌肉,如今转向垂直行业淘金,试图争霸行业大模型。我们的心态也逐渐从看乐子,到严肃讨论。 在人工智能的世界,我们经历了众多的概念游戏,在…

Python — — GPU编程

Python — — GPU编程 要想将Python程序运行在GPU上,我们可以使用numba库或者使用cupy库来实现GPU编程。 壹、numba Numba 是一个开源的 JIT (Just-In-Time) 编译器,它可以将 Python 代码转换成机器代码以提高性能。Numba 特别适用于需要高性能计算的…

2021 hnust 湖科大 数据结构课堂实验代码及报告

2021 hnust 湖科大 数据结构课堂实验代码及报告 目录 实验1 线性表 1 实验2 栈的应用 4 实验3 队列的应用 9 实验4 串的应用 16 实验5 二叉树遍历 19 实验6 哈夫曼编码 23 实验7 图的遍历 27 实验8 最小生成树 32 实验9 最短路径 35 实验10 折半查找 37 实验11 插入排序与交换…

python实践笔记(三): 异常处理和文件操作

1. 写在前面 最近在重构之前的后端代码,借着这个机会又重新补充了关于python的一些知识, 学习到了一些高效编写代码的方法和心得,比如构建大项目来讲,要明确捕捉异常机制的重要性, 学会使用try...except..finally&…

2024年最新版------二进制安装部署Kubernetes(K8S)集群

Kubernetes二进制集群部署 文章目录 Kubernetes二进制集群部署资源列表基础环境一、环境准备1.1、绑定映射关系1.2、所有主机安装Docker1.3、所有主机设置iptables防火墙 二、生成通信加密证书2.1、master上成功CA证书2.2.1、创建证书存放位置并安装证书生成工具2.2.2、拷贝证书…

《Java2实用教程》 期末考试整理

作用域 当前类 当前包 子类 其他包 public √ √ √ √ protected √ √ √ default √ √ private √ 三、问答题(每小题4分,共8分) 1.类与对象的关系 对象:对象是类的一个实例,有状…

【实用工具】Skyworking

文章目录 一、Skywalking概述1.1 核心功能1.2 指标概述1.2.1 一些常用指标1.2.2 指标的使用方式 二、仪表盘2.1 APM2.1.1 全局维度的指标2.1.2 服务维度的指标2.1.3 实例维度的指标2.1.4 端点维度的指标 2.2 数据库2.3 其他 三、追踪3.1 界面划分3.2 请求链路界面分析3.3 一般流…

Diffusion 扩散模型(DDPM)

Diffusion 扩散模型(DDPM) 一、什么是扩散模型? 随着Stable Diffusion 3的问世,AI绘画再次成为最为火热的AI方向之一,那么不可避免地再次会问到Stable Diffusion里的这个”Diffusion”到底是什么?其实扩散…

typora下载安装、激活教程

目录 介绍 基本功能 使用教程 高级功能 下载安装 激活 关闭软件每次启动时的已激活弹窗 去除软件左下角“未激活”提示 介绍 Typora 是一款功能强大的 Markdown 编辑器,它以其简洁的界面设计和高效的文本编辑能力受到许多用户的青睐。Typora 的主要特点在于…

Socket编程模型

一、整体过程图解 二、Socket编程模型细节 客户端和服务器能在网络中通信,那必须得使用Socket编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。 创建Socket 的时候,可以指定网络层使用的是IPv4还是IPv6,传…

读《任正非文集》

《任正非文集》其实不是一本书,而是任正非在华为内容的讲话内容,有人把这些讲话内容集结成册,目前记录了从1994年到2018年间一共400多篇谈话。 感兴趣的可以在这里下载。 我是下载后导入到微信读书中听的,一共有100多万字。 我…

jvm必知必会-类的生命周期图文详解

类的生命周期描述了一个从加载、使用到卸载的过程; 而其中的 连接 部分又分为一下三个阶段: 验证准备解析6.1 加载阶段 Loading阶段第一步是 类加载器 会根据类全限定名通过不同的渠道以二进制流的方式获取字节码信息,程序员可以使用Java代码扩展不同的渠道。 比如通过 …

Linux桌面显示管理器X11和Wayland简介

一、X11的发展历程和优缺点 1. 发展历程 X11是X Window System的第11个版本,于1987年发布。它是Linux桌面环境的基础,设计初衷是为了满足跨平台、网络和硬件的图形界面需求。X11采用客户端-服务器模式,由X Server(xserver&#x…

LeetCode 算法:螺旋矩阵c++

原题链接🔗:螺旋矩阵 难度:中等⭐️⭐️ 题目 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

实用技巧:跳过TCODE权限检查ALINK_CALL_TRANSACTION

RFC:ALINK_CALL_TRANSACTION 遇到tcode 提示没有权限打开,可以通过这个RFC,debug 修改检查值,打开TCODE。 适用于紧急情况 断点打在20行,SY-SUBRC 的值改成 1

【ARMv8/ARMv9 硬件加速系列 3.4 -- SVE 复制指令CPY 使用介绍】

文章目录 SVE 复制指令CPYSVE 指令格式SVE 使用语法SVE CPY 使用示例SVE CPY 小结SVE 复制指令CPY CPY <Zd>.<T>, <Pg>/M, #<imm>{, <shift>}cpy 指令在 ARMv9 的

MySQL的卸载

先停止对应MySQL服务&#xff0c;然后再进行删除&#xff08;进入MySQL安装目录bin目录内以管理员身份打开命令行&#xff09; 停止服务 net stop Mysql&#xff08;服务名&#xff09; ——MySQL&#xff08;服务名&#xff09;安装时是什么名字就写什么名字 卸载 mysqld …

在矩池云快速使用ChatTTS,文本转语音太酷了

ChatTTS 最新的一款文本转语音模型&#xff0c;目前支持英文和中文两种语言&#xff0c;面向对话场景的转化则更为精准&#xff0c;在汉语的语音韵律方面超越了以往很多同类模型&#xff0c;此外它还支持细粒度控制&#xff0c;允许在文字中加入笑声、停顿、语气词等&#xff0…