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

相关文章

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短