首页 > 其他分享 >PC机上使用qemu-user-static + Docker实现arm/aarch64本地编译

PC机上使用qemu-user-static + Docker实现arm/aarch64本地编译

时间:2024-09-26 09:11:51浏览次数:9  
标签:PC机 bin aarch64 static usr interpreter docker qemu

参考的链接:
https://www.cnblogs.com/chen2ha/p/17180287.html

文章很长,一些关键点在:

  1. 取得docker,Docker可以通过Linux发布版中取得,也可以从docker网站上下载编译好的程序。
    下载链接:
    https://download.docker.com/linux/static/stable/x86_64/
    这里下载的是PC上的Docker,如果需要arm或者aarch64机器的,将链接的最后一级目录修改一下即可。下载下来的文件解压到一个目录,其实就可以执行了。为了让docker能自己找到containerd等程序,修改环境变量PATH,将解压路径加入到PATH中
    配置一下docker的配置文件:
  • 配置/etc/docker/daemon.json,文件格式是json格式,最关键是需要增加如下一行:
  "experimental": true
  • 配置/usr/lib/systemd/system/docker.service服务(如果是手工下载的,示例文件将docker解压在/data/docker目录下)
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
EnvironmentFile=-/data/docker/etc/sysconfig/docker
EnvironmentFile=-/data/docker/etc/sysconfig/docker-storage
EnvironmentFile=-/data/docker/etc/sysconfig/docker-network
Environment=GOTRACEBACK=crash
Environment=PATH=/usr/sbin:/usr/bin:/sbin:/bin:/data/docker

#ExecStart=/data/docker/dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock
ExecStart=/data/docker/dockerd $OPTIONS \
                               $DOCKER_STORAGE_OPTIONS \
                               $DOCKER_NETWORK_OPTIONS \
                               $INSECURE_REGISTRY
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target
  1. 下载qemu-user-static,这个程序可以在PC机上解析arm或aarch64的ELF文件并执行之(用户侧的“虚拟机”)
    下载链接:
    https://github.com/multiarch/qemu-user-static/releases
    下载诸如: qemu-aarch64-static.tar.gz/qemu-arm-static.tar.gz的文件,下载下来后,解压。建议解压到docker包的目录下

  2. 通过docker下载并注册一个可支持的架构解释器,这一步让后续的arm或aarch64的docker容器,可以根据arm或aarch64的ELF文件格式调用注册的解析器来解析ELF并执行。
    相应的命令如下:

docker run --rm --privileged multiarch/qemu-user-static:register --reset

执行成功后,会返回类似如下的结果来表明支持的架构解析器

Setting /usr/bin/qemu-alpha-static as binfmt interpreter for alpha
Setting /usr/bin/qemu-arm-static as binfmt interpreter for arm
Setting /usr/bin/qemu-armeb-static as binfmt interpreter for armeb
Setting /usr/bin/qemu-sparc-static as binfmt interpreter for sparc
Setting /usr/bin/qemu-sparc32plus-static as binfmt interpreter for sparc32plus
Setting /usr/bin/qemu-sparc64-static as binfmt interpreter for sparc64
Setting /usr/bin/qemu-ppc-static as binfmt interpreter for ppc
Setting /usr/bin/qemu-ppc64-static as binfmt interpreter for ppc64
Setting /usr/bin/qemu-ppc64le-static as binfmt interpreter for ppc64le
Setting /usr/bin/qemu-m68k-static as binfmt interpreter for m68k
Setting /usr/bin/qemu-mips-static as binfmt interpreter for mips
Setting /usr/bin/qemu-mipsel-static as binfmt interpreter for mipsel
Setting /usr/bin/qemu-mipsn32-static as binfmt interpreter for mipsn32
Setting /usr/bin/qemu-mipsn32el-static as binfmt interpreter for mipsn32el
Setting /usr/bin/qemu-mips64-static as binfmt interpreter for mips64
Setting /usr/bin/qemu-mips64el-static as binfmt interpreter for mips64el
Setting /usr/bin/qemu-sh4-static as binfmt interpreter for sh4
Setting /usr/bin/qemu-sh4eb-static as binfmt interpreter for sh4eb
Setting /usr/bin/qemu-s390x-static as binfmt interpreter for s390x
Setting /usr/bin/qemu-aarch64-static as binfmt interpreter for aarch64
Setting /usr/bin/qemu-aarch64_be-static as binfmt interpreter for aarch64_be
Setting /usr/bin/qemu-hppa-static as binfmt interpreter for hppa
Setting /usr/bin/qemu-riscv32-static as binfmt interpreter for riscv32
Setting /usr/bin/qemu-riscv64-static as binfmt interpreter for riscv64
Setting /usr/bin/qemu-xtensa-static as binfmt interpreter for xtensa
Setting /usr/bin/qemu-xtensaeb-static as binfmt interpreter for xtensaeb
Setting /usr/bin/qemu-microblaze-static as binfmt interpreter for microblaze
Setting /usr/bin/qemu-microblazeel-static as binfmt interpreter for microblazeel
Setting /usr/bin/qemu-or1k-static as binfmt interpreter for or1k
Setting /usr/bin/qemu-hexagon-static as binfmt interpreter for hexagon
  1. 下载特定架构的docker容器
    比如,下载ubuntu 20.04/22.04的arm或aarch64容器的命令如下:
