背景

最近在项目中需要编译arm架构的某驱动docker镜像,但是手头上没有现成的arm架构的机器环境,于是在网上搜索了下如何在x86机器模拟arm环境来进行编译。我找到了一款神器:multiarch/qemu-user-static

简介

项目地址:https://github.com/multiarch/qemu-user-static

qemu-user-static是一个用于利用当前操作系统来运行其它架构的一个仿真器,这个github项目可以通过x86的机器编译出其它各个架构的docker镜像。

支持的指令集架构:

  • armv7l
  • ppc64le
  • s390x
  • aarch64
  • armv7l
  • ppc64le
  • 。。。

arm环境搭建

这里我手头上的机器为x86_64,ubuntu系统

1. 安装docker环境

参考docker环境搭建

2. 安装qemu相关

#更新apt源
apt-get update
#安装qemu
apt-get install qemu
#下载qemu-aarch64-static
wget https://github.com/multiarch/qemu-user-static/releases/download/v5.1.0-5/qemu-aarch64-static.tar.gz
#解压
tar xzvf qemu-aarch64-static.tar.gz
#配置可执行文件路径
sudo cp qemu-aarch64-static /usr/bin/
chmod +x /usr/bin/qemu-aarch64-static

3.注册qemu-user-static虚拟机

#注册qemu-user-static虚拟机
docker run --rm --privileged multiarch/qemu-user-static:register --reset
#查看运行的docker容器
docker ps -a |grep arm

看到如下图即注册成功。

构建docker镜像

编译二进制

我们写一个helloworld的C程序,然后使用docker编译一个支持arm架构体系的镜像,hello.c:

#include<stdio.h>

int main()
{
  printf("hello world\n");
  return 0;
}

生成二进制文件

gcc hello.c -o hello

制作Dockfile

这里我们要构建aarch64的docker,使用基础镜像: multiarch/alpine:aarch64-edge

其他基础镜像地址参考:https://hub.docker.com/u/multiarch/

DockerFile内容:

FROM multiarch/alpine:aarch64-edgeRUN mkdir /data
WORKDIR /data
COPY hello /data/hello
# Define default command.
ENTRYPOINT  ["/data/hello"]

1)使用DockerFile构建镜像

docker build . -t hello

2)查看编译好的镜像

docker images 

这样支持arm架构的helloworld的docker镜像打好了,你可以将其push到docker到镜像仓库中,然后在arm机器上pull并运行该镜像。

博主:测试生财

座右铭:专注测试与自动化,致力提高研发效能;通过测试精进完成原始积累,通过读书理财奔向财务自由。

csdn:https://blog.csdn.net/ccgshigao

博客园:https://www.cnblogs.com/qa-freeroad/

51cto:https://blog.51cto.com/14900374