docker pull --platform arm ubuntu:20.04
docker pull --platform arm64 ubuntu:20.04
docker pull --platform arm ubuntu:22.04
docker pull --platform arm64 ubuntu:22.04
  1. 启动相应的docker容器
    相应的命令如下:
docker run -t --rm --platform arm64 \
		-v $(pwd)/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \
		ubuntu:20.04 uname -m
				
docker run -t --rm --platform arm \
		-v $(pwd)/qemu-arm-static:/usr/bin/qemu-arm-static \
		ubuntu:20.04 uname -m

命令有两个关键点:

  • 指定CPU架构为arm或aarch64
  • 将外部的qemu-arm-static挂载为容器中的/usr/bin/qemu-arm-static,或
  • 将外部的qemu-aarch64-static挂载为容器中的/usr/bin/qemu-aarch64-static。

外部qemu-arm-static或qemu-aarch64-static所在路径是当前路径(所以,使用$(pwd))
带是--rm参数是因为我们仅仅验证一下相应的容器能否启动正常。
正常情况下,aarch64的容器会输出:

aarch64

arm的容器会输出:

armv7l
  1. 验证通过后,我们就可以基于以上工作在容器中下载相应arm/aarch64编译器,做“本地”编译了。

标签:PC机,bin,aarch64,static,usr,interpreter,docker,qemu
From: https://www.cnblogs.com/eaglexmw/p/18432747

相关文章

  • static 静态
    1.被static修饰的成员,称之为类成员,在对象创建之前就存在于方法区中静态区2.被static修饰的成员,可以通过类名直接访问使用,非静态的成员必须要通过对象去调用3.static可以修饰成员变量和成员方法4.非静态的成员方法既可以访问静态的成员[变量或方法],也可......
  • Windows 10 on ARM, version 22H2 (updated Sep 2024) ARM64 AArch64 中文版、英文版
    Windows10onARM,version22H2(updatedSep2024)ARM64AArch64中文版、英文版下载基于ARM的Windows10请访问原文链接:https://sysin.org/blog/windows-10-arm/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows10,version22H2(releasedNov2021)......
  • java_day6_this关键字、构造方法、static关键字、工具类、文档注释
    一、this关键字this代表的是调用该方法的当前对象【谁调用了该方法,this就代表那个对象】this:代表的是调用当前方法的对象this可以使用对象中的成员变量,成员方法,构造方法变量查找规则:就近原则先在方法中查找变量,若找到就使用若方法中没有该变量,去成......
  • NoStaticDemo
    packagecom.shrimpking.t5;importjava.sql.SQLOutput;/***CreatedbyIntelliJIDEA.**@Author:Shrimpking*@create2024/9/1520:39*/classPerson{Stringname;Stringnation;intage;publicPerson(Stringname,Stringnation,......
  • WPF DataGrid ItemsSource StaticResource
    //xaml<Windowx:Class="WpfApp386.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mi......
  • static 修饰局部变量和全局变量的区别
    static静态全局静态用来修饰变量的static修饰全局变量,修改的是该全局变量的属性(【外部链接】变成【内部链接】)static修饰局部变量,修改的是局部变量的时候,修改的是存储位置(【栈存储区】变成【静态存储区】)用法:修饰局部变量static修饰局部变量的时候,局部变量出......
  • C++ 定义静态成员 static 关键字不能在定义出重复出现
    定义静态成员和其他的成员函数一样,我们既可以在类的内部也可以在类的外部定义静态成员函数。当在类的外部定义静态成员时,不能重复static关键字,该关键字只出现在类内部的声明语句:voidAccount::rate(doublenewRate){interestRate=newRate;}Note:和类的所有成员一样,当我......
  • Xen on qemu for arm64: 由qemu-system-aarch64导致的kernel-panic
    背景描述:    我在A平台利用qemu实现了xen中dom0的运行,将其移植到B平台运行,dom0的复现遭遇了kernel-panic,在虚拟设备的添加时异常。一、将运行dom0所需要的可执行文件拷贝到同一个目录        可执行文件的来源参考XenOnQemuforarm64_qemuxen-CSDN博客......
  • C++:初始化列表、友元、static
    目录一、初始化列表​二、static成员三、友元函数一、初始化列表•之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方 式,就是初始化列表,初始化列表的使用方式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后......
  • Java入门:08.Java中的static关键字01
    1static关键字可以修饰属性变量,方法和代码段static修饰的属性称为静态属性或类属性,在类加载时就在方法区为属性开辟存储空间,无论创建多少个对象,静态属性在内存中只有一份。可以使用类名.静态属性的方式引用static修饰的方法称为静态方法或类方法,在类加载时就在方法